Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(71)

Side by Side Diff: src/platform.h

Issue 23748003: Cleanup Semaphore class. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Build fix for Mac OS X. Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/optimizing-compiler-thread.cc ('k') | src/platform-cygwin.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 29 matching lines...) Expand all
40 // slower. It would require factory methods for selecting the right 40 // slower. It would require factory methods for selecting the right
41 // implementation and the overhead of virtual methods for performance 41 // implementation and the overhead of virtual methods for performance
42 // sensitive like mutex locking/unlocking. 42 // sensitive like mutex locking/unlocking.
43 43
44 #ifndef V8_PLATFORM_H_ 44 #ifndef V8_PLATFORM_H_
45 #define V8_PLATFORM_H_ 45 #define V8_PLATFORM_H_
46 46
47 #include <cstdarg> 47 #include <cstdarg>
48 48
49 #include "platform/mutex.h" 49 #include "platform/mutex.h"
50 #include "platform/semaphore.h"
50 #include "utils.h" 51 #include "utils.h"
51 #include "v8globals.h" 52 #include "v8globals.h"
52 53
53 #ifdef __sun 54 #ifdef __sun
54 # ifndef signbit 55 # ifndef signbit
55 namespace std { 56 namespace std {
56 int signbit(double x); 57 int signbit(double x);
57 } 58 }
58 # endif 59 # endif
59 #endif 60 #endif
(...skipping 26 matching lines...) Expand all
86 #endif // V8_CC_MSVC 87 #endif // V8_CC_MSVC
87 88
88 // Random is missing on both Visual Studio and MinGW. 89 // Random is missing on both Visual Studio and MinGW.
89 #if V8_CC_MSVC || V8_CC_MINGW 90 #if V8_CC_MSVC || V8_CC_MINGW
90 int random(); 91 int random();
91 #endif // V8_CC_MSVC || V8_CC_MINGW 92 #endif // V8_CC_MSVC || V8_CC_MINGW
92 93
93 namespace v8 { 94 namespace v8 {
94 namespace internal { 95 namespace internal {
95 96
96 class Semaphore;
97
98 double ceiling(double x); 97 double ceiling(double x);
99 double modulo(double x, double y); 98 double modulo(double x, double y);
100 99
101 // Custom implementation of math functions. 100 // Custom implementation of math functions.
102 double fast_sin(double input); 101 double fast_sin(double input);
103 double fast_cos(double input); 102 double fast_cos(double input);
104 double fast_tan(double input); 103 double fast_tan(double input);
105 double fast_log(double input); 104 double fast_log(double input);
106 double fast_exp(double input); 105 double fast_exp(double input);
107 double fast_sqrt(double input); 106 double fast_sqrt(double input);
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 static const int kStackWalkError = -1; 280 static const int kStackWalkError = -1;
282 static const int kStackWalkMaxNameLen = 256; 281 static const int kStackWalkMaxNameLen = 256;
283 static const int kStackWalkMaxTextLen = 256; 282 static const int kStackWalkMaxTextLen = 256;
284 struct StackFrame { 283 struct StackFrame {
285 void* address; 284 void* address;
286 char text[kStackWalkMaxTextLen]; 285 char text[kStackWalkMaxTextLen];
287 }; 286 };
288 287
289 static int StackWalk(Vector<StackFrame> frames); 288 static int StackWalk(Vector<StackFrame> frames);
290 289
291 // Factory method for creating platform dependent Semaphore.
292 // Please use delete to reclaim the storage for the returned Semaphore.
293 static Semaphore* CreateSemaphore(int count);
294
295 // Factory method for creating platform dependent Socket. 290 // Factory method for creating platform dependent Socket.
296 // Please use delete to reclaim the storage for the returned Socket. 291 // Please use delete to reclaim the storage for the returned Socket.
297 static Socket* CreateSocket(); 292 static Socket* CreateSocket();
298 293
299 class MemoryMappedFile { 294 class MemoryMappedFile {
300 public: 295 public:
301 static MemoryMappedFile* open(const char* name); 296 static MemoryMappedFile* open(const char* name);
302 static MemoryMappedFile* create(const char* name, int size, void* initial); 297 static MemoryMappedFile* create(const char* name, int size, void* initial);
303 virtual ~MemoryMappedFile() { } 298 virtual ~MemoryMappedFile() { }
304 virtual void* memory() = 0; 299 virtual void* memory() = 0;
(...skipping 198 matching lines...) Expand 10 before | Expand all | Expand 10 after
503 // Otherwise returns false. 498 // Otherwise returns false.
504 static bool HasLazyCommits(); 499 static bool HasLazyCommits();
505 500
506 private: 501 private:
507 void* address_; // Start address of the virtual memory. 502 void* address_; // Start address of the virtual memory.
508 size_t size_; // Size of the virtual memory. 503 size_t size_; // Size of the virtual memory.
509 }; 504 };
510 505
511 506
512 // ---------------------------------------------------------------------------- 507 // ----------------------------------------------------------------------------
513 // Semaphore
514 //
515 // A semaphore object is a synchronization object that maintains a count. The
516 // count is decremented each time a thread completes a wait for the semaphore
517 // object and incremented each time a thread signals the semaphore. When the
518 // count reaches zero, threads waiting for the semaphore blocks until the
519 // count becomes non-zero.
520
521 class Semaphore {
522 public:
523 virtual ~Semaphore() {}
524
525 // Suspends the calling thread until the semaphore counter is non zero
526 // and then decrements the semaphore counter.
527 virtual void Wait() = 0;
528
529 // Suspends the calling thread until the counter is non zero or the timeout
530 // time has passed. If timeout happens the return value is false and the
531 // counter is unchanged. Otherwise the semaphore counter is decremented and
532 // true is returned. The timeout value is specified in microseconds.
533 virtual bool Wait(int timeout) = 0;
534
535 // Increments the semaphore counter.
536 virtual void Signal() = 0;
537 };
538
539 template <int InitialValue>
540 struct CreateSemaphoreTrait {
541 static Semaphore* Create() {
542 return OS::CreateSemaphore(InitialValue);
543 }
544 };
545
546 // POD Semaphore initialized lazily (i.e. the first time Pointer() is called).
547 // Usage:
548 // // The following semaphore starts at 0.
549 // static LazySemaphore<0>::type my_semaphore = LAZY_SEMAPHORE_INITIALIZER;
550 //
551 // void my_function() {
552 // // Do something with my_semaphore.Pointer().
553 // }
554 //
555 template <int InitialValue>
556 struct LazySemaphore {
557 typedef typename LazyDynamicInstance<
558 Semaphore, CreateSemaphoreTrait<InitialValue>,
559 ThreadSafeInitOnceTrait>::type type;
560 };
561
562 #define LAZY_SEMAPHORE_INITIALIZER LAZY_DYNAMIC_INSTANCE_INITIALIZER
563
564
565 // ----------------------------------------------------------------------------
566 // Thread 508 // Thread
567 // 509 //
568 // Thread objects are used for creating and running threads. When the start() 510 // Thread objects are used for creating and running threads. When the start()
569 // method is called the new thread starts running the run() method in the new 511 // method is called the new thread starts running the run() method in the new
570 // thread. The Thread object should not be deallocated before the thread has 512 // thread. The Thread object should not be deallocated before the thread has
571 // terminated. 513 // terminated.
572 514
573 class Thread { 515 class Thread {
574 public: 516 public:
575 // Opaque data type for thread-local storage keys. 517 // Opaque data type for thread-local storage keys.
(...skipping 21 matching lines...) Expand all
597 539
598 // Create new thread. 540 // Create new thread.
599 explicit Thread(const Options& options); 541 explicit Thread(const Options& options);
600 virtual ~Thread(); 542 virtual ~Thread();
601 543
602 // Start new thread by calling the Run() method on the new thread. 544 // Start new thread by calling the Run() method on the new thread.
603 void Start(); 545 void Start();
604 546
605 // Start new thread and wait until Run() method is called on the new thread. 547 // Start new thread and wait until Run() method is called on the new thread.
606 void StartSynchronously() { 548 void StartSynchronously() {
607 start_semaphore_ = OS::CreateSemaphore(0); 549 start_semaphore_ = new Semaphore(0);
608 Start(); 550 Start();
609 start_semaphore_->Wait(); 551 start_semaphore_->Wait();
610 delete start_semaphore_; 552 delete start_semaphore_;
611 start_semaphore_ = NULL; 553 start_semaphore_ = NULL;
612 } 554 }
613 555
614 // Wait until thread terminates. 556 // Wait until thread terminates.
615 void Join(); 557 void Join();
616 558
617 inline const char* name() const { 559 inline const char* name() const {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 static uint16_t HToN(uint16_t value); 656 static uint16_t HToN(uint16_t value);
715 static uint16_t NToH(uint16_t value); 657 static uint16_t NToH(uint16_t value);
716 static uint32_t HToN(uint32_t value); 658 static uint32_t HToN(uint32_t value);
717 static uint32_t NToH(uint32_t value); 659 static uint32_t NToH(uint32_t value);
718 }; 660 };
719 661
720 662
721 } } // namespace v8::internal 663 } } // namespace v8::internal
722 664
723 #endif // V8_PLATFORM_H_ 665 #endif // V8_PLATFORM_H_
OLDNEW
« no previous file with comments | « src/optimizing-compiler-thread.cc ('k') | src/platform-cygwin.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698