libvlc_priv_t *priv;
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. */
- if (vlc_threads_init ())
- return NULL;
-
/* Now that the thread system is initialized, we don't have much, but
* at least we have variables */
vlc_mutex_t *lock = var_AcquireMutex( "libvlc" );
vlc_object_release( p_libvlc );
p_libvlc = NULL;
- /* Stop thread system: last one out please shut the door!
- * The number of initializations of the thread system is counted, we
- * can call this each time */
- vlc_threads_end ();
-
return VLC_SUCCESS;
}
#endif
#include <signal.h>
-/*****************************************************************************
- * Global mutex for lazy initialization of the threads system
- *****************************************************************************/
-static volatile unsigned i_initializations = 0;
-
#if defined( LIBVLC_USE_PTHREAD )
# include <sched.h>
-
-static pthread_mutex_t once_mutex = PTHREAD_MUTEX_INITIALIZER;
#else
static vlc_threadvar_t cancel_key;
#endif
{
vlc_dictionary_t list;
vlc_mutex_t lock;
-} named_mutexes;
+} named_mutexes = {
+ { 0, NULL, },
+#ifdef LIBVLC_USE_PTHREAD
+ PTHREAD_MUTEX_INITIALIZER,
+#endif
+};
#ifdef HAVE_EXECINFO_H
# include <execinfo.h>
# define VLC_CANCEL_INIT { NULL, true, false }
#endif
-/*****************************************************************************
- * vlc_threads_init: initialize threads system
- *****************************************************************************
- * This function requires lazy initialization of a global lock in order to
- * keep the library really thread-safe. Some architectures don't support this
- * and thus do not guarantee the complete reentrancy.
- *****************************************************************************/
-int vlc_threads_init( void )
+#ifdef WIN32
+BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
{
- /* If we have lazy mutex initialization, use it. Otherwise, we just
- * hope nothing wrong happens. */
-#if defined( LIBVLC_USE_PTHREAD )
- pthread_mutex_lock( &once_mutex );
-#endif
+ (void) hinstDll;
+ (void) lpvReserved;
- if( i_initializations == 0 )
+ switch (fdwReason)
{
- vlc_dictionary_init (&named_mutexes.list, 0);
- vlc_mutex_init (&named_mutexes.lock);
-#ifndef LIBVLC_USE_PTHREAD_CANCEL
- vlc_threadvar_create( &cancel_key, free );
-#endif
- }
- i_initializations++;
-
-#if defined( LIBVLC_USE_PTHREAD )
- pthread_mutex_unlock( &once_mutex );
-#endif
-
- return VLC_SUCCESS;
-}
-
-/*****************************************************************************
- * vlc_threads_end: stop threads system
- *****************************************************************************
- * FIXME: This function is far from being threadsafe.
- *****************************************************************************/
-void vlc_threads_end( void )
-{
-#if defined( LIBVLC_USE_PTHREAD )
- pthread_mutex_lock( &once_mutex );
-#endif
-
- assert( i_initializations > 0 );
+ case DLL_PROCESS_ATTACH:
+ vlc_dictionary_init (&named_mutexes.list, 0);
+ vlc_mutex_init (&named_mutexes.lock);
+ vlc_threadvar_create (&cancel_key, free);
+ break;
- if( i_initializations == 1 )
- {
-#ifndef LIBVLC_USE_PTHREAD
- vlc_threadvar_delete( &cancel_key );
-#endif
- vlc_mutex_destroy (&named_mutexes.lock);
- vlc_dictionary_clear (&named_mutexes.list);
+ case DLL_PROCESS_DETACH:
+ vlc_threadvar_delete( &cancel_key );
+ vlc_mutex_destroy (&named_mutexes.lock);
+ vlc_dictionary_clear (&named_mutexes.list);
+ break;
}
- i_initializations--;
-
-#if defined( LIBVLC_USE_PTHREAD )
- pthread_mutex_unlock( &once_mutex );
-#endif
+ return TRUE;
}
+#endif
#if defined (__GLIBC__) && (__GLIBC_MINOR__ < 6)
/* This is not prototyped under glibc, though it exists. */