eina semaphore lock - don't wake up because of signals
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Tue, 9 Jun 2015 10:36:59 +0000 (19:36 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Tue, 9 Jun 2015 10:39:01 +0000 (19:39 +0900)
@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

index 6abbace..b1718a8 100644 (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