Fix bug #74120 - sync_WaitForUnixEvent() issues.

This commit is contained in:
cubiclesoft
2017-02-19 22:11:23 -07:00
parent dc2d7f73d0
commit 5af68db054
4 changed files with 21 additions and 20 deletions

View File

@@ -10,10 +10,10 @@
<email>cubic@php.net</email>
<active>yes</active>
</lead>
<date>2016-11-26</date>
<time>19:00:00</time>
<date>2017-02-20</date>
<time>05:00:00</time>
<version>
<release>1.1.0</release>
<release>1.1.1</release>
<api>1.1.0</api>
</version>
<stability>
@@ -22,12 +22,7 @@
</stability>
<license uri="http://opensource.org/licenses/MIT">MIT License</license>
<notes>
- 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.
</notes>
<contents>
<dir name="/">

24
sync.c
View File

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

View File

@@ -6,7 +6,7 @@ SyncEvent - unnamed manual event object allocation and firing.
<?php
$event = new SyncEvent(null, true);
var_dump($event->wait(0));
var_dump($event->wait(1));
var_dump($event->fire());
var_dump($event->wait(0));
var_dump($event->wait(0));

View File

@@ -6,7 +6,7 @@ SyncEvent - named manual event object allocation and firing.
<?php
$event = new SyncEvent("Awesome2_" . PHP_INT_SIZE, true);
var_dump($event->wait(0));
var_dump($event->wait(1));
var_dump($event->fire());
var_dump($event->wait(0));
var_dump($event->wait(0));