about summary refs log tree commit diff
path: root/src/rt/sync/condition_variable.cpp
diff options
context:
space:
mode:
authorMichael Bebenita <mbebenita@mozilla.com>2010-08-09 07:04:38 -0700
committerMichael Bebenita <mbebenita@mozilla.com>2010-08-09 07:04:38 -0700
commitd2c2fbe7ca25affb69715a39922a91875eaad9c7 (patch)
treef9e987106358b83d06ddc00c6f8c2a459e67885a /src/rt/sync/condition_variable.cpp
parent8395d46163a056f7b48f50d979004786d6282fe0 (diff)
Added timed_wait to condition variables.
Diffstat (limited to 'src/rt/sync/condition_variable.cpp')
-rw-r--r--src/rt/sync/condition_variable.cpp28
1 files changed, 23 insertions, 5 deletions
diff --git a/src/rt/sync/condition_variable.cpp b/src/rt/sync/condition_variable.cpp
index d403257243d..c34ab7f42aa 100644
--- a/src/rt/sync/condition_variable.cpp
+++ b/src/rt/sync/condition_variable.cpp
@@ -9,14 +9,16 @@
 
 // #define TRACE
 
-condition_variable::condition_variable() {
 #if defined(__WIN32__)
+condition_variable::condition_variable() {
     _event = CreateEvent(NULL, FALSE, FALSE, NULL);
+}
 #else
+condition_variable::condition_variable() {
     pthread_cond_init(&_cond, NULL);
     pthread_mutex_init(&_mutex, NULL);
-#endif
 }
+#endif
 
 condition_variable::~condition_variable() {
 #if defined(__WIN32__)
@@ -31,15 +33,31 @@ condition_variable::~condition_variable() {
  * Wait indefinitely until condition is signaled.
  */
 void condition_variable::wait() {
+    timed_wait(0);
+}
+
+void condition_variable::timed_wait(size_t timeout_in_ns) {
 #ifdef TRACE
-    printf("waiting on condition_variable: 0x%" PRIxPTR "\n",
-           (uintptr_t)this);
+    printf("waiting on condition_variable: 0x%" PRIxPTR " for %d ns. \n",
+           (uintptr_t) this, (int) timeout_in_ns);
 #endif
 #if defined(__WIN32__)
     WaitForSingleObject(_event, INFINITE);
 #else
     pthread_mutex_lock(&_mutex);
-    pthread_cond_wait(&_cond, &_mutex);
+    // wait() automatically releases the mutex while it waits, and acquires
+    // it right before exiting. This allows signal() to acquire the mutex
+    // when signaling.)
+    if (timeout_in_ns == 0) {
+        pthread_cond_wait(&_cond, &_mutex);
+    } else {
+        timeval time_val;
+        gettimeofday(&time_val, NULL);
+        timespec time_spec;
+        time_spec.tv_sec = time_val.tv_sec + 0;
+        time_spec.tv_nsec = time_val.tv_usec * 1000 + timeout_in_ns;
+        pthread_cond_timedwait(&_cond, &_mutex, &time_spec);
+    }
     pthread_mutex_unlock(&_mutex);
 #endif
 #ifdef TRACE