[vlc-devel] commit: Remove vlc_threads_(init|end), fix thread-safety on Win32 ( Rémi Denis-Courmont )
git version control
git at videolan.org
Sun Oct 5 09:39:21 CEST 2008
vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Sun Oct 5 10:38:49 2008 +0300| [f79f2b1f5bcd38dc33520220f72143a91202b1d5] | committer: Rémi Denis-Courmont
Remove vlc_threads_(init|end), fix thread-safety on Win32
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f79f2b1f5bcd38dc33520220f72143a91202b1d5
---
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 b12dfa2..00bcf0b 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 6cd9a0d..c531a4d 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 5a638f2..6aba14a 100644
--- a/src/misc/threads.c
+++ b/src/misc/threads.c
@@ -39,15 +39,8 @@
#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
@@ -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 <execinfo.h>
@@ -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. */
More information about the vlc-devel
mailing list