From 2355b71e94a4f29b67ddac9adccdf34f547e1041 Mon Sep 17 00:00:00 2001 From: Guillaume Roguez <guillaume.roguez@savoirfairelinux.com> Date: Wed, 23 Apr 2014 14:51:24 -0400 Subject: [PATCH] gnome: remove semaphore timed operation in video renderer. The sem_timedwait() is replaced by a sem_trywait(). This patch seems also to resolve other --timeout-- bugs seen in the daemon. This code is run by the main GUI event loop, so never do locking stuff into it. Change-Id: I4b68e6ec4527f67728a509701f5076c81dc35148 --- gnome/src/video/video_renderer.c | 36 +++++++++----------------------- 1 file changed, 10 insertions(+), 26 deletions(-) diff --git a/gnome/src/video/video_renderer.c b/gnome/src/video/video_renderer.c index b0aff0c3b8..3e8759396e 100644 --- a/gnome/src/video/video_renderer.c +++ b/gnome/src/video/video_renderer.c @@ -226,30 +226,13 @@ video_renderer_start_shm(VideoRenderer *self) return TRUE; } -static const gint TIMEOUT_SEC = 1; // 1 second - -static struct timespec -create_timeout() -{ - struct timespec timeout = {0, 0}; - if (clock_gettime(CLOCK_REALTIME, &timeout) == -1) - perror("clock_gettime"); - timeout.tv_sec += TIMEOUT_SEC; - return timeout; -} - - static gboolean shm_lock(SHMHeader *shm_area) { - const struct timespec timeout = create_timeout(); - /* We need an upper limit on how long we'll wait to avoid locking the whole GUI */ - if (sem_timedwait(&shm_area->mutex, &timeout) < 0) { - g_warning("%s", g_strerror(errno)); - if (errno == ETIMEDOUT) - return FALSE; - } - return TRUE; + int err = sem_trywait(&shm_area->mutex); + if (err < 0 && errno != EAGAIN) + g_warning("Renderer: sem_trywait() failed, %s", strerror(errno)); + return !err; } static void @@ -295,11 +278,12 @@ video_renderer_render_to_texture(VideoRendererPrivate *priv) // wait for a new buffer while (priv->buffer_gen == priv->shm_area->buffer_gen) { shm_unlock(priv->shm_area); - const struct timespec timeout = create_timeout(); - // Could not decrement semaphore in time, returning - if (sem_timedwait(&priv->shm_area->notification, &timeout) < 0) { - if (errno == ETIMEDOUT) - g_warning("Renderer %s timed out waiting for notification", priv->shm_path); + // Could not decrement semaphore, returning + int err = sem_trywait(&priv->shm_area->notification); + if (err < 0) { + if (errno != EAGAIN) + g_warning("Renderer %s: sem_trywait() failed, %s", priv->shm_path, + strerror(errno)); return; } -- GitLab