From 023257499a4965d3de7e2a0b0bf4fc0efb435537 Mon Sep 17 00:00:00 2001 From: cedric Date: Mon, 9 May 2011 10:32:56 +0000 Subject: [PATCH] eina: add Eina_Condition. git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/eina@59287 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/include/eina_inline_lock_posix.x | 66 +++++++++++++++++++++++++++++++++++- src/include/eina_lock.h | 6 ++++ 2 files changed, 71 insertions(+), 1 deletion(-) diff --git a/src/include/eina_inline_lock_posix.x b/src/include/eina_inline_lock_posix.x index 96a8cfd..68a26b3 100644 --- a/src/include/eina_inline_lock_posix.x +++ b/src/include/eina_inline_lock_posix.x @@ -40,13 +40,14 @@ typedef void (*Eina_Lock_Bt_Func) (); #endif typedef struct _Eina_Lock Eina_Lock; +typedef struct _Eina_Condition Eina_Condition; struct _Eina_Lock { #ifdef EINA_HAVE_DEBUG_THREADS EINA_INLIST; #endif - pthread_mutex_t mutex; + pthread_mutex_t mutex; #ifdef EINA_HAVE_DEBUG_THREADS pthread_t lock_thread_id; Eina_Lock_Bt_Func lock_bt[EINA_LOCK_DEBUG_BT_NUM]; @@ -55,6 +56,12 @@ struct _Eina_Lock #endif }; +struct _Eina_Condition +{ + Eina_Lock *lock; + pthread_cond_t condition; +}; + EAPI extern Eina_Bool _eina_threads_activated; #ifdef EINA_HAVE_DEBUG_THREADS @@ -256,4 +263,61 @@ eina_lock_debug(const Eina_Lock *mutex) #endif } +static inline Eina_Bool +eina_condition_new(Eina_Condition *cond, Eina_Lock *mutex) +{ +#ifdef EINA_HAVE_DEBUG_THREADS + assert(pthread_equal(_eina_main_loop, pthread_self())); + memset(cond, 0, sizeof (Eina_Condition)); +#endif + + cond->lock = mutex; + if (pthread_cond_init(&cond->condition, NULL) != 0) + { +#ifdef EINA_HAVE_DEBUG_THREADS + if (errno == EBUSY) + printf("eina_condition_new on already initialized Eina_Condition\n"); +#endif + return EINA_FALSE; + } + + return EINA_TRUE; +} + +static inline void +eina_condition_free(Eina_Condition *cond) +{ +#ifdef EINA_HAVE_DEBUG_THREADS + assert(pthread_equal(_eina_main_loop, pthread_self())); +#endif + + pthread_cond_destroy(&(cond->condition)); +#ifdef EINA_HAVE_DEBUG_THREADS + memset(cond, 0, sizeof (Eina_Condition)); +#endif +} + +static inline Eina_Bool +eina_condition_wait(Eina_Condition *cond) +{ +#ifdef EINA_HAVE_DEBUG_THREADS + assert(_eina_threads_activated); +#endif + + return pthread_cond_wait(&(cond->condition), &(cond->lock->mutex)) == 0 ? EINA_TRUE : EINA_FALSE; +} + +static inline Eina_Bool +eina_condition_broadcast(Eina_Condition *cond) +{ + return pthread_cond_broadcast(&(cond->condition)) == 0 ? EINA_TRUE : EINA_FALSE; +} + +static inline Eina_Bool +eina_condition_signal(Eina_Condition *cond) +{ + return pthread_cond_signal(&(cond->condition)) == 0 ? EINA_TRUE : EINA_FALSE; +} + + #endif diff --git a/src/include/eina_lock.h b/src/include/eina_lock.h index 9b55e78..c6f6c74 100644 --- a/src/include/eina_lock.h +++ b/src/include/eina_lock.h @@ -60,6 +60,12 @@ static inline Eina_Lock_Result eina_lock_take_try(Eina_Lock *mutex); static inline Eina_Lock_Result eina_lock_release(Eina_Lock *mutex); static inline void eina_lock_debug(const Eina_Lock *mutex); +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_broadcast(Eina_Condition *cond); +static inline Eina_Bool eina_condition_signal(Eina_Condition *cond); + /** * @} */ -- 2.7.4