eina: correctly track lock when waiting for condition.
SVN revision: 63566
This commit is contained in:
parent
f749139212
commit
9101e46ae6
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue