[vlc-devel] [PATCH 3/3] caca: use the queue API, avoid block_t
Rémi Denis-Courmont
remi at remlab.net
Sat Apr 11 21:16:16 CEST 2020
Le lauantaina 11. huhtikuuta 2020, 22.12.41 EEST Rémi Denis-Courmont a écrit :
> ---
> modules/video_output/caca.c | 63 +++++++++++++++----------------------
> 1 file changed, 26 insertions(+), 37 deletions(-)
>
> diff --git a/modules/video_output/caca.c b/modules/video_output/caca.c
> index de5d130803..296103cd5c 100644
> --- a/modules/video_output/caca.c
> +++ b/modules/video_output/caca.c
> @@ -30,10 +30,11 @@
> #endif
>
> #include <stdbool.h>
> +#include <stdint.h>
> #include <stdlib.h>
> #include <string.h>
> #include <vlc_common.h>
> -#include <vlc_block.h>
> +#include <vlc_queue.h>
> #include <vlc_plugin.h>
> #include <vlc_vout_display.h>
> #if !defined(_WIN32) && !defined(__APPLE__)
> @@ -52,7 +53,7 @@ struct vout_display_sys_t {
> cucul_dither_t *dither;
>
> bool dead;
> - block_fifo_t *fifo;
> + vlc_queue_t q;
> vlc_thread_t thread;
> vout_window_t *window;
> vout_display_place_t place;
> @@ -61,26 +62,23 @@ struct vout_display_sys_t {
> vlc_tick_t cursor_deadline;
> };
>
> +typedef struct vlc_caca_event {
> + struct vlc_caca_event *next;
> + int key;
> +} vlc_caca_event_t;
> +
> +static const ptrdiff_t q_offset = offsetof (vlc_caca_event_t, next);
> +
> static void *VoutDisplayEventKeyDispatch(void *data)
> {
> vout_display_t *vd = data;
> vout_display_sys_t *sys = vd->sys;
> - block_fifo_t *fifo = sys->fifo;
> - block_t *event;
> + vlc_caca_event_t *event;
>
> do {
> - vlc_fifo_Lock(fifo);
> - while (vlc_fifo_IsEmpty(fifo) && !sys->dead)
> - vlc_fifo_Wait(fifo);
> -
> - event = vlc_fifo_DequeueUnlocked(fifo);
> - vlc_fifo_Unlock(fifo);
> -
> - int key;
> -
> - memcpy(&key, event->p_buffer, sizeof (key));
> - block_Release(event);
> - vout_window_ReportKeyPress(sys->window, key);
> + event = vlc_queue_DequeueKillable(&sys->q, q_offset, &sys->dead);
> + vout_window_ReportKeyPress(sys->window, event->key);
Need to check for NULL there ^^
> + free(event);
> } while (event != NULL);
>
> return NULL;
> @@ -88,10 +86,11 @@ static void *VoutDisplayEventKeyDispatch(void *data)
>
> static void VoutDisplayEventKey(vout_display_sys_t *sys, int key)
> {
> - block_t *event = block_Alloc(sizeof (key));
> + vlc_caca_event_t *event = malloc(sizeof (*event));
> +
> if (likely(event != NULL)) {
> - memcpy(event->p_buffer, &key, sizeof (key));
> - block_FifoPut(sys->fifo, event);
> + event->key = key;
> + vlc_queue_Enqueue(&sys->q, event, q_offset);
> }
> }
>
> @@ -363,14 +362,9 @@ static void Close(vout_display_t *vd)
> {
> vout_display_sys_t *sys = vd->sys;
>
> - if (sys->fifo != NULL) {
> - vlc_fifo_Lock(sys->fifo);
> - sys->dead = true;
> - vlc_fifo_Signal(sys->fifo);
> - vlc_fifo_Unlock(sys->fifo);
> - vlc_join(sys->thread, NULL);
> - block_FifoRelease(sys->fifo);
> - }
> + vlc_queue_Kill(&sys->q, &sys->dead);
> + vlc_join(sys->thread, NULL);
> +
> if (sys->dither)
> cucul_free_dither(sys->dither);
> caca_free_display(sys->dp);
> @@ -480,17 +474,12 @@ static int Open(vout_display_t *vd, const
> vout_display_cfg_t *cfg, (title != NULL) ? title : VOUT_TITLE "(Colour
> AsCii Art)"); free(title);
>
> - block_fifo_t *fifo = block_FifoNew();
> - if (likely(fifo != NULL)) {
> - sys->dead = false;
> - sys->fifo = fifo;
> + sys->dead = false;
> + vlc_queue_Init(&sys->q);
>
> - if (vlc_clone(&sys->thread, VoutDisplayEventKeyDispatch, vd,
> - VLC_THREAD_PRIORITY_LOW)) {
> - block_FifoRelease(fifo);
> - sys->fifo = NULL;
> - }
> - }
> + if (vlc_clone(&sys->thread, VoutDisplayEventKeyDispatch, vd,
> + VLC_THREAD_PRIORITY_LOW))
> + goto error;
>
> sys->cursor_timeout = VLC_TICK_FROM_MS( var_InheritInteger(vd,
> "mouse-hide-timeout") ); sys->cursor_deadline = INVALID_DEADLINE;
--
Rémi Denis-Courmont
Tapiolan uusi kaupunki, Uudenmaan tasavalta
More information about the vlc-devel
mailing list