Index: src/platform-posix.cc |
diff --git a/src/platform-posix.cc b/src/platform-posix.cc |
index 31fc7a6c3fac381deed8d1042ac5d776bc9ce66e..13b819bd1e79c1452979961fd082c2af73171e56 100644 |
--- a/src/platform-posix.cc |
+++ b/src/platform-posix.cc |
@@ -756,6 +756,48 @@ void Thread::SetThreadLocal(LocalStorageKey key, void* value) { |
} |
+class POSIXMutex : public Mutex { |
+ public: |
+ POSIXMutex() { |
+ pthread_mutexattr_t attr; |
+ memset(&attr, 0, sizeof(attr)); |
+ int result = pthread_mutexattr_init(&attr); |
+ ASSERT(result == 0); |
+ result = pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); |
+ ASSERT(result == 0); |
+ result = pthread_mutex_init(&mutex_, &attr); |
+ ASSERT(result == 0); |
+ result = pthread_mutexattr_destroy(&attr); |
+ ASSERT(result == 0); |
+ USE(result); |
+ } |
+ |
+ virtual ~POSIXMutex() { pthread_mutex_destroy(&mutex_); } |
+ |
+ virtual int Lock() { return pthread_mutex_lock(&mutex_); } |
+ |
+ virtual int Unlock() { return pthread_mutex_unlock(&mutex_); } |
+ |
+ virtual bool TryLock() { |
+ int result = pthread_mutex_trylock(&mutex_); |
+ // Return false if the lock is busy and locking failed. |
+ if (result == EBUSY) { |
+ return false; |
+ } |
+ ASSERT(result == 0); // Verify no other errors. |
+ return true; |
+ } |
+ |
+ private: |
+ pthread_mutex_t mutex_; // Pthread mutex for POSIX platforms. |
+}; |
+ |
+ |
+Mutex* OS::CreateMutex() { |
+ return new POSIXMutex(); |
+} |
+ |
+ |
// ---------------------------------------------------------------------------- |
// POSIX socket support. |
// |