diff --git a/app/src/fps_counter.c b/app/src/fps_counter.c index f82c00ce..5f553941 100644 --- a/app/src/fps_counter.c +++ b/app/src/fps_counter.c @@ -84,11 +84,9 @@ run_fps_counter(void *data) { sc_tick now = sc_tick_now(); check_interval_expired(counter, now); - assert(counter->next_timestamp > now); - sc_tick remaining = counter->next_timestamp - now; - // ignore the reason (timeout or signaled), we just loop anyway - sc_cond_timedwait(&counter->state_cond, &counter->mutex, remaining); + sc_cond_timedwait(&counter->state_cond, &counter->mutex, + counter->next_timestamp); } } sc_mutex_unlock(&counter->mutex); diff --git a/app/src/server.c b/app/src/server.c index a4cdb0c9..801793e0 100644 --- a/app/src/server.c +++ b/app/src/server.c @@ -557,7 +557,7 @@ server_stop(struct server *server) { #define WATCHDOG_DELAY_MS 1000 signaled = sc_cond_timedwait(&server->process_terminated_cond, &server->mutex, - WATCHDOG_DELAY_MS); + sc_tick_now() + WATCHDOG_DELAY_MS); } sc_mutex_unlock(&server->mutex); diff --git a/app/src/util/thread.c b/app/src/util/thread.c index 72e48e3b..390f6078 100644 --- a/app/src/util/thread.c +++ b/app/src/util/thread.c @@ -124,12 +124,14 @@ sc_cond_wait(sc_cond *cond, sc_mutex *mutex) { } bool -sc_cond_timedwait(sc_cond *cond, sc_mutex *mutex, sc_tick ms) { - if (ms < 0) { +sc_cond_timedwait(sc_cond *cond, sc_mutex *mutex, sc_tick deadline) { + sc_tick now = sc_tick_now(); + if (deadline <= now) { return false; // timeout } - int r = SDL_CondWaitTimeout(cond->cond, mutex->mutex, (uint32_t) ms); + sc_tick delay = deadline - now; + int r = SDL_CondWaitTimeout(cond->cond, mutex->mutex, delay); #ifndef NDEBUG if (r < 0) { LOGC("Could not wait on condition with timeout: %s", SDL_GetError()); diff --git a/app/src/util/thread.h b/app/src/util/thread.h index b3471975..fd548059 100644 --- a/app/src/util/thread.h +++ b/app/src/util/thread.h @@ -74,7 +74,7 @@ sc_cond_wait(sc_cond *cond, sc_mutex *mutex); // return true on signaled, false on timeout bool -sc_cond_timedwait(sc_cond *cond, sc_mutex *mutex, sc_tick ms); +sc_cond_timedwait(sc_cond *cond, sc_mutex *mutex, sc_tick deadline); void sc_cond_signal(sc_cond *cond);