[vlc-devel] [PATCH 2/2] vout: simplify without cancellation

RĂ©mi Denis-Courmont remi at remlab.net
Tue Apr 14 21:08:54 CEST 2020


---
 src/video_output/control.c      |  2 --
 src/video_output/control.h      |  1 +
 src/video_output/video_output.c | 14 +++++---------
 3 files changed, 6 insertions(+), 11 deletions(-)

diff --git a/src/video_output/control.c b/src/video_output/control.c
index d8da02fc35..fd0c80fe6e 100644
--- a/src/video_output/control.c
+++ b/src/video_output/control.c
@@ -144,7 +144,6 @@ int vout_control_Pop(vout_control_t *ctrl, vout_control_cmd_t *cmd,
                      vlc_tick_t deadline)
 {
     vlc_mutex_lock(&ctrl->lock);
-    mutex_cleanup_push(&ctrl->lock);
 
     if (ctrl->cmd.i_size <= 0) {
         /* Spurious wakeups are perfectly fine */
@@ -158,7 +157,6 @@ int vout_control_Pop(vout_control_t *ctrl, vout_control_cmd_t *cmd,
 
     while (ctrl->is_held)
         vlc_cond_wait(&ctrl->wait_available, &ctrl->lock);
-    vlc_cleanup_pop();
 
     bool has_cmd;
     if (ctrl->cmd.i_size > 0) {
diff --git a/src/video_output/control.h b/src/video_output/control.h
index 02b0696028..eee86c4ca9 100644
--- a/src/video_output/control.h
+++ b/src/video_output/control.h
@@ -27,6 +27,7 @@
 
 /* */
 enum {
+    VOUT_CONTROL_TERMINATE,
     VOUT_CONTROL_CHANGE_FILTERS,        /* string */
     VOUT_CONTROL_CHANGE_INTERLACE,      /* boolean */
 
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index 6a361e568d..480dfe75f3 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -33,8 +33,6 @@
 # include "config.h"
 #endif
 
-#include <stdnoreturn.h>
-
 #include <vlc_common.h>
 
 #include <math.h>
@@ -1674,7 +1672,7 @@ error:
  * terminated. It handles the pictures arriving in the video heap and the
  * display device events.
  *****************************************************************************/
-noreturn static void *Thread(void *object)
+static void *Thread(void *object)
 {
     vout_thread_t *vout = object;
     vout_thread_sys_t *sys = vout->p;
@@ -1692,10 +1690,11 @@ noreturn static void *Thread(void *object)
         } else {
             deadline = VLC_TICK_INVALID;
         }
-        while (!vout_control_Pop(&sys->control, &cmd, deadline)) {
-            int canc = vlc_savecancel();
 
+        while (!vout_control_Pop(&sys->control, &cmd, deadline)) {
             switch(cmd.type) {
+                case VOUT_CONTROL_TERMINATE:
+                    return NULL; /* no need to clean &cmd */
                 case VOUT_CONTROL_CHANGE_FILTERS:
                     ThreadChangeFilters(vout, cmd.string, NULL, false);
                     break;
@@ -1707,17 +1706,14 @@ noreturn static void *Thread(void *object)
                     break;
             }
             vout_control_cmd_Clean(&cmd);
-            vlc_restorecancel(canc);
         }
 
-        int canc = vlc_savecancel();
         deadline = VLC_TICK_INVALID;
         wait = ThreadDisplayPicture(vout, &deadline) != VLC_SUCCESS;
 
         const bool picture_interlaced = sys->displayed.is_interlaced;
 
         vout_SetInterlacingState(vout, picture_interlaced);
-        vlc_restorecancel(canc);
     }
 }
 
@@ -1772,7 +1768,7 @@ void vout_StopDisplay(vout_thread_t *vout)
 {
     vout_thread_sys_t *sys = vout->p;
 
-    vlc_cancel(sys->thread);
+    vout_control_PushVoid(&sys->control, VOUT_CONTROL_TERMINATE);
     vlc_join(sys->thread, NULL);
 
     vout_ReleaseDisplay(vout);
-- 
2.26.0



More information about the vlc-devel mailing list