From 7ce30ece827ccaddb9a366f6814a3df3ae5d841d Mon Sep 17 00:00:00 2001 From: jpark37 Date: Sat, 9 May 2020 14:21:35 -0700 Subject: [PATCH] libobs/util: Fix POSIX event bugs Handle spurious wakeups, and ensure mutex unlock. --- libobs/util/threading-posix.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/libobs/util/threading-posix.c b/libobs/util/threading-posix.c index 07527486..57bf2388 100644 --- a/libobs/util/threading-posix.c +++ b/libobs/util/threading-posix.c @@ -77,15 +77,19 @@ int os_event_wait(os_event_t *event) { int code = 0; pthread_mutex_lock(&event->mutex); - if (!event->signalled) + while (!event->signalled) { code = pthread_cond_wait(&event->cond, &event->mutex); + if (code != 0) + break; + } if (code == 0) { if (!event->manual) event->signalled = false; - pthread_mutex_unlock(&event->mutex); } + pthread_mutex_unlock(&event->mutex); + return code; } @@ -103,7 +107,7 @@ int os_event_timedwait(os_event_t *event, unsigned long milliseconds) { int code = 0; pthread_mutex_lock(&event->mutex); - if (!event->signalled) { + while (!event->signalled) { struct timespec ts; #if defined(__APPLE__) || defined(__MINGW32__) struct timeval tv; @@ -115,6 +119,8 @@ int os_event_timedwait(os_event_t *event, unsigned long milliseconds) #endif add_ms_to_ts(&ts, milliseconds); code = pthread_cond_timedwait(&event->cond, &event->mutex, &ts); + if (code != 0) + break; } if (code == 0) { -- GitLab