From 82e970d25a9459023ac5257a40038dec868a392e Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Wed, 28 May 2025 11:50:58 -0700 Subject: [PATCH 1/3] GUACAMOLE-2063: Ensure state flag lock is acquired before checking flag value. --- src/libguac/display-render-thread.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/libguac/display-render-thread.c b/src/libguac/display-render-thread.c index 13f70369..9ab5beb4 100644 --- a/src/libguac/display-render-thread.c +++ b/src/libguac/display-render-thread.c @@ -141,7 +141,8 @@ 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; render_thread->frames = 0; From 5af5711fc35139cd6aeb46c610e5b104cd99bb10 Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Wed, 28 May 2025 11:51:33 -0700 Subject: [PATCH 2/3] GUACAMOLE-2063: Accumulate frame count while render thread is combining frames. --- src/libguac/display-render-thread.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libguac/display-render-thread.c b/src/libguac/display-render-thread.c index 9ab5beb4..121c3d23 100644 --- a/src/libguac/display-render-thread.c +++ b/src/libguac/display-render-thread.c @@ -144,7 +144,7 @@ static void* guac_display_render_loop(void* data) { 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, From 2621d65eabadfc7b070db11250a1a1ffe42720ed Mon Sep 17 00:00:00 2001 From: Michael Jumper Date: Wed, 28 May 2025 11:52:03 -0700 Subject: [PATCH 3/3] GUACAMOLE-2063: Avoid wait calculations when no timeout is provided for timedwait. --- src/libguac/flag.c | 11 +++++++++++ 1 file changed, 11 insertions(+) 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);