static void test_cond_wait (void) { int64_t start, duration_usec; mongoc_mutex_t mutex; mongoc_cond_t cond; mongoc_mutex_init (&mutex); mongoc_cond_init (&cond); mongoc_mutex_lock (&mutex); start = bson_get_monotonic_time (); mongoc_cond_timedwait (&cond, &mutex, 100); duration_usec = bson_get_monotonic_time () - start; mongoc_mutex_unlock (&mutex); if (!((50 * 1000 < duration_usec) && (150 * 1000 > duration_usec))) { fprintf ( stderr, "expected to wait 100ms, waited %" PRId64 "\n", duration_usec); } mongoc_cond_destroy (&cond); mongoc_mutex_destroy (&mutex); }
bool future_wait (future_t *future) { int64_t deadline = bson_get_monotonic_time () + get_future_timeout_ms (); bool resolved; mongoc_mutex_lock (&future->mutex); while (!future->resolved && bson_get_monotonic_time () <= deadline) { mongoc_cond_timedwait (&future->cond, &future->mutex, get_future_timeout_ms ()); } resolved = future->resolved; mongoc_mutex_unlock (&future->mutex); if (resolved) { future->awaited = true; /* free memory */ mongoc_thread_join (future->thread); } return resolved; }