Explorar o código

libobs/util: Fix POSIX event bugs

Handle spurious wakeups, and ensure mutex unlock.
jpark37 %!s(int64=5) %!d(string=hai) anos
pai
achega
7ce30ece82
Modificáronse 1 ficheiros con 9 adicións e 3 borrados
  1. 9 3
      libobs/util/threading-posix.c

+ 9 - 3
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) {