diff --git a/src/libguac/display-render-thread.c b/src/libguac/display-render-thread.c index 13f70369..121c3d23 100644 --- a/src/libguac/display-render-thread.c +++ b/src/libguac/display-render-thread.c @@ -141,9 +141,10 @@ static void* guac_display_render_loop(void* data) { } /* Use explicit frame boundaries whenever available */ - if (render_thread->state.value & GUAC_DISPLAY_RENDER_THREAD_STATE_FRAME_READY) { + if (guac_flag_timedwait_and_lock(&render_thread->state, + GUAC_DISPLAY_RENDER_THREAD_STATE_FRAME_READY, 0)) { - rendered_frames = render_thread->frames; + rendered_frames += render_thread->frames; render_thread->frames = 0; guac_flag_clear(&render_thread->state, diff --git a/src/libguac/flag.c b/src/libguac/flag.c index 5f44ac31..39afb5a0 100644 --- a/src/libguac/flag.c +++ b/src/libguac/flag.c @@ -139,6 +139,17 @@ int guac_flag_timedwait_and_lock(guac_flag* event_flag, guac_flag_lock(event_flag); + /* Short path: skip wait completely when possible */ + if (!msec_timeout) { + + int retval = event_flag->value & flags; + if (!retval) + guac_flag_unlock(event_flag); + + return retval; + + } + struct timespec ts_timeout; clock_gettime(CLOCK_MONOTONIC, &ts_timeout);