eina: fix Eina_Barrier when pthread doesn't provide one.

Patch by Ulisses Furquim <ulisses@profusion.mobi>


SVN revision: 80907
This commit is contained in:
Cedric BAIL 2012-12-14 02:18:02 +00:00
parent 9a22dfe79c
commit 498b46802c
1 changed files with 3 additions and 6 deletions

View File

@ -3,7 +3,7 @@ typedef struct _Eina_Barrier Eina_Barrier;
struct _Eina_Barrier
{
int needed, called;
Eina_Lock lock, cond_lock;
Eina_Lock cond_lock;
Eina_Condition cond;
};
@ -12,8 +12,6 @@ eina_barrier_new(Eina_Barrier *barrier, int needed)
{
barrier->needed = needed;
barrier->called = 0;
if (!eina_lock_new(&(barrier->lock)))
return EINA_FALSE;
if (!eina_lock_new(&(barrier->cond_lock)))
return EINA_FALSE;
if (!eina_condition_new(&(barrier->cond), &(barrier->cond_lock)))
@ -26,7 +24,6 @@ eina_barrier_free(Eina_Barrier *barrier)
{
eina_condition_free(&(barrier->cond));
eina_lock_free(&(barrier->cond_lock));
eina_lock_free(&(barrier->lock));
barrier->needed = 0;
barrier->called = 0;
}
@ -34,7 +31,7 @@ eina_barrier_free(Eina_Barrier *barrier)
static inline Eina_Bool
eina_barrier_wait(Eina_Barrier *barrier)
{
eina_lock_take(&(barrier->lock));
eina_lock_take(&(barrier->cond_lock));
barrier->called++;
if (barrier->called == barrier->needed)
{
@ -43,6 +40,6 @@ eina_barrier_wait(Eina_Barrier *barrier)
}
else
eina_condition_wait(&(barrier->cond));
eina_lock_release(&(barrier->lock));
eina_lock_release(&(barrier->cond_lock));
return EINA_TRUE;
}