]> git.sesse.net Git - vlc/blobdiff - src/misc/threads.c
Remove dead code
[vlc] / src / misc / threads.c
index ee94993ea6f34b93ce0d509ab4773e2bfd3c73af..ed6dbc2ec9f8e98c0df62d6d4aaf488a70f9cc78 100644 (file)
@@ -101,14 +101,13 @@ void vlc_pthread_fatal (const char *action, int error,
 {
     fprintf (stderr, "LibVLC fatal error %s in thread %lu at %s:%u: %d\n",
              action, vlc_threadid (), file, line, error);
-    fflush (stderr);
 
     /* Sometimes strerror_r() crashes too, so make sure we print an error
      * message before we invoke it */
 #ifdef __GLIBC__
     /* Avoid the strerror_r() prototype brain damage in glibc */
     errno = error;
-    dprintf (2, " Error message: %m at:\n");
+    fprintf (stderr, " Error message: %m at:\n");
 #else
     char buf[1000];
     const char *msg;
@@ -126,8 +125,8 @@ void vlc_pthread_fatal (const char *action, int error,
             break;
     }
     fprintf (stderr, " Error message: %s\n", msg);
-    fflush (stderr);
 #endif
+    fflush (stderr);
 
 #ifdef HAVE_BACKTRACE
     void *stack[20];
@@ -165,7 +164,7 @@ int vlc_threads_init( void )
 
     if( i_initializations == 0 )
     {
-        p_root = vlc_custom_create( NULL, sizeof( *p_root ),
+        p_root = vlc_custom_create( (vlc_object_t *)NULL, sizeof( *p_root ),
                                     VLC_OBJECT_GENERIC, "root" );
         if( p_root == NULL )
         {
@@ -467,6 +466,12 @@ static THREAD_RTYPE thread_entry (void *data)
     msg_Dbg (obj, "thread started");
     func (obj);
     msg_Dbg (obj, "thread ended");
+
+    libvlc_priv_t *libpriv = libvlc_priv (obj->p_libvlc);
+    vlc_mutex_lock (&libpriv->threads_lock);
+    if (--libpriv->threads_count == 0)
+        vlc_cond_signal (&libpriv->threads_wait);
+    vlc_mutex_unlock (&libpriv->threads_lock);
     return THREAD_RVAL;
 }
 
@@ -482,6 +487,7 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
 {
     int i_ret;
     vlc_object_internals_t *p_priv = vlc_internals( p_this );
+    libvlc_priv_t *libpriv = libvlc_priv (p_this->p_libvlc);
 
     struct vlc_thread_boot *boot = malloc (sizeof (*boot));
     if (boot == NULL)
@@ -489,6 +495,10 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
     boot->entry = func;
     boot->object = p_this;
 
+    vlc_mutex_lock (&libpriv->threads_lock);
+    libpriv->threads_count++;
+    vlc_mutex_unlock (&libpriv->threads_lock);
+
     vlc_object_lock( p_this );
 
 #if defined( LIBVLC_USE_PTHREAD )
@@ -596,6 +606,14 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
     }
 
     vlc_object_unlock( p_this );
+
+    if (i_ret)
+    {
+        vlc_mutex_lock (&libpriv->threads_lock);
+        if (--libpriv->threads_count == 0)
+            vlc_cond_signal (&libpriv->threads_wait);
+        vlc_mutex_unlock (&libpriv->threads_lock);
+    }
     return i_ret;
 }
 
@@ -657,14 +675,6 @@ int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
     return 0;
 }
 
-/*****************************************************************************
- * vlc_thread_ready: tell the parent thread we were successfully spawned
- *****************************************************************************/
-void __vlc_thread_ready( vlc_object_t *p_this )
-{
-    vlc_object_signal( p_this );
-}
-
 /*****************************************************************************
  * vlc_thread_join: wait until a thread exits, inner version
  *****************************************************************************/
@@ -677,7 +687,10 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
     /* Make sure we do return if we are calling vlc_thread_join()
      * from the joined thread */
     if (pthread_equal (pthread_self (), p_priv->thread_id))
+    {
+        msg_Warn (p_this, "joining the active thread (VLC might crash)");
         i_ret = pthread_detach (p_priv->thread_id);
+    }
     else
         i_ret = pthread_join (p_priv->thread_id, NULL);