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));