/************************************************************************** * uninstall_media_player_observer (private) **************************************************************************/ static void uninstall_media_player_observer(libvlc_media_list_player_t * p_mlp) { assert_locked(p_mlp); // Allow callbacks to run, because detach() will wait until all callbacks are processed. // This is safe because only callbacks are allowed, and there execution will be cancelled. vlc_mutex_unlock(&p_mlp->mp_callback_lock); libvlc_event_detach(mplayer_em(p_mlp), libvlc_MediaPlayerEndReached, media_player_reached_end, p_mlp); // Now, lock back the callback lock. No more callback will be present from this point. vlc_mutex_lock(&p_mlp->mp_callback_lock); // What is here is safe, because we guarantee that we won't be able to anything concurrently, // - except (cancelled) callbacks - thanks to the object_lock. }
/************************************************************************** * install_media_player_observer (private) **************************************************************************/ static void install_media_player_observer(libvlc_media_list_player_t * p_mlp) { assert_locked(p_mlp); libvlc_event_attach_async(mplayer_em(p_mlp), libvlc_MediaPlayerEndReached, media_player_reached_end, p_mlp, NULL); }