Replace #ifdef _WIN32 with gates on our platforms definitions. Implement PltIsThreadInterrupted for POSIX. Fix PltWaitForEvent for POSIX.

This commit is contained in:
Cameron Gutman 2014-02-02 06:17:28 -05:00
parent 8ad3145638
commit f9882f91e1

View File

@ -16,7 +16,7 @@ VOID WINAPI ApcFunc(ULONG_PTR parameter) {
WCHAR DbgBuf[512]; WCHAR DbgBuf[512];
#endif #endif
#ifdef LC_WINDOWS #if defined(LC_WINDOWS) || defined(LC_WINDOWS_PHONE)
DWORD WINAPI ThreadProc(LPVOID lpParameter) { DWORD WINAPI ThreadProc(LPVOID lpParameter) {
struct thread_context *ctx = (struct thread_context *)lpParameter; struct thread_context *ctx = (struct thread_context *)lpParameter;
@ -108,6 +108,9 @@ int PltIsThreadInterrupted(PLT_THREAD *thread) {
#if defined(LC_WINDOWS) || defined(LC_WINDOWS_PHONE) #if defined(LC_WINDOWS) || defined(LC_WINDOWS_PHONE)
return thread->cancelled; return thread->cancelled;
#else #else
// The thread will die here if a cancellation was requested
pthread_testcancel();
return 0;
#endif #endif
} }
@ -133,7 +136,7 @@ int PltCreateThread(ThreadEntry entry, void* context, PLT_THREAD *thread) {
ctx->entry = entry; ctx->entry = entry;
ctx->context = context; ctx->context = context;
#ifdef _WIN32 #if defined(LC_WINDOWS) || defined(LC_WINDOWS_PHONE)
{ {
thread->cancelled = 0; thread->cancelled = 0;
thread->handle = CreateThread(NULL, 0, ThreadProc, ctx, 0, NULL); thread->handle = CreateThread(NULL, 0, ThreadProc, ctx, 0, NULL);
@ -174,7 +177,7 @@ int PltCreateEvent(PLT_EVENT *event) {
} }
void PltCloseEvent(PLT_EVENT *event) { void PltCloseEvent(PLT_EVENT *event) {
#ifdef _WIN32 #if defined(LC_WINDOWS) || defined(LC_WINDOWS_PHONE)
CloseHandle(*event); CloseHandle(*event);
#else #else
pthread_mutex_destroy(&event->mutex); pthread_mutex_destroy(&event->mutex);
@ -183,7 +186,7 @@ void PltCloseEvent(PLT_EVENT *event) {
} }
void PltSetEvent(PLT_EVENT *event) { void PltSetEvent(PLT_EVENT *event) {
#ifdef _WIN32 #if defined(LC_WINDOWS) || defined(LC_WINDOWS_PHONE)
SetEvent(*event); SetEvent(*event);
#else #else
event->signalled = 1; event->signalled = 1;
@ -192,7 +195,7 @@ void PltSetEvent(PLT_EVENT *event) {
} }
void PltClearEvent(PLT_EVENT *event) { void PltClearEvent(PLT_EVENT *event) {
#ifdef _WIN32 #if defined(LC_WINDOWS) || defined(LC_WINDOWS_PHONE)
ResetEvent(*event); ResetEvent(*event);
#else #else
event->signalled = 0; event->signalled = 0;
@ -200,7 +203,7 @@ void PltClearEvent(PLT_EVENT *event) {
} }
int PltWaitForEvent(PLT_EVENT *event) { int PltWaitForEvent(PLT_EVENT *event) {
#ifdef _WIN32 #if defined(LC_WINDOWS) || defined(LC_WINDOWS_PHONE)
DWORD error = WaitForSingleObjectEx(*event, INFINITE, TRUE); DWORD error = WaitForSingleObjectEx(*event, INFINITE, TRUE);
if (error == STATUS_WAIT_0) { if (error == STATUS_WAIT_0) {
return PLT_WAIT_SUCCESS; return PLT_WAIT_SUCCESS;
@ -218,5 +221,6 @@ int PltWaitForEvent(PLT_EVENT *event) {
pthread_cond_wait(&event->cond, &event->mutex); pthread_cond_wait(&event->cond, &event->mutex);
} }
pthread_mutex_unlock(&event->mutex); pthread_mutex_unlock(&event->mutex);
return PLT_WAIT_SUCCESS;
#endif #endif
} }