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