[vlc-devel] [PATCH v2 8/9] libvlc: player: make stop synchronous

Thomas Guillem thomas at gllm.fr
Fri May 17 20:22:03 CEST 2019



On Fri, May 17, 2019, at 11:32, Steve Lhomme wrote:
> On 2019-05-17 10:58, Romain Vimont wrote:
> > On Wed, May 15, 2019 at 01:31:14PM +0300, Rémi Denis-Courmont wrote:
> >> Hi,
> >>
> >> This looks like it'll dead lock if more than one thread calls the stop. Not sure if that worked in the current code or not.
> > 
> > Yes, this is incorrect in that case.
> > 
> > But since the callbacks are called with player locked, we necessarily
> > need to unlock the player one way or another to wait for the "stopped"
> > event.
> > 
> > An alternative is to use a condition variable with the player mutex:
> > 
> >      vlc_player_Lock(player);
> >      bool stop_async = vlc_player_Stop(player);
> >      if (stop_async)
> >           vlc_player_CondWait(player, &p_mi->cond_stop);
> >      vlc_player_Unlock(player);
> > 
> > But this is still not correct, because others vlc_player_Start() and
> > vlc_player_Stop() can be executed during vlc_player_CondWait().
> > 
> > The problem is that we can't associate a specific stop request with the
> > right "player state change to stopped", so we would wake up all threads
> > waiting for stop on the first "state change to stopped".
> > 
> > Since we don't want synchronous stop anymore (it was just for backward
> > compatibility), I suggest we just make libvlc_media_player_stop()
> > asynchronous.
> > 
> > And we document breaking changes from libvlc 3 to libvlc 4:
> > - libvlc_media_player_will_play() is removed (it is meaningless with the
> >    new player)
> > - libvlc_media_player callbacks are called with the same (recursive)
> >    mutex as libvlc_media_player functions
> > - libvlc_media_player_stop is now asynchronous (it was the only blocking
> >    function, it does not block anymore)
> 
> IMO it's better to use a different name. You don't want old code to use 
> the new behaviour incorrectly. Unless the signature of the function is 
> different, then it shouldn't compile (but will wrappers in other 
> languages notice?). IMO just remove the old behaviour and use a new name.

 +1
Remove stop and add stop_async.

Is it possible with some macros to trigger an "#error use the stop_async version" ?

> 
> >> Le 15 mai 2019 12:53:16 GMT+03:00, Romain Vimont <rom1v at videolabs.io> a écrit :
> >>> To preserve the old behavior, make libvlc_media_player_stop()
> >>> synchronous.
> >>> ---
> >>> lib/media_player.c          | 13 ++++++++++++-
> >>> lib/media_player_internal.h |  3 +++
> >>> 2 files changed, 15 insertions(+), 1 deletion(-)
> >>>
> >>> diff --git a/lib/media_player.c b/lib/media_player.c
> >>> index 17d675e93b..e5f6fc32a7 100644
> >>> --- a/lib/media_player.c
> >>> +++ b/lib/media_player.c
> >>> @@ -108,6 +108,8 @@ on_state_changed(vlc_player_t *player, enum
> >>> vlc_player_state new_state,
> >>>      switch (new_state) {
> >>>          case VLC_PLAYER_STATE_STOPPED:
> >>>              event.type = libvlc_MediaPlayerStopped;
> >>> +            if (mp->stop_requested)
> >>> +                vlc_sem_post(&mp->sem_stop);
> >>>              break;
> >>>          case VLC_PLAYER_STATE_STOPPING:
> >>>              event.type = libvlc_MediaPlayerEndReached;
> >>> @@ -715,6 +717,9 @@ libvlc_media_player_new( libvlc_instance_t
> >>> *instance )
> >>>
> >>>      vlc_player_Unlock(mp->player);
> >>>
> >>> +    vlc_sem_init(&mp->sem_stop, 0);
> >>> +    mp->stop_requested = false;
> >>> +
> >>>      mp->i_refcount = 1;
> >>>      libvlc_event_manager_init(&mp->event_manager, mp);
> >>>
> >>> @@ -796,6 +801,8 @@ static void libvlc_media_player_destroy(
> >>> libvlc_media_player_t *p_mi )
> >>>      libvlc_event_manager_destroy(&p_mi->event_manager);
> >>>      libvlc_media_release( p_mi->p_md );
> >>>
> >>> +    vlc_sem_destroy(&p_mi->sem_stop);
> >>> +
> >>> vlc_http_cookie_jar_t *cookies = var_GetAddress( p_mi, "http-cookies"
> >>> );
> >>>      if ( cookies )
> >>>      {
> >>> @@ -972,9 +979,13 @@ void libvlc_media_player_stop(
> >>> libvlc_media_player_t *p_mi )
> >>>      vlc_player_t *player = p_mi->player;
> >>>      vlc_player_Lock(player);
> >>>
> >>> -    vlc_player_Stop(player);
> >>> +    bool stop_async = vlc_player_Stop(player);
> >>> +    p_mi->stop_requested = stop_async;
> >>>
> >>>      vlc_player_Unlock(player);
> >>> +
> >>> +    if (stop_async)
> >>> +        vlc_sem_wait(&p_mi->sem_stop);
> >>> }
> >>>
> >>> int libvlc_media_player_set_renderer( libvlc_media_player_t *p_mi,
> >>> diff --git a/lib/media_player_internal.h b/lib/media_player_internal.h
> >>> index c2d5348e22..a0c712780d 100644
> >>> --- a/lib/media_player_internal.h
> >>> +++ b/lib/media_player_internal.h
> >>> @@ -49,6 +49,9 @@ struct libvlc_media_player_t
> >>>     struct libvlc_instance_t * p_libvlc_instance; /* Parent instance */
> >>>      libvlc_media_t * p_md; /* current media descriptor */
> >>>      libvlc_event_manager_t event_manager;
> >>> +
> >>> +    vlc_sem_t sem_stop;
> >>> +    bool stop_requested;
> >>> };
> >>>
> >>> libvlc_track_description_t * libvlc_get_track_description(
> >>> -- 
> >>> 2.20.1
> >>>
> >>> _______________________________________________
> >>> vlc-devel mailing list
> >>> To unsubscribe or modify your subscription options:
> >>> https://mailman.videolan.org/listinfo/vlc-devel
> >>
> >> -- 
> >> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
> > 
> >> _______________________________________________
> >> vlc-devel mailing list
> >> To unsubscribe or modify your subscription options:
> >> https://mailman.videolan.org/listinfo/vlc-devel
> > 
> > _______________________________________________
> > vlc-devel mailing list
> > To unsubscribe or modify your subscription options:
> > https://mailman.videolan.org/listinfo/vlc-devel
> > 
> _______________________________________________
> 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