From f79f2b1f5bcd38dc33520220f72143a91202b1d5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 5 Oct 2008 10:38:49 +0300 Subject: [PATCH] Remove vlc_threads_(init|end), fix thread-safety on Win32 --- src/libvlc.c | 10 ------ src/libvlc.h | 2 -- src/misc/threads.c | 84 +++++++++++++--------------------------------- 3 files changed, 23 insertions(+), 73 deletions(-) diff --git a/src/libvlc.c b/src/libvlc.c index b12dfa23f9..00bcf0b611 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -238,11 +238,6 @@ libvlc_int_t * libvlc_InternalCreate( void ) 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" ); @@ -1161,11 +1156,6 @@ int libvlc_InternalDestroy( libvlc_int_t *p_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; } diff --git a/src/libvlc.h b/src/libvlc.h index 6cd9a0d93f..c531a4d9c3 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -45,8 +45,6 @@ void system_End ( libvlc_int_t * ); /* * Threads subsystem */ -int vlc_threads_init( void ); -void vlc_threads_end( void ); /* Hopefully, no need to export this. There is a new thread API instead. */ void vlc_thread_cancel (vlc_object_t *); diff --git a/src/misc/threads.c b/src/misc/threads.c index 5a638f270c..6aba14a3f0 100644 --- a/src/misc/threads.c +++ b/src/misc/threads.c @@ -39,15 +39,8 @@ #endif #include -/***************************************************************************** - * Global mutex for lazy initialization of the threads system - *****************************************************************************/ -static volatile unsigned i_initializations = 0; - #if defined( LIBVLC_USE_PTHREAD ) # include - -static pthread_mutex_t once_mutex = PTHREAD_MUTEX_INITIALIZER; #else static vlc_threadvar_t cancel_key; #endif @@ -56,7 +49,12 @@ static struct { 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 @@ -158,65 +156,29 @@ typedef struct vlc_cancel_t # 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. */ -- 2.39.2