Index: src/platform-posix.cc |
diff --git a/src/platform-posix.cc b/src/platform-posix.cc |
index 9ed02cfdb5542f12fe2e1b9ec565c52d3d0e8f2e..bd8a33fabd13e2ec5d65be929e3c4b1fcd5e5a20 100644 |
--- a/src/platform-posix.cc |
+++ b/src/platform-posix.cc |
@@ -31,6 +31,8 @@ |
#include "platform-posix.h" |
+#include <pthread.h> |
+#include <sched.h> // for sched_yield |
#include <unistd.h> |
#include <errno.h> |
#include <time.h> |
@@ -399,6 +401,57 @@ void OS::StrNCpy(Vector<char> dest, const char* src, size_t n) { |
// ---------------------------------------------------------------------------- |
+// POSIX thread support. |
+// |
+ |
+void Thread::YieldCPU() { |
+ sched_yield(); |
+} |
+ |
+ |
+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. |
// |