diff --git a/package.xml b/package.xml index 34bec90..65ea733 100644 --- a/package.xml +++ b/package.xml @@ -10,10 +10,10 @@ cubic@php.net yes - 2016-11-26 - + 2017-02-20 + - 1.1.0 + 1.1.1 1.1.0 @@ -22,12 +22,7 @@ MIT License -- Added cross-platform named shared memory objects. -- Rewrote *NIX objects to be much lighter on shared resources. -- Fixed null name issue. -- Fixed object memory leak issue. -- Now works on Mac OSX. -- Now works on PHP 7. The same code base also works on PHP 5. +- Fixed *NIX event object sync_WaitForUnixEvent() issues. diff --git a/sync.c b/sync.c index a8b6421..a9157fb 100644 --- a/sync.c +++ b/sync.c @@ -550,7 +550,7 @@ int sync_WaitForUnixEvent(sync_UnixEventWrapper *UnixEvent, uint32_t Wait) int Result = 0; /* Avoid a potential starvation issue by only allowing signaled manual events OR if there are no other waiting threads. */ - if (UnixEvent->MxSignaled[0] != '\x00' && (UnixEvent->MxManual[0] == '\x00' || !UnixEvent->MxWaiting[0])) + if (UnixEvent->MxSignaled[0] != '\x00' && (UnixEvent->MxManual[0] != '\x00' || !UnixEvent->MxWaiting[0])) { /* Reset auto events. */ if (UnixEvent->MxManual[0] == '\x00') UnixEvent->MxSignaled[0] = '\x00'; @@ -568,10 +568,10 @@ int sync_WaitForUnixEvent(sync_UnixEventWrapper *UnixEvent, uint32_t Wait) if (Result2 != 0) break; } while (UnixEvent->MxSignaled[0] == '\x00'); + UnixEvent->MxWaiting[0]--; + if (Result2 == 0) { - UnixEvent->MxWaiting[0]--; - /* Reset auto events. */ if (UnixEvent->MxManual[0] == '\x00') UnixEvent->MxSignaled[0] = '\x00'; @@ -584,16 +584,22 @@ int sync_WaitForUnixEvent(sync_UnixEventWrapper *UnixEvent, uint32_t Wait) } else { - UnixEvent->MxWaiting[0]++; - struct timespec TempTime; - if (sync_CSGX__ClockGetTimeRealtime(&TempTime) == -1) return 0; + if (sync_CSGX__ClockGetTimeRealtime(&TempTime) == -1) + { + pthread_mutex_unlock(UnixEvent->MxMutex); + + return 0; + } + TempTime.tv_sec += Wait / 1000; TempTime.tv_nsec += (Wait % 1000) * 1000000; TempTime.tv_sec += TempTime.tv_nsec / 1000000000; TempTime.tv_nsec = TempTime.tv_nsec % 1000000000; + UnixEvent->MxWaiting[0]++; + int Result2; do { @@ -602,10 +608,10 @@ int sync_WaitForUnixEvent(sync_UnixEventWrapper *UnixEvent, uint32_t Wait) if (Result2 != 0) break; } while (UnixEvent->MxSignaled[0] == '\x00'); + UnixEvent->MxWaiting[0]--; + if (Result2 == 0) { - UnixEvent->MxWaiting[0]--; - /* Reset auto events. */ if (UnixEvent->MxManual[0] == '\x00') UnixEvent->MxSignaled[0] = '\x00'; @@ -625,7 +631,7 @@ int sync_FireUnixEvent(sync_UnixEventWrapper *UnixEvent) UnixEvent->MxSignaled[0] = '\x01'; /* Let all waiting threads through for manual events, otherwise just one waiting thread (if any). */ - if (UnixEvent->MxManual[0] == '\x00') pthread_cond_broadcast(UnixEvent->MxCond); + if (UnixEvent->MxManual[0] != '\x00') pthread_cond_broadcast(UnixEvent->MxCond); else pthread_cond_signal(UnixEvent->MxCond); pthread_mutex_unlock(UnixEvent->MxMutex); diff --git a/tests/010.phpt b/tests/010.phpt index 7444ac5..3af4b84 100644 --- a/tests/010.phpt +++ b/tests/010.phpt @@ -6,7 +6,7 @@ SyncEvent - unnamed manual event object allocation and firing. wait(0)); + var_dump($event->wait(1)); var_dump($event->fire()); var_dump($event->wait(0)); var_dump($event->wait(0)); diff --git a/tests/011.phpt b/tests/011.phpt index b0a4f32..f6165f5 100644 --- a/tests/011.phpt +++ b/tests/011.phpt @@ -6,7 +6,7 @@ SyncEvent - named manual event object allocation and firing. wait(0)); + var_dump($event->wait(1)); var_dump($event->fire()); var_dump($event->wait(0)); var_dump($event->wait(0));