Store playlist object in instance-specific object
authorClément Stenac <zorglub@videolan.org>
Fri, 15 Sep 2006 16:18:08 +0000 (16:18 +0000)
committerClément Stenac <zorglub@videolan.org>
Fri, 15 Sep 2006 16:18:08 +0000 (16:18 +0000)
configure.ac
include/main.h
include/vlc_playlist.h
src/libvlc.c
src/playlist/engine.c
src/playlist/item.c
src/playlist/thread.c

index b2ea785..84ec22f 100644 (file)
@@ -5507,7 +5507,7 @@ dnl AC_DEFINE_UNQUOTED(MODULE_SUFFIX, "__${VLC_SYMBOL}", [String suffix for modu
 dnl AC_DEFINE_UNQUOTED(MODULE_SYMBOL, ${VLC_SYMBOL}, [Symbol suffix for module functions])
 
 dnl New definitions with value matching 0.8.6 release
-module_symbol="0_8_6b"
+module_symbol="0_8_6c"
 AC_DEFINE_UNQUOTED(MODULE_SUFFIX, "__${module_symbol}", [String suffix for module functions])
 AC_DEFINE_UNQUOTED(MODULE_SYMBOL, $module_symbol, [Symbol suffix for module functions])
 VLC_ENTRY="vlc_entry__${module_symbol}"
index 52bbcff..45c5ffb 100644 (file)
@@ -80,28 +80,26 @@ struct libvlc_int_t
     VLC_COMMON_MEMBERS
 
     /* Global properties */
-    int                    i_argc;           /* command line arguments count */
-    char **                ppsz_argv;              /* command line arguments */
-    char *                 psz_homedir;           /* configuration directory */
-    char *                 psz_userdir;             /* user's home directory */
-    char *                 psz_configfile;        /* location of config file */
+    int                    i_argc;           ///< command line arguments count
+    char **                ppsz_argv;        ///< command line arguments
+    char *                 psz_homedir;      ///< configuration directory
+    char *                 psz_userdir;      ///< user's home directory
+    char *                 psz_configfile;   ///< location of config file
 
-    /* Fast memcpy plugin used */
-    module_t *             p_memcpy_module;
-    void* ( *pf_memcpy ) ( void *, const void *, size_t );
-    void* ( *pf_memset ) ( void *, int, size_t );
+    playlist_t            *p_playlist;       ///< playlist object
 
-    /* Statistics */
-    vlc_bool_t             b_stats;       ///< Should we collect stats
-    /* Timers handling */
+    module_t *             p_memcpy_module;  ///< Fast memcpy plugin used
+    void* ( *pf_memcpy ) ( void *, const void *, size_t ); ///< fast memcpy 
+    void* ( *pf_memset ) ( void *, int, size_t );          ///< fast memset
+
+    vlc_bool_t             b_stats;       ///< Should we collect stats ?
     vlc_mutex_t            timer_lock;    ///< Lock to protect timers
     int                    i_timers;      ///< Number of timers
     counter_t            **pp_timers;     ///< Array of all timers
 
-    /* Locks */
-    vlc_mutex_t            config_lock;          /* lock for the config file */
+    vlc_mutex_t            config_lock;    ///< Lock for the config file
 #ifdef __APPLE__
-    vlc_mutex_t            quicktime_lock;          /* QT is not thread safe on OSX */
+    vlc_mutex_t            quicktime_lock; ///< QT is not thread safe on OSX
 #endif
 
     /* Structure storing the action name / key associations */
index bcad20e..ac041fd 100644 (file)
@@ -201,7 +201,7 @@ struct playlist_add_t
 
 /* Global thread */
 #define playlist_ThreadCreate(a) __playlist_ThreadCreate(VLC_OBJECT(a))
-playlist_t *__playlist_ThreadCreate   ( vlc_object_t * );
+void        __playlist_ThreadCreate   ( vlc_object_t * );
 int           playlist_ThreadDestroy  ( playlist_t * );
 
 /* Helpers */
index 25aa921..8423170 100644 (file)
@@ -244,8 +244,8 @@ int VLC_Create( void )
         return VLC_EGENERIC;
     }
     p_libvlc->thread_id = 0;
-
-    p_libvlc->psz_object_name = "root";
+    p_libvlc->p_playlist = NULL;
+    p_libvlc->psz_object_name = "libvlc";
 
     /* Initialize mutexes */
     vlc_mutex_init( p_libvlc, &p_libvlc->config_lock );
@@ -263,6 +263,13 @@ int VLC_Create( void )
     return p_libvlc->i_object_id;
 }
 
+#define LIBVLC_FUNC \
+    libvlc_int_t * p_libvlc = vlc_current_object( i_object ); \
+    if( !p_libvlc ) return VLC_ENOOBJ;
+#define LIBVLC_FUNC_END \
+    if( i_object ) vlc_object_release( p_libvlc );
+
+
 /*****************************************************************************
  * VLC_Init: initialize a vlc_t structure.
  *****************************************************************************
@@ -290,16 +297,9 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
     char *       psz_language;
 #endif
 #endif
-    libvlc_int_t * p_libvlc = vlc_current_object( i_object );
+    LIBVLC_FUNC;
 
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
-
-    /*
-     * System specific initialization code
-     */
+    /* System specific initialization code */
     system_Init( p_libvlc, &i_argc, ppsz_argv );
 
     /* Get the executable name (similar to the basename command) */
@@ -727,11 +727,9 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
     /* Do a copy (we don't need to modify the strings) */
     memcpy( p_libvlc->p_hotkeys, p_hotkeys, sizeof(p_hotkeys) );
 
-    /*
-     * Initialize playlist and get commandline files
-     */
-    p_playlist = playlist_ThreadCreate( p_libvlc );
-    if( !p_playlist )
+    /* Initialize playlist and get commandline files */
+    playlist_ThreadCreate( p_libvlc );
+    if( !p_libvlc->p_playlist )
     {
         msg_Err( p_libvlc, "playlist initialization failed" );
         if( p_libvlc->p_memcpy_module != NULL )
@@ -742,6 +740,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
         if( i_object ) vlc_object_release( p_libvlc );
         return VLC_EGENERIC;
     }
+    p_playlist = p_libvlc->p_playlist;
 
     psz_modules = config_GetPsz( p_playlist, "services-discovery" );
     if( psz_modules && *psz_modules )
@@ -864,7 +863,7 @@ int VLC_Init( int i_object, int i_argc, char *ppsz_argv[] )
     }
     if ( val.psz_string != NULL ) free( val.psz_string );
 
-    if( i_object ) vlc_object_release( p_libvlc );
+    LIBVLC_FUNC_END;
     return VLC_SUCCESS;
 }
 
@@ -892,16 +891,9 @@ int VLC_AddIntf( int i_object, char const *psz_module,
  *****************************************************************************/
 int VLC_Die( int i_object )
 {
-    libvlc_int_t *p_libvlc = vlc_current_object( i_object );
-
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
-
+    LIBVLC_FUNC;
     p_libvlc->b_die = VLC_TRUE;
-
-    if( i_object ) vlc_object_release( p_libvlc );
+    LIBVLC_FUNC_END;
     return VLC_SUCCESS;
 }
 
@@ -915,17 +907,10 @@ int VLC_CleanUp( int i_object )
     vout_thread_t      * p_vout;
     aout_instance_t    * p_aout;
     announce_handler_t * p_announce;
-    libvlc_int_t *p_libvlc = vlc_current_object( i_object );
+    
+    LIBVLC_FUNC;
 
-    /* Check that the handle is valid */
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
-
-    /*
-     * Ask the interfaces to stop and destroy them
-     */
+    /* Ask the interfaces to stop and destroy them */
     msg_Dbg( p_libvlc, "removing all interfaces" );
     while( (p_intf = vlc_object_find( p_libvlc, VLC_OBJECT_INTF, FIND_CHILD )) )
     {
@@ -935,21 +920,11 @@ int VLC_CleanUp( int i_object )
         intf_Destroy( p_intf );
     }
 
-    /*
-     * Free playlist
-     */
-    msg_Dbg( p_libvlc, "removing playlist handler" );
-    while( (p_playlist = vlc_object_find( p_libvlc, VLC_OBJECT_PLAYLIST,
-                                          FIND_CHILD )) )
-    {
-        vlc_object_detach( p_playlist );
-        vlc_object_release( p_playlist );
-        playlist_ThreadDestroy( p_playlist );
-    }
+    /* Free playlist */
+    msg_Dbg( p_libvlc, "removing playlist" );
+    playlist_ThreadDestroy( p_libvlc->p_playlist );
 
-    /*
-     * Free video outputs
-     */
+    /* Free video outputs */
     msg_Dbg( p_libvlc, "removing all video outputs" );
     while( (p_vout = vlc_object_find( p_libvlc, VLC_OBJECT_VOUT, FIND_CHILD )) )
     {
@@ -958,9 +933,7 @@ int VLC_CleanUp( int i_object )
         vout_Destroy( p_vout );
     }
 
-    /*
-     * Free audio outputs
-     */
+    /* Free audio outputs */
     msg_Dbg( p_libvlc, "removing all audio outputs" );
     while( (p_aout = vlc_object_find( p_libvlc, VLC_OBJECT_AOUT, FIND_CHILD )) )
     {
@@ -972,9 +945,7 @@ int VLC_CleanUp( int i_object )
     stats_TimersDumpAll( p_libvlc );
     stats_TimersClean( p_libvlc );
 
-    /*
-     * Free announce handler(s?)
-     */
+    /* Free announce handler(s?) */
     while( (p_announce = vlc_object_find( p_libvlc, VLC_OBJECT_ANNOUNCE,
                                                  FIND_CHILD ) ) )
     {
@@ -984,8 +955,7 @@ int VLC_CleanUp( int i_object )
         announce_HandlerDestroy( p_announce );
     }
 
-    if( i_object ) vlc_object_release( p_libvlc );
-    return VLC_SUCCESS;
+    LIBVLC_FUNC_END;
 }
 
 /*****************************************************************************
@@ -996,54 +966,24 @@ int VLC_CleanUp( int i_object )
  *****************************************************************************/
 int VLC_Destroy( int i_object )
 {
-    libvlc_int_t *p_libvlc = vlc_current_object( i_object );
-
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
-
-    /*
-     * Free allocated memory
-     */
+    LIBVLC_FUNC;
+    
+    /* Free allocated memory */
     if( p_libvlc->p_memcpy_module )
     {
         module_Unneed( p_libvlc, p_libvlc->p_memcpy_module );
         p_libvlc->p_memcpy_module = NULL;
     }
 
-    /*
-     * Free module bank !
-     */
+    /* Free module bank !  */
     module_EndBank( p_libvlc );
 
-    if( p_libvlc->psz_homedir )
-    {
-        free( p_libvlc->psz_homedir );
-        p_libvlc->psz_homedir = NULL;
-    }
-
-    if( p_libvlc->psz_userdir )
-    {
-        free( p_libvlc->psz_userdir );
-        p_libvlc->psz_userdir = NULL;
-    }
+    FREENULL( p_libvlc->psz_homedir );
+    FREENULL( p_libvlc->psz_userdir );
+    FREENULL( p_libvlc->psz_configfile );
+    FREENULL( p_libvlc->p_hotkeys );
 
-    if( p_libvlc->psz_configfile )
-    {
-        free( p_libvlc->psz_configfile );
-        p_libvlc->psz_configfile = NULL;
-    }
-
-    if( p_libvlc->p_hotkeys )
-    {
-        free( p_libvlc->p_hotkeys );
-        p_libvlc->p_hotkeys = NULL;
-    }
-
-    /*
-     * System specific cleaning code
-     */
+    /* System specific cleaning code */
     system_End( p_libvlc );
 
     /*
@@ -1077,13 +1017,8 @@ int VLC_Destroy( int i_object )
  *****************************************************************************/
 int VLC_VariableSet( int i_object, char const *psz_var, vlc_value_t value )
 {
-    libvlc_int_t *p_libvlc = vlc_current_object( i_object );
     int i_ret;
-
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
+    LIBVLC_FUNC;
 
     /* FIXME: Temporary hack for Mozilla, if variable starts with conf:: then
      * we handle it as a configuration variable. Don't tell Gildas :) -- sam */
@@ -1118,7 +1053,7 @@ int VLC_VariableSet( int i_object, char const *psz_var, vlc_value_t value )
 
     i_ret = var_Set( p_libvlc, psz_var, value );
 
-    if( i_object ) vlc_object_release( p_libvlc );
+    LIBVLC_FUNC_END;
     return i_ret;
 }
 
@@ -1127,17 +1062,10 @@ int VLC_VariableSet( int i_object, char const *psz_var, vlc_value_t value )
  *****************************************************************************/
 int VLC_VariableGet( int i_object, char const *psz_var, vlc_value_t *p_value )
 {
-    libvlc_int_t *p_libvlc = vlc_current_object( i_object );
     int i_ret;
-
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
-
+    LIBVLC_FUNC;
     i_ret = var_Get( p_libvlc , psz_var, p_value );
-
-    if( i_object ) vlc_object_release( p_libvlc );
+    LIBVLC_FUNC_END;
     return i_ret;
 }
 
@@ -1147,13 +1075,7 @@ int VLC_VariableGet( int i_object, char const *psz_var, vlc_value_t *p_value )
 int VLC_VariableType( int i_object, char const *psz_var, int *pi_type )
 {
     int i_type;
-    libvlc_int_t *p_libvlc = vlc_current_object( i_object );
-
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
-
+    LIBVLC_FUNC;
     /* FIXME: Temporary hack for Mozilla, if variable starts with conf:: then
      * we handle it as a configuration variable. Don't tell Gildas :) -- sam */
     if( !strncmp( psz_var, "conf::", 6 ) )
@@ -1187,7 +1109,7 @@ int VLC_VariableType( int i_object, char const *psz_var, int *pi_type )
     else
         i_type = VLC_VAR_TYPE & var_Type( p_libvlc , psz_var );
 
-    if( i_object ) vlc_object_release( p_libvlc );
+    LIBVLC_FUNC_END;
 
     if( i_type > 0 )
     {
@@ -1197,47 +1119,31 @@ int VLC_VariableType( int i_object, char const *psz_var, int *pi_type )
     return VLC_ENOVAR;
 }
 
+#define LIBVLC_PLAYLIST_FUNC \
+    libvlc_int_t *p_libvlc = vlc_current_object( i_object );\
+    if( !p_libvlc || !p_libvlc->p_playlist ) return VLC_ENOOBJ; \
+    vlc_object_yield( p_libvlc->p_playlist );
+
+#define LIBVLC_PLAYLIST_FUNC_END \
+    vlc_object_release( p_libvlc->p_playlist ); \
+    if( i_object ) vlc_object_release( p_libvlc );
+
 /*****************************************************************************
  * VLC_AddTarget: adds a target for playing.
  *****************************************************************************
- * This function adds psz_target to the current playlist. If a playlist does
- * not exist, it will create one.
+ * This function adds psz_target to the playlist
  *****************************************************************************/
+
 int VLC_AddTarget( int i_object, char const *psz_target,
                    char const **ppsz_options, int i_options,
                    int i_mode, int i_pos )
 {
     int i_err;
-    playlist_t *p_playlist;
-    libvlc_int_t *p_libvlc = vlc_current_object( i_object );
-
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
-
-    p_playlist = vlc_object_find( p_libvlc, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
-
-    if( p_playlist == NULL )
-    {
-        msg_Dbg( p_libvlc, "no playlist present, creating one" );
-        p_playlist = playlist_ThreadCreate( p_libvlc );
-
-        if( p_playlist == NULL )
-        {
-            if( i_object ) vlc_object_release( p_libvlc );
-            return VLC_EGENERIC;
-        }
-
-        vlc_object_yield( p_playlist );
-    }
-
-    i_err = playlist_PlaylistAddExt( p_playlist, psz_target, psz_target,
-                             i_mode, i_pos, -1, ppsz_options, i_options);
-
-    vlc_object_release( p_playlist );
-
-    if( i_object ) vlc_object_release( p_libvlc );
+    LIBVLC_PLAYLIST_FUNC;
+    i_err = playlist_PlaylistAddExt( p_libvlc->p_playlist, psz_target,
+                                     psz_target,  i_mode, i_pos, -1,
+                                     ppsz_options, i_options );
+    LIBVLC_PLAYLIST_FUNC_END;
     return i_err;
 }
 
@@ -1246,27 +1152,9 @@ int VLC_AddTarget( int i_object, char const *psz_target,
  *****************************************************************************/
 int VLC_Play( int i_object )
 {
-    playlist_t * p_playlist;
-    libvlc_int_t *p_libvlc = vlc_current_object( i_object );
-
-    /* Check that the handle is valid */
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
-
-    p_playlist = vlc_object_find( p_libvlc, VLC_OBJECT_PLAYLIST, FIND_CHILD );
-
-    if( !p_playlist )
-    {
-        if( i_object ) vlc_object_release( p_libvlc );
-        return VLC_ENOOBJ;
-    }
-
-    playlist_Play( p_playlist );
-    vlc_object_release( p_playlist );
-
-    if( i_object ) vlc_object_release( p_libvlc );
+    LIBVLC_PLAYLIST_FUNC;
+    playlist_Play( p_libvlc->p_playlist );
+    LIBVLC_PLAYLIST_FUNC_END;
     return VLC_SUCCESS;
 }
 
@@ -1275,27 +1163,9 @@ int VLC_Play( int i_object )
  *****************************************************************************/
 int VLC_Pause( int i_object )
 {
-    playlist_t * p_playlist;
-    libvlc_int_t *p_libvlc = vlc_current_object( i_object );
-
-    /* Check that the handle is valid */
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
-
-    p_playlist = vlc_object_find( p_libvlc, VLC_OBJECT_PLAYLIST, FIND_CHILD );
-
-    if( !p_playlist )
-    {
-        if( i_object ) vlc_object_release( p_libvlc );
-        return VLC_ENOOBJ;
-    }
-
-    playlist_Pause( p_playlist );
-    vlc_object_release( p_playlist );
-
-    if( i_object ) vlc_object_release( p_libvlc );
+    LIBVLC_PLAYLIST_FUNC;
+    playlist_Pause( p_libvlc->p_playlist );
+    LIBVLC_PLAYLIST_FUNC_END;
     return VLC_SUCCESS;
 }
 
@@ -1304,27 +1174,9 @@ int VLC_Pause( int i_object )
  *****************************************************************************/
 int VLC_Stop( int i_object )
 {
-    playlist_t * p_playlist;
-    libvlc_int_t *p_libvlc = vlc_current_object( i_object );
-
-    /* Check that the handle is valid */
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
-
-    p_playlist = vlc_object_find( p_libvlc, VLC_OBJECT_PLAYLIST, FIND_CHILD );
-
-    if( !p_playlist )
-    {
-        if( i_object ) vlc_object_release( p_libvlc );
-        return VLC_ENOOBJ;
-    }
-
-    playlist_Stop( p_playlist );
-    vlc_object_release( p_playlist );
-
-    if( i_object ) vlc_object_release( p_libvlc );
+    LIBVLC_PLAYLIST_FUNC;
+    playlist_Stop( p_libvlc->p_playlist );
+    LIBVLC_PLAYLIST_FUNC_END;
     return VLC_SUCCESS;
 }
 
@@ -1333,38 +1185,20 @@ int VLC_Stop( int i_object )
  *****************************************************************************/
 vlc_bool_t VLC_IsPlaying( int i_object )
 {
-    playlist_t * p_playlist;
     vlc_bool_t   b_playing;
 
-    libvlc_int_t *p_libvlc = vlc_current_object( i_object );
-
-    /* Check that the handle is valid */
-    if( !p_libvlc )
-    {
-        return VLC_ENOOBJ;
-    }
-
-    p_playlist = vlc_object_find( p_libvlc, VLC_OBJECT_PLAYLIST, FIND_CHILD );
-
-    if( !p_playlist )
-    {
-        if( i_object ) vlc_object_release( p_libvlc );
-        return VLC_ENOOBJ;
-    }
-
-    if( p_playlist->p_input )
+    LIBVLC_PLAYLIST_FUNC;
+    if( p_libvlc->p_playlist->p_input )
     {
         vlc_value_t  val;
-        var_Get( p_playlist->p_input, "state", &val );
+        var_Get( p_libvlc->p_playlist->p_input, "state", &val );
         b_playing = ( val.i_int == PLAYING_S );
     }
     else
     {
-        b_playing = playlist_IsPlaying( p_playlist );
+        b_playing = playlist_IsPlaying( p_libvlc->p_playlist );
     }
-    vlc_object_release( p_playlist );
-
-    if( i_object ) vlc_object_release( p_libvlc );
+    LIBVLC_PLAYLIST_FUNC_END;
     return b_playing;
 }
 
index 5a9c669..1de73cd 100644 (file)
@@ -53,6 +53,7 @@ playlist_t * playlist_Create( vlc_object_t *p_parent )
         msg_Err( p_parent, "out of memory" );
         return NULL;
     }
+    p_parent->p_libvlc->p_playlist = p_playlist;
 
     VariablesInit( p_playlist );
 
@@ -170,6 +171,7 @@ void playlist_Destroy( playlist_t *p_playlist )
 
     vlc_mutex_destroy( &p_playlist->gc_lock );
     vlc_object_destroy( p_playlist->p_preparse );
+    vlc_object_detach( p_playlist );
     vlc_object_destroy( p_playlist );
 
 }
index 82f1601..44e3004 100644 (file)
@@ -56,9 +56,9 @@ playlist_item_t * playlist_ItemNewWithType( vlc_object_t *p_obj,
 playlist_item_t *__playlist_ItemNewFromInput( vlc_object_t *p_obj,
                                               input_item_t *p_input )
 {
-    /** FIXME !!!!! don't find playlist each time */
-    playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_obj, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE );
     DECMALLOC_NULL( p_item, playlist_item_t );
+    playlist_t *p_playlist = p_obj->p_libvlc->p_playlist;
+    vlc_object_yield( p_playlist );
 
     p_item->p_input = p_input;
     vlc_gc_incref( p_item->p_input );
index 34d127b..78fb70a 100644 (file)
@@ -57,12 +57,12 @@ static void DestroyInteraction( playlist_t * );
  * \param p_parent
  * \return an object with a started thread
  */
-playlist_t * __playlist_ThreadCreate( vlc_object_t *p_parent )
+void __playlist_ThreadCreate( vlc_object_t *p_parent )
 {
     playlist_t *p_playlist;
     p_playlist = CreatePlaylist( p_parent );
 
-    if( !p_playlist ) return NULL;
+    if( !p_playlist ) return;
 
     // Stats
     p_playlist->p_stats = (global_stats_t *)malloc( sizeof( global_stats_t ) );
@@ -78,7 +78,7 @@ playlist_t * __playlist_ThreadCreate( vlc_object_t *p_parent )
     {
         msg_Err( p_playlist, "unable to create preparser" );
         vlc_object_destroy( p_playlist );
-        return NULL;
+        return;
     }
     p_playlist->p_preparse->i_waiting = 0;
     p_playlist->p_preparse->pp_waiting = NULL;
@@ -90,7 +90,7 @@ playlist_t * __playlist_ThreadCreate( vlc_object_t *p_parent )
         msg_Err( p_playlist, "cannot spawn preparse thread" );
         vlc_object_detach( p_playlist->p_preparse );
         vlc_object_destroy( p_playlist->p_preparse );
-        return NULL;
+        return;
     }
 
     // Start the thread
@@ -99,13 +99,13 @@ playlist_t * __playlist_ThreadCreate( vlc_object_t *p_parent )
     {
         msg_Err( p_playlist, "cannot spawn playlist thread" );
         vlc_object_destroy( p_playlist );
-        return NULL;
+        return;
     }
 
     /* The object has been initialized, now attach it */
     vlc_object_attach( p_playlist, p_parent );
 
-    return p_playlist;
+    return;
 }
 
 /**