*****************************************************************************/
static vlc_mutex_t structure_lock;
-void *vlc_custom_create( vlc_object_t *p_this, size_t i_size,
- int i_type, const char *psz_type )
+void *__vlc_custom_create( vlc_object_t *p_this, size_t i_size,
+ int i_type, const char *psz_type )
{
vlc_object_t *p_new;
vlc_object_internals_t *p_priv;
/* If we are running on a thread, wait until it ends */
if( p_priv->b_thread )
+ {
+ msg_Warn (p_this->p_libvlc, /* do NOT use a dead object for logging! */
+ "%s %d destroyed while thread alive (VLC might crash)",
+ p_this->psz_object_type, p_this->i_object_id);
vlc_thread_join( p_this );
+ }
/* Call the custom "subclass" destructor */
if( p_priv->pf_destructor )
if( p_this->p_libvlc == NULL )
{
+#ifndef NDEBUG
libvlc_global_data_t *p_global = (libvlc_global_data_t *)p_this;
-#ifndef NDEBUG
assert( p_global == vlc_global() );
/* Test for leaks */
if (p_priv->next != p_this)
}
-/**
- * Checks whether an object has been "killed".
- * The object lock must be held.
- *
- * Typical code for an object thread could be:
- *
- vlc_object_lock (self);
- ...initialization...
- while (vlc_object_alive (self))
- {
- ...preprocessing...
-
- vlc_object_wait (self);
-
- ...postprocessing...
- }
- ...deinitialization...
- vlc_object_unlock (self);
- *
- *
- * @return true iff the object has not been killed yet
- */
-bool __vlc_object_alive( vlc_object_t *obj )
-{
- vlc_assert_locked( &(vlc_internals(obj)->lock) );
- return !obj->b_die;
-}
-
-
/**
* Signals an object for which the lock is held.
* At least one thread currently sleeping in vlc_object_wait() or
}
vlc_object_signal_unlocked( p_this );
+ /* This also serves as a memory barrier toward vlc_object_alive(): */
vlc_object_unlock( p_this );
}