[vlc-devel] [PATCH 6/9] preparser: add playlist_preparser_Cancel
Thomas Guillem
thomas at gllm.fr
Wed Jun 1 18:46:33 CEST 2016
On Wed, Jun 1, 2016, at 16:25, Rémi Denis-Courmont wrote:
> Le 2016-06-01 13:24, Thomas Guillem a écrit :
> > ---
> > src/playlist/preparser.c | 23 +++++++++++++++++++++++
> > src/playlist/preparser.h | 8 ++++++++
> > 2 files changed, 31 insertions(+)
> >
> > diff --git a/src/playlist/preparser.c b/src/playlist/preparser.c
> > index a5751c5..13d5d3c 100644
> > --- a/src/playlist/preparser.c
> > +++ b/src/playlist/preparser.c
> > @@ -116,6 +116,29 @@ void playlist_preparser_fetcher_Push(
> > playlist_preparser_t *p_preparser,
> > playlist_fetcher_Push( p_preparser->p_fetcher, p_item,
> > i_options );
> > }
> >
> > +void playlist_preparser_Cancel( playlist_preparser_t *p_preparser,
> > + input_item_t *p_item )
> > +{
> > + vlc_mutex_lock( &p_preparser->lock );
> > + /* Remove the item from the queue (if present) */
> > + for( unsigned int i = 0; i < p_preparser->i_waiting; ++i )
> > + {
> > + preparser_entry_t *p_entry = p_preparser->pp_waiting[0];
> > + if( p_entry->p_item == p_item )
> > + {
> > + vlc_gc_decref( p_entry->p_item );
> > + free( p_entry );
> > + REMOVE_ELEM( p_preparser->pp_waiting,
> > p_preparser->i_waiting, i );
> > + break;
> > + }
> > + }
> > + /* Stop the input_thread reading the item (if any) */
> > + if( p_preparser->input != NULL
> > + && input_GetItem( p_preparser->input ) == p_item )
> > + input_Stop( p_preparser->input );
> > + vlc_mutex_unlock( &p_preparser->lock );
> > +}
> > +
>
> Items are reference counted, so you can have a situation where more
> than one something wants to preparse the same item. So, you can't just
> cancel it like that.
Ah yes, good catch.
I modified my patches: playlist_preparser_Push() can take a void *. This
void * can be used as a unique id to identity the caller of the request.
playlist_preparser_Cancel() cancel all requests done with this id.
New patches incoming...
>
> > void playlist_preparser_Delete( playlist_preparser_t *p_preparser )
> > {
> > vlc_mutex_lock( &p_preparser->lock );
> > diff --git a/src/playlist/preparser.h b/src/playlist/preparser.h
> > index fabb57b..996756b 100644
> > --- a/src/playlist/preparser.h
> > +++ b/src/playlist/preparser.h
> > @@ -55,6 +55,14 @@ void playlist_preparser_fetcher_Push(
> > playlist_preparser_t *, input_item_t *,
> >
> > input_item_meta_request_option_t );
> >
> > /**
> > + * This function cancel the preparsing for a given input item.
> > + *
> > + * This does nothing if the input item is already processed or if it
> > was not
> > + * added with playlist_preparser_Push()
> > + */
> > +void playlist_preparser_Cancel( playlist_preparser_t *, input_item_t
> > * );
> > +
> > +/**
> > * This function destroys the preparser object and thread.
> > *
> > * All pending input items will be released.
>
> --
> Rémi Denis-Courmont
> http://www.remlab.net/
> _______________________________________________
> 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