assert(cond->lock != NULL);
#endif
- return pthread_cond_wait(&(cond->condition), &(cond->lock->mutex)) == 0 ? EINA_TRUE : EINA_FALSE;
+ return pthread_cond_wait(&(cond->condition),
+ &(cond->lock->mutex)) == 0 ? EINA_TRUE : EINA_FALSE;
+}
+
+static inline Eina_Bool
+eina_condition_timedwait(Eina_Condition *cond, double t)
+{
+ struct timespec tv;
+
+#ifdef EINA_HAVE_DEBUG_THREADS
+ assert(_eina_threads_activated);
+ assert(cond->lock != NULL);
+#endif
+
+ tv.tv_sec = t;
+ tv.tv_nsec = (t - (double) tv.tv_sec) * 1000000000;
+
+ return pthread_cond_timedwait(&(cond->condition),
+ &(cond->lock->mutex),
+ &tv) == 0 ?
+ EINA_TRUE : EINA_FALSE;
}
static inline Eina_Bool
}
static inline Eina_Bool
-eina_condition_wait(Eina_Condition *cond)
+_eina_condition_internal_timedwait(Eina_Condition *cond, DWORD t)
{
#if _WIN32_WINNT >= 0x0600
SleepConditionVariableCS(&cond->condition, cond->mutex, INFINITE);
* semaphore until <pthread_cond_signal> or <pthread_cond_broadcast>
* are called by another thread.
*/
- ret = SignalObjectAndWait(cond->mutex, cond->semaphore, INFINITE, FALSE);
+ ret = SignalObjectAndWait(cond->mutex, cond->semaphore, t, FALSE);
if (ret == WAIT_FAILED)
return EINA_FALSE;
* This call atomically signals the <waiters_done_> event and waits until
* it can acquire the <external_mutex>. This is required to ensure fairness.
*/
- ret = SignalObjectAndWait(cond->waiters_done, cond->mutex, INFINITE, FALSE);
+ ret = SignalObjectAndWait(cond->waiters_done, cond->mutex, t, FALSE);
if (ret == WAIT_FAILED)
return EINA_FALSE;
}
* Always regain the external mutex since that's the guarantee we
* give to our callers.
*/
- ret = WaitForSingleObject(cond->mutex, INFINITE);
+ ret = WaitForSingleObject(cond->mutex, t);
if (ret == WAIT_FAILED)
return EINA_FALSE;
}
}
static inline Eina_Bool
+eina_condition_timedwait(Eina_Condition *cond, double val)
+{
+ _eina_condition_internal_timedwait(cond, val * 1000);
+}
+
+static inline Eina_Bool
+eina_condition_wait(Eina_Condition *cond)
+{
+ _eina_condition_internal_timedwait(cond, INFINITE);
+}
+
+static inline Eina_Bool
eina_condition_broadcast(Eina_Condition *cond)
{
#if _WIN32_WINNT >= 0x0600
static inline Eina_Bool eina_condition_new(Eina_Condition *cond, Eina_Lock *mutex);
static inline void eina_condition_free(Eina_Condition *cond);
static inline Eina_Bool eina_condition_wait(Eina_Condition *cond);
+static inline Eina_Bool eina_condition_timedwait(Eina_Condition *cond, double t);
static inline Eina_Bool eina_condition_broadcast(Eina_Condition *cond);
static inline Eina_Bool eina_condition_signal(Eina_Condition *cond);