added OSD_EVENT_WAIT_INFINITE and implemented it properly for all platforms (nw)

This commit is contained in:
Oliver Stöneberg 2015-01-07 17:03:32 +01:00
parent 3bffa5e3cf
commit 894d241fff
7 changed files with 26 additions and 5 deletions

View File

@ -14,6 +14,8 @@
SYNCHRONIZATION INTERFACES - Events
***************************************************************************/
#define OSD_EVENT_WAIT_INFINITE -1
/* osd_event is an opaque type which represents a setable/resetable event */
struct osd_event;

View File

@ -403,6 +403,9 @@ void osd_event_reset(osd_event *event)
int osd_event_wait(osd_event *event, osd_ticks_t timeout)
{
if (timeout == OSD_EVENT_WAIT_INFINITE)
timeout = osd_ticks_per_second() * (osd_ticks_t)10000;
pthread_mutex_lock(&event->mutex);
if (!timeout)
{

View File

@ -381,11 +381,17 @@ void osd_event_reset(osd_event *event)
int osd_event_wait(osd_event *event, osd_ticks_t timeout)
{
ULONG rc;
ULONG timeout_param;
if (timeout == OSD_EVENT_WAIT_INFINITE)
timeout_param = SEM_INDEFINITE_WAIT;
else
timeout_param = timeout * 1000 / osd_ticks_per_second();
if(event->autoreset)
DosRequestMutexSem(event->hmtx, -1);
rc = DosWaitEventSem(event->hev, timeout * 1000 / osd_ticks_per_second());
rc = DosWaitEventSem(event->hev, timeout_param);
if(event->autoreset)
{

View File

@ -247,6 +247,8 @@ void osd_event_reset(osd_event *event)
int osd_event_wait(osd_event *event, osd_ticks_t timeout)
{
LOG(("osd_event_wait"));
if (timeout == OSD_EVENT_WAIT_INFINITE)
timeout = osd_ticks_per_second() * (osd_ticks_t)10000;
SDL_mutexP(event->mutex);
if (!timeout)
{

View File

@ -238,6 +238,9 @@ void osd_event_reset(osd_event *event)
int osd_event_wait(osd_event *event, osd_ticks_t timeout)
{
if (timeout == OSD_EVENT_WAIT_INFINITE)
timeout = osd_ticks_per_second() * (osd_ticks_t)10000;
pthread_mutex_lock(&event->mutex);
if (!timeout)
{

View File

@ -239,8 +239,14 @@ void osd_event_reset(osd_event *event)
int osd_event_wait(osd_event *event, osd_ticks_t timeout)
{
int ret = WaitForSingleObject((HANDLE) event, timeout * 1000 / osd_ticks_per_second());
return ( ret == WAIT_OBJECT_0);
DWORD timeout_param;
if (timeout == OSD_EVENT_WAIT_INFINITE)
timeout_param = INFINITE;
else
timeout_param = timeout * 1000 / osd_ticks_per_second();
int ret = WaitForSingleObject((HANDLE) event, timeout_param);
return (ret == WAIT_OBJECT_0);
}
//============================================================

View File

@ -58,7 +58,6 @@ typedef void *PVOID;
#if defined(OSD_WINDOWS)
#define SPIN_LOOP_TIME (osd_ticks_per_second() / 50000)
#else
#define INFINITE (osd_ticks_per_second() * (osd_ticks_t) 10000)
#define SPIN_LOOP_TIME (osd_ticks_per_second() / 10000)
#endif
@ -659,7 +658,7 @@ static void *worker_thread_entry(void *param)
if (!queue_has_list_items(queue))
{
begin_timing(thread->waittime);
osd_event_wait(thread->wakeevent, INFINITE);
osd_event_wait(thread->wakeevent, OSD_EVENT_WAIT_INFINITE);
end_timing(thread->waittime);
}