[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