From 189846753c63e12c1fd5bdf1e56fb2afcf414a45 Mon Sep 17 00:00:00 2001 From: rw-r-r-0644 Date: Fri, 21 Sep 2018 20:21:33 +0200 Subject: [PATCH] threads/wiiu: implement SDL_CondWaitTimeout --- src/thread/wiiu/SDL_syscond.c | 37 ++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/thread/wiiu/SDL_syscond.c b/src/thread/wiiu/SDL_syscond.c index acb94532e..687f1603a 100644 --- a/src/thread/wiiu/SDL_syscond.c +++ b/src/thread/wiiu/SDL_syscond.c @@ -24,8 +24,17 @@ #include "SDL_thread.h" +#include +#include +#include #include +typedef struct +{ + OSCondition *cond; + bool timed_out; +} WIIU_CondWaitTimeoutData; + /* Create a condition variable */ SDL_cond * SDL_CreateCond(void) @@ -91,10 +100,36 @@ Thread B: SDL_UnlockMutex(lock); */ +static void +SDL_CondWaitTimeoutCallback(OSAlarm *alarm, OSContext *context) +{ + WIIU_CondWaitTimeoutData *data = (WIIU_CondWaitTimeoutData *)OSGetAlarmUserData(alarm); + data->timed_out = true; + OSSignalCond(data->cond); +} + int SDL_CondWaitTimeout(SDL_cond * cond, SDL_mutex * mutex, Uint32 ms) { - return -1; + WIIU_CondWaitTimeoutData data; + data.timed_out = false; + data.cond = (OSCondition *)cond; + + // Timeout is zero + if (!ms) + return SDL_MUTEX_TIMEDOUT; + + // Set an alarm + OSAlarm alarm; + OSCreateAlarm(&alarm); + OSSetAlarmUserData(&alarm, &data); + OSSetAlarm(&alarm, OSMillisecondsToTicks(ms), &SDL_CondWaitTimeoutCallback); + + // Wait on the condition + OSWaitCond((OSCondition *)cond, (OSMutex *)mutex); + + OSCancelAlarm(&alarm); + return data.timed_out ? SDL_MUTEX_TIMEDOUT : 0; } /* Wait on the condition variable forever */