From 0e8d1c8485a572b4070e7bacd1b4e7e6ddb1b8f2 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Tue, 9 Jun 2015 19:36:59 +0900 Subject: [PATCH] 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. --- src/lib/eina/eina_inline_lock_posix.x | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/lib/eina/eina_inline_lock_posix.x b/src/lib/eina/eina_inline_lock_posix.x index 6abbace0d1..b1718a8853 100644 --- a/src/lib/eina/eina_inline_lock_posix.x +++ b/src/lib/eina/eina_inline_lock_posix.x @@ -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