[vlc-devel] [PATCH v3 5/8] video_output: handle the terminate state internally in the control FIFO
Steve Lhomme
robux4 at ycbcr.xyz
Fri Dec 18 06:42:11 UTC 2020
It doesn't push a dummy command anymore but sets an internal flag.
If the control FIFO is terminated we don't wait for new commands before
returning. There might be some pending mouse commands before the TERMINATED
command (that is now removed).
---
src/video_output/control.c | 18 ++++++++++--------
src/video_output/control.h | 1 +
2 files changed, 11 insertions(+), 8 deletions(-)
diff --git a/src/video_output/control.c b/src/video_output/control.c
index 38026bf31a9..15b3e5d2adc 100644
--- a/src/video_output/control.c
+++ b/src/video_output/control.c
@@ -39,6 +39,7 @@ void vout_control_Init(vout_control_t *ctrl)
ctrl->is_held = false;
ctrl->is_waiting = false;
ctrl->can_sleep = true;
+ ctrl->is_terminated = false;
ARRAY_INIT(ctrl->cmd);
}
@@ -70,12 +71,8 @@ void vout_control_Wake(vout_control_t *ctrl)
void vout_control_PushTerminate(vout_control_t *ctrl)
{
- vout_control_cmd_t cmd = {
- VOUT_CONTROL_TERMINATE, {0},
- };
-
vlc_mutex_lock(&ctrl->lock);
- ARRAY_APPEND(ctrl->cmd, cmd);
+ ctrl->is_terminated = true;
vlc_cond_signal(&ctrl->wait_request);
vlc_mutex_unlock(&ctrl->lock);
}
@@ -101,9 +98,10 @@ void vout_control_Release(vout_control_t *ctrl)
int vout_control_Pop(vout_control_t *ctrl, vout_control_cmd_t *cmd,
vlc_tick_t deadline)
{
+ bool has_cmd = false;
vlc_mutex_lock(&ctrl->lock);
- if (ctrl->cmd.i_size <= 0) {
+ if (ctrl->cmd.i_size <= 0 && !ctrl->is_terminated) {
/* Spurious wakeups are perfectly fine */
if (deadline != VLC_TICK_INVALID && ctrl->can_sleep) {
ctrl->is_waiting = true;
@@ -116,15 +114,19 @@ 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);
- bool has_cmd;
+ if (ctrl->is_terminated) {
+ *cmd = (vout_control_cmd_t) { VOUT_CONTROL_TERMINATE, {0} };
+ goto done;
+ }
+
if (ctrl->cmd.i_size > 0) {
has_cmd = true;
*cmd = ARRAY_VAL(ctrl->cmd, 0);
ARRAY_REMOVE(ctrl->cmd, 0);
} else {
- has_cmd = false;
ctrl->can_sleep = true;
}
+done:
vlc_mutex_unlock(&ctrl->lock);
return has_cmd ? VLC_SUCCESS : VLC_EGENERIC;
diff --git a/src/video_output/control.h b/src/video_output/control.h
index 464bf349cc9..684ad909b59 100644
--- a/src/video_output/control.h
+++ b/src/video_output/control.h
@@ -46,6 +46,7 @@ typedef struct {
bool can_sleep;
bool is_waiting;
bool is_held;
+ bool is_terminated;
DECL_ARRAY(vout_control_cmd_t) cmd;
} vout_control_t;
--
2.29.2
More information about the vlc-devel
mailing list