eina: correctly track lock when waiting for condition.

SVN revision: 63566
This commit is contained in:
Cedric BAIL 2011-09-23 13:17:12 +00:00
parent f749139212
commit 9101e46ae6
1 changed files with 36 additions and 5 deletions

View File

@ -320,32 +320,63 @@ eina_condition_free(Eina_Condition *cond)
static inline Eina_Bool static inline Eina_Bool
eina_condition_wait(Eina_Condition *cond) eina_condition_wait(Eina_Condition *cond)
{ {
Eina_Bool r;
#ifdef EINA_HAVE_DEBUG_THREADS #ifdef EINA_HAVE_DEBUG_THREADS
assert(_eina_threads_activated); assert(_eina_threads_activated);
assert(cond->lock != NULL); assert(cond->lock != NULL);
pthread_mutex_lock(&_eina_tracking_lock);
_eina_tracking = eina_inlist_remove(_eina_tracking,
EINA_INLIST_GET(cond->lock));
pthread_mutex_unlock(&_eina_tracking_lock);
#endif #endif
return pthread_cond_wait(&(cond->condition), r = pthread_cond_wait(&(cond->condition),
&(cond->lock->mutex)) == 0 ? EINA_TRUE : EINA_FALSE; &(cond->lock->mutex)) == 0 ? EINA_TRUE : EINA_FALSE;
#ifdef EINA_HAVE_DEBUG_THREADS
pthread_mutex_lock(&_eina_tracking_lock);
_eina_tracking = eina_inlist_append(_eina_tracking,
EINA_INLIST_GET(cond->lock));
pthread_mutex_unlock(&_eina_tracking_lock);
#endif
return r;
} }
static inline Eina_Bool static inline Eina_Bool
eina_condition_timedwait(Eina_Condition *cond, double t) eina_condition_timedwait(Eina_Condition *cond, double t)
{ {
struct timespec tv; struct timespec tv;
Eina_Bool r;
#ifdef EINA_HAVE_DEBUG_THREADS #ifdef EINA_HAVE_DEBUG_THREADS
assert(_eina_threads_activated); assert(_eina_threads_activated);
assert(cond->lock != NULL); assert(cond->lock != NULL);
pthread_mutex_lock(&_eina_tracking_lock);
_eina_tracking = eina_inlist_remove(_eina_tracking,
EINA_INLIST_GET(cond->lock));
pthread_mutex_unlock(&_eina_tracking_lock);
#endif #endif
tv.tv_sec = t; tv.tv_sec = t;
tv.tv_nsec = (t - (double) tv.tv_sec) * 1000000000; tv.tv_nsec = (t - (double) tv.tv_sec) * 1000000000;
return pthread_cond_timedwait(&(cond->condition), r = pthread_cond_timedwait(&(cond->condition),
&(cond->lock->mutex), &(cond->lock->mutex),
&tv) == 0 ? &tv) == 0 ?
EINA_TRUE : EINA_FALSE; EINA_TRUE : EINA_FALSE;
#ifdef EINA_HAVE_DEBUG_THREADS
pthread_mutex_lock(&_eina_tracking_lock);
_eina_tracking = eina_inlist_append(_eina_tracking,
EINA_INLIST_GET(cond->lock));
pthread_mutex_unlock(&_eina_tracking_lock);
#endif
return r;
} }
static inline Eina_Bool static inline Eina_Bool