mirror of
https://github.com/php/pecl-system-sync.git
synced 2026-03-23 23:02:19 +01:00
Fix bug #74120 - sync_WaitForUnixEvent() issues.
This commit is contained in:
13
package.xml
13
package.xml
@@ -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
24
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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user