Commit f79f2b1f authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Remove vlc_threads_(init|end), fix thread-safety on Win32

parent 43b5fcef
...@@ -238,11 +238,6 @@ libvlc_int_t * libvlc_InternalCreate( void ) ...@@ -238,11 +238,6 @@ libvlc_int_t * libvlc_InternalCreate( void )
libvlc_priv_t *priv; libvlc_priv_t *priv;
char *psz_env = 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. */
if (vlc_threads_init ())
return NULL;
/* Now that the thread system is initialized, we don't have much, but /* Now that the thread system is initialized, we don't have much, but
* at least we have variables */ * at least we have variables */
vlc_mutex_t *lock = var_AcquireMutex( "libvlc" ); vlc_mutex_t *lock = var_AcquireMutex( "libvlc" );
...@@ -1161,11 +1156,6 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc ) ...@@ -1161,11 +1156,6 @@ int libvlc_InternalDestroy( libvlc_int_t *p_libvlc )
vlc_object_release( p_libvlc ); vlc_object_release( p_libvlc );
p_libvlc = NULL; 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; return VLC_SUCCESS;
} }
......
...@@ -45,8 +45,6 @@ void system_End ( libvlc_int_t * ); ...@@ -45,8 +45,6 @@ void system_End ( libvlc_int_t * );
/* /*
* Threads subsystem * 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. */ /* Hopefully, no need to export this. There is a new thread API instead. */
void vlc_thread_cancel (vlc_object_t *); void vlc_thread_cancel (vlc_object_t *);
......
...@@ -39,15 +39,8 @@ ...@@ -39,15 +39,8 @@
#endif #endif
#include <signal.h> #include <signal.h>
/*****************************************************************************
* Global mutex for lazy initialization of the threads system
*****************************************************************************/
static volatile unsigned i_initializations = 0;
#if defined( LIBVLC_USE_PTHREAD ) #if defined( LIBVLC_USE_PTHREAD )
# include <sched.h> # include <sched.h>
static pthread_mutex_t once_mutex = PTHREAD_MUTEX_INITIALIZER;
#else #else
static vlc_threadvar_t cancel_key; static vlc_threadvar_t cancel_key;
#endif #endif
...@@ -56,7 +49,12 @@ static struct ...@@ -56,7 +49,12 @@ static struct
{ {
vlc_dictionary_t list; vlc_dictionary_t list;
vlc_mutex_t lock; vlc_mutex_t lock;
} named_mutexes; } named_mutexes = {
{ 0, NULL, },
#ifdef LIBVLC_USE_PTHREAD
PTHREAD_MUTEX_INITIALIZER,
#endif
};
#ifdef HAVE_EXECINFO_H #ifdef HAVE_EXECINFO_H
# include <execinfo.h> # include <execinfo.h>
...@@ -158,65 +156,29 @@ typedef struct vlc_cancel_t ...@@ -158,65 +156,29 @@ typedef struct vlc_cancel_t
# define VLC_CANCEL_INIT { NULL, true, false } # define VLC_CANCEL_INIT { NULL, true, false }
#endif #endif
/***************************************************************************** #ifdef WIN32
* vlc_threads_init: initialize threads system BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
*****************************************************************************
* 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 )
{ {
/* If we have lazy mutex initialization, use it. Otherwise, we just (void) hinstDll;
* hope nothing wrong happens. */ (void) lpvReserved;
#if defined( LIBVLC_USE_PTHREAD )
pthread_mutex_lock( &once_mutex );
#endif
if( i_initializations == 0 ) switch (fdwReason)
{ {
vlc_dictionary_init (&named_mutexes.list, 0); case DLL_PROCESS_ATTACH:
vlc_mutex_init (&named_mutexes.lock); vlc_dictionary_init (&named_mutexes.list, 0);
#ifndef LIBVLC_USE_PTHREAD_CANCEL vlc_mutex_init (&named_mutexes.lock);
vlc_threadvar_create( &cancel_key, free ); vlc_threadvar_create (&cancel_key, free);
#endif break;
}
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 );
if( i_initializations == 1 ) case DLL_PROCESS_DETACH:
{ vlc_threadvar_delete( &cancel_key );
#ifndef LIBVLC_USE_PTHREAD vlc_mutex_destroy (&named_mutexes.lock);
vlc_threadvar_delete( &cancel_key ); vlc_dictionary_clear (&named_mutexes.list);
#endif break;
vlc_mutex_destroy (&named_mutexes.lock);
vlc_dictionary_clear (&named_mutexes.list);
} }
i_initializations--; return TRUE;
#if defined( LIBVLC_USE_PTHREAD )
pthread_mutex_unlock( &once_mutex );
#endif
} }
#endif
#if defined (__GLIBC__) && (__GLIBC_MINOR__ < 6) #if defined (__GLIBC__) && (__GLIBC_MINOR__ < 6)
/* This is not prototyped under glibc, though it exists. */ /* This is not prototyped under glibc, though it exists. */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment