eina semaphore lock - don't wake up because of signals

@fix - this fixes eina sephamore lock/wait to not return just because
of a signal sent to the process - try again if the semaphore wait is
interrupted by a signal as opposed to a semaphore wakeup.
This commit is contained in:
Carsten Haitzler 2015-06-09 19:36:59 +09:00
parent f153cad879
commit 0e8d1c8485
1 changed files with 19 additions and 2 deletions

View File

@ -784,14 +784,31 @@ eina_semaphore_free(Eina_Semaphore *sem)
static inline Eina_Bool
eina_semaphore_lock(Eina_Semaphore *sem)
{
Eina_Bool ok = EINA_FALSE;
if (!sem)
return EINA_FALSE;
for (;;)
{
if (
#if defined(EINA_HAVE_OSX_SEMAPHORE)
return (sem_wait(sem->sema) == 0) ? EINA_TRUE : EINA_FALSE;
sem_wait(sem->sema)
#else
return (sem_wait(sem) == 0) ? EINA_TRUE : EINA_FALSE;
sem_wait(sem)
#endif
== 0)
{
ok = EINA_TRUE;
break;
}
else
{
if (errno != EINTR)
break;
}
}
return ok;
}
static inline Eina_Bool