]> git.sesse.net Git - vlc/commitdiff
Simplify threads init
authorRémi Denis-Courmont <rem@videolan.org>
Sat, 3 May 2008 08:33:11 +0000 (11:33 +0300)
committerRémi Denis-Courmont <rem@videolan.org>
Sat, 3 May 2008 08:38:44 +0000 (11:38 +0300)
src/libvlc-common.c
src/misc/threads.c

index 7831340b79e74d444960cd2ea2e7a638bfa81702..638bc3305817c3750bf3f037c748ec216082d445 100644 (file)
@@ -151,14 +151,13 @@ libvlc_int_t * vlc_current_object( int i_object )
  */
 libvlc_int_t * libvlc_InternalCreate( void )
 {
-    int i_ret;
     libvlc_int_t * p_libvlc = NULL;
     char *psz_env = NULL;
 
     /* vlc_threads_init *must* be the first internal call! No other call is
      * allowed before the thread system has been initialized. */
-    i_ret = vlc_threads_init( p_libvlc_global );
-    if( i_ret < 0 ) return NULL;
+    if( vlc_threads_init( p_libvlc_global ) )
+        return NULL;
 
     /* Now that the thread system is initialized, we don't have much, but
      * at least we have variables */
index 534c806ae7672355d668fe20beb2400ed1cad7f9..5bf2fa81e2807ed375259bb3c21900c2f9f26efb 100644 (file)
@@ -45,7 +45,6 @@
  * Global mutex for lazy initialization of the threads system
  *****************************************************************************/
 static volatile unsigned i_initializations = 0;
-static volatile int i_status = VLC_THREADS_UNINITIALIZED;
 static vlc_object_t *p_root;
 
 #if defined( UNDER_CE )
@@ -130,53 +129,32 @@ int __vlc_threads_init( vlc_object_t *p_this )
     pthread_mutex_lock( &once_mutex );
 #endif
 
-    if( i_status == VLC_THREADS_UNINITIALIZED )
+    if( i_initializations == 0 )
     {
-        i_status = VLC_THREADS_PENDING;
-
         /* We should be safe now. Do all the initialization stuff we want. */
         p_libvlc_global->b_ready = false;
 
         p_root = vlc_custom_create( VLC_OBJECT(p_libvlc_global), 0,
                                     VLC_OBJECT_GLOBAL, "global" );
         if( p_root == NULL )
-            i_ret = VLC_ENOMEM;
-
-        if( i_ret )
-        {
-            i_status = VLC_THREADS_ERROR;
-        }
-        else
         {
-            i_initializations++;
-            i_status = VLC_THREADS_READY;
+            i_ret = VLC_ENOMEM;
+            goto out;
         }
-
         vlc_threadvar_create( p_root, &msg_context_global_key );
     }
-    else
-    {
-        /* Just increment the initialization count */
-        i_initializations++;
-    }
+    i_initializations++;
 
-    /* If we have lazy mutex initialization support, unlock the mutex;
-     * otherwize, do a naive wait loop. */
+out:
+    /* If we have lazy mutex initialization support, unlock the mutex.
+     * Otherwize, we are screwed. */
 #if defined( UNDER_CE )
-    while( i_status == VLC_THREADS_PENDING ) msleep( THREAD_SLEEP );
 #elif defined( WIN32 )
-    while( i_status == VLC_THREADS_PENDING ) msleep( THREAD_SLEEP );
 #elif defined( HAVE_KERNEL_SCHEDULER_H )
-    while( i_status == VLC_THREADS_PENDING ) msleep( THREAD_SLEEP );
 #elif defined( LIBVLC_USE_PTHREAD )
     pthread_mutex_unlock( &once_mutex );
 #endif
 
-    if( i_status != VLC_THREADS_READY )
-    {
-        return VLC_ETHREAD;
-    }
-
     return i_ret;
 }
 
@@ -195,15 +173,9 @@ int __vlc_threads_end( vlc_object_t *p_this )
     pthread_mutex_lock( &once_mutex );
 #endif
 
-    if( i_initializations == 0 )
-        return VLC_EGENERIC;
-
-    i_initializations--;
-    if( i_initializations == 0 )
-    {
-        i_status = VLC_THREADS_UNINITIALIZED;
+    assert( i_initializations > 0 );
+    if( --i_initializations == 0 )
         vlc_object_release( p_root );
-    }
 
 #if defined( UNDER_CE )
 #elif defined( WIN32 )