[vlc-devel] [PATCH] input: Add input_item_parser_id_Interrupt

Thomas Guillem thomas at gllm.fr
Thu Jun 20 15:11:32 CEST 2019


LGTM.

On Thu, Jun 20, 2019, at 14:38, Hugo Beauzée-Luyssen wrote:
> This effectively split input_item_parser_id_Release in 2 functions,
> allowing an asynchronous cancellation to occur.
> Otherwise, the input thread would invoke the callback synchronously
> while the thread cancelling the preparser is blocked joining the input
> thread. Both those thread are very likely to be called with a mutex
> held, which would cause a deadlock.
> ---
>  include/vlc_input_item.h | 14 +++++++++++++-
>  src/input/item.c         |  8 +++++++-
>  src/libvlccore.sym       |  1 +
>  3 files changed, 21 insertions(+), 2 deletions(-)
> 
> diff --git a/include/vlc_input_item.h b/include/vlc_input_item.h
> index b68c24dc49..1e94b842a2 100644
> --- a/include/vlc_input_item.h
> +++ b/include/vlc_input_item.h
> @@ -421,7 +421,7 @@ typedef struct input_item_parser_cbs_t
>   * Parse an item asynchronously
>   *
>   * @note The parsing is done asynchronously. The user can call
> - * input_item_parser_id_Release() before receiving the on_ended() event in
> + * input_item_parser_id_Interrupt() before receiving the on_ended() event in
>   * order to interrupt it.
>   *
>   * @param item the item to parse
> @@ -436,6 +436,18 @@ VLC_API input_item_parser_id_t *
>  input_item_Parse(input_item_t *item, vlc_object_t *parent,
>                   const input_item_parser_cbs_t *cbs, void *userdata) VLC_USED;
>  
> +/**
> + * Interrupts & cancels the parsing
> + *
> + * @note The parser still needs to be released with 
> input_item_parser_id_Release
> + * afterward.
> + * @note Calling this function will cause the on_ended callback to be 
> invoked.
> + *
> + * @param the parser to interrupt
> + */
> +VLC_API void
> +input_item_parser_id_Interrupt(input_item_parser_id_t *parser);
> +
>  /**
>   * Release (and interrupt if needed) a parser
>   *
> diff --git a/src/input/item.c b/src/input/item.c
> index ac79336540..b1b92cdf9b 100644
> --- a/src/input/item.c
> +++ b/src/input/item.c
> @@ -1405,9 +1405,15 @@ input_item_Parse(input_item_t *item, 
> vlc_object_t *obj,
>  }
>  
>  void
> -input_item_parser_id_Release(input_item_parser_id_t *parser)
> +input_item_parser_id_Interrupt(input_item_parser_id_t *parser)
>  {
>      input_Stop(parser->input);
> +}
> +
> +void
> +input_item_parser_id_Release(input_item_parser_id_t *parser)
> +{
> +    input_item_parser_id_Interrupt(parser);
>      input_Close(parser->input);
>      free(parser);
>  }
> diff --git a/src/libvlccore.sym b/src/libvlccore.sym
> index 6c59e1b6fc..64a6c0123b 100644
> --- a/src/libvlccore.sym
> +++ b/src/libvlccore.sym
> @@ -204,6 +204,7 @@ input_item_slave_GetType
>  input_item_slave_New
>  input_item_AddSlave
>  input_item_Parse
> +input_item_parser_id_Interrupt
>  input_item_parser_id_Release
>  input_resource_New
>  input_resource_Release
> -- 
> 2.20.1
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list