/** * Destroy playlist. * This is not thread-safe. Any reference to the playlist is assumed gone. * (In particular, all interface and services threads must have been joined). * * \param p_playlist the playlist object */ void playlist_Destroy( playlist_t *p_playlist ) { playlist_private_t *p_sys = pl_priv(p_playlist); /* Remove all services discovery */ playlist_ServicesDiscoveryKillAll( p_playlist ); msg_Dbg( p_playlist, "destroying" ); playlist_Deactivate( p_playlist ); if( p_sys->p_preparser ) playlist_preparser_Delete( p_sys->p_preparser ); /* Release input resources */ assert( p_sys->p_input == NULL ); input_resource_Release( p_sys->p_input_resource ); if( p_playlist->p_media_library != NULL ) playlist_MLDump( p_playlist ); PL_LOCK; /* Release the current node */ set_current_status_node( p_playlist, NULL ); /* Release the current item */ set_current_status_item( p_playlist, NULL ); PL_UNLOCK; vlc_cond_destroy( &p_sys->signal ); vlc_mutex_destroy( &p_sys->lock ); /* Remove all remaining items */ FOREACH_ARRAY( playlist_item_t *p_del, p_playlist->all_items ) free( p_del->pp_children ); vlc_gc_decref( p_del->p_input ); free( p_del ); FOREACH_END(); ARRAY_RESET( p_playlist->all_items ); FOREACH_ARRAY( playlist_item_t *p_del, p_sys->items_to_delete ) free( p_del->pp_children ); vlc_gc_decref( p_del->p_input ); free( p_del ); FOREACH_END(); ARRAY_RESET( p_sys->items_to_delete ); ARRAY_RESET( p_playlist->items ); ARRAY_RESET( p_playlist->current ); vlc_http_cookie_jar_t *cookies = var_GetAddress( p_playlist, "http-cookies" ); if ( cookies ) { var_Destroy( p_playlist, "http-cookies" ); vlc_http_cookies_destroy( cookies ); } vlc_object_release( p_playlist ); }
/** * Cleanup a libvlc instance. The instance is not completely deallocated * \param p_libvlc the instance to clean */ void libvlc_InternalCleanup( libvlc_int_t *p_libvlc ) { libvlc_priv_t *priv = libvlc_priv (p_libvlc); /* Ask the interfaces to stop and destroy them */ msg_Dbg( p_libvlc, "removing all interfaces" ); libvlc_Quit( p_libvlc ); intf_DestroyAll( p_libvlc ); #ifdef ENABLE_VLM /* Destroy VLM if created in libvlc_InternalInit */ if( priv->p_vlm ) { vlm_Delete( priv->p_vlm ); } #endif /* Free playlist now, all threads are gone */ playlist_t *p_playlist = libvlc_priv (p_libvlc)->p_playlist; if( p_playlist != NULL ) playlist_Destroy( p_playlist ); #if !defined( _WIN32 ) && !defined( __OS2__ ) char *pidfile = var_InheritString( p_libvlc, "pidfile" ); if( pidfile != NULL ) { msg_Dbg( p_libvlc, "removing PID file %s", pidfile ); if( unlink( pidfile ) ) msg_Warn( p_libvlc, "cannot remove PID file %s: %s", pidfile, vlc_strerror_c(errno) ); free( pidfile ); } #endif if (priv->parser != NULL) playlist_preparser_Delete(priv->parser); vlc_DeinitActions( p_libvlc, priv->actions ); /* Save the configuration */ if( !var_InheritBool( p_libvlc, "ignore-config" ) ) config_AutoSaveConfigFile( VLC_OBJECT(p_libvlc) ); /* Free module bank. It is refcounted, so we call this each time */ module_EndBank (true); vlc_LogDeinit (p_libvlc); #if defined(_WIN32) || defined(__OS2__) system_End( ); #endif }