[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