[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