*/
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 */
* 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 )
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;
}
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 )