Files
Webcam/include/platform/thread/thread_event.cpp

121 lines
3.0 KiB
C++

/* -----------------------------------------------------------------------------
GSFramework
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
----------------------------------------------------------------------------- */
#include "thread/thread_event.h"
#include "time/ntime.h"
using namespace GS;
using namespace GS::Threading;
#if __PLATFORM_WINDOWS__
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
//------------------------------------------------------------------------------
void Event::Wait(Time *t)
{ WaitForSingleObject((HANDLE)event, t ? DWORD(t->toMs()) : INFINITE); }
void Event::Trigger()
{ SetEvent((HANDLE)event); }
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
Event::Event()
{ event = (void *)CreateEvent(NULL, false, false, NULL); }
Event::~Event()
{ if (event) CloseHandle(event); }
//------------------------------------------------------------------------------
#elif __PLATFORM_EMSCRIPTEN__
//------------------------------------------------------------------------------
void Event::Wait(Time *t)
{}
void Event::Trigger()
{}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
Event::Event()
{}
Event::~Event()
{}
//------------------------------------------------------------------------------
#elif __PLATFORM_POSIX__
#include <errno.h>
#include <pthread.h>
#include <stdbool.h>
#include <sys/time.h>
struct pthread_event
{
pthread_mutex_t mutex;
pthread_cond_t cond;
bool triggered;
};
//------------------------------------------------------------------------------
void Event::Wait(Time *t)
{
pthread_event *ev = (pthread_event *)event;
timespec time;
if (t)
{
timeval ctime;
gettimeofday(&ctime, NULL);
time.tv_sec = t->getSec() + ctime.tv_sec;
time.tv_nsec = t->getNanoSec() + ctime.tv_usec * 1000;
}
pthread_mutex_lock(&ev->mutex);
while (!ev->triggered)
{
if (!t)
pthread_cond_wait(&ev->cond, &ev->mutex);
else
if (pthread_cond_timedwait(&ev->cond, &ev->mutex, &time) == ETIMEDOUT)
break;
}
ev->triggered = false;
pthread_mutex_unlock(&ev->mutex);
}
void Event::Trigger()
{
pthread_event *ev = (pthread_event *)event;
pthread_mutex_lock(&ev->mutex);
ev->triggered = true;
pthread_cond_signal(&ev->cond);
pthread_mutex_unlock(&ev->mutex);
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
Event::Event()
{
pthread_event *ev = new pthread_event;
event = (void *)ev;
pthread_mutex_init(&ev->mutex, 0);
pthread_cond_init(&ev->cond, 0);
ev->triggered = false;
}
Event::~Event()
{
pthread_event *ev = (pthread_event *)event;
pthread_mutex_destroy(&ev->mutex);
pthread_cond_destroy(&ev->cond);
delete ev;
}
//------------------------------------------------------------------------------
#endif