eina: add Eina_Condition.

SVN revision: 59287
This commit is contained in:
Cedric BAIL 2011-05-09 10:32:56 +00:00
parent 83c3a1a0fb
commit d20144bc9f
2 changed files with 71 additions and 1 deletions

View File

@ -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

View File

@ -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);
/**
* @}
*/