[vlc-devel] commit: Static mutexes ( Rémi Denis-Courmont )
git version control
git at videolan.org
Sun Oct 5 11:41:27 CEST 2008
vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Sun Oct 5 11:19:00 2008 +0300| [917aae7612c883ba009bff10242abcdb009bead2] | committer: Rémi Denis-Courmont
Static mutexes
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=917aae7612c883ba009bff10242abcdb009bead2
---
include/vlc_threads.h | 7 +++++--
src/misc/threads.c | 16 ++++++++++++++++
2 files changed, 21 insertions(+), 2 deletions(-)
diff --git a/include/vlc_threads.h b/include/vlc_threads.h
index 374d01d..4ab92c2 100644
--- a/include/vlc_threads.h
+++ b/include/vlc_threads.h
@@ -105,6 +105,7 @@
#if defined (LIBVLC_USE_PTHREAD)
typedef pthread_t vlc_thread_t;
typedef pthread_mutex_t vlc_mutex_t;
+#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER
typedef pthread_cond_t vlc_cond_t;
typedef pthread_key_t vlc_threadvar_t;
@@ -119,8 +120,10 @@ typedef struct
typedef struct
{
CRITICAL_SECTION mutex;
-}
-vlc_mutex_t;
+ LONG initialized;
+} vlc_mutex_t;
+#define VLC_STATIC_MUTEX { .initialized = 0, }
+
typedef HANDLE vlc_cond_t;
typedef DWORD vlc_threadvar_t;
diff --git a/src/misc/threads.c b/src/misc/threads.c
index 6aba14a..8d7f9ba 100644
--- a/src/misc/threads.c
+++ b/src/misc/threads.c
@@ -157,6 +157,8 @@ typedef struct vlc_cancel_t
#endif
#ifdef WIN32
+static vlc_mutex_t super_mutex;
+
BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
{
(void) hinstDll;
@@ -167,11 +169,13 @@ BOOL WINAPI DllMain (HINSTANCE hinstDll, DWORD fdwReason, LPVOID lpvReserved)
case DLL_PROCESS_ATTACH:
vlc_dictionary_init (&named_mutexes.list, 0);
vlc_mutex_init (&named_mutexes.lock);
+ vlc_mutex_init (&super_mutex);
vlc_threadvar_create (&cancel_key, free);
break;
case DLL_PROCESS_DETACH:
vlc_threadvar_delete( &cancel_key );
+ vlc_mutex_destroy (&super_mutex);
vlc_mutex_destroy (&named_mutexes.lock);
vlc_dictionary_clear (&named_mutexes.list);
break;
@@ -238,6 +242,8 @@ int vlc_mutex_init_recursive( vlc_mutex_t *p_mutex )
#elif defined( WIN32 )
InitializeCriticalSection( &p_mutex->mutex );
+ InterlockedIncrement (&p_mutex->initialized);
+ barrier ();
return 0;
#endif
@@ -257,6 +263,7 @@ void vlc_mutex_destroy (vlc_mutex_t *p_mutex)
VLC_THREAD_ASSERT ("destroying mutex");
#elif defined( WIN32 )
+ InterlockedDecrement (&p_mutex->initialized);
DeleteCriticalSection (&p_mutex->mutex);
#endif
@@ -277,6 +284,15 @@ void vlc_mutex_lock (vlc_mutex_t *p_mutex)
VLC_THREAD_ASSERT ("locking mutex");
#elif defined( WIN32 )
+ if (InterlockedCompareExchange (&p_mutex->initialized, 0, 0) == 0)
+ { /* ^^ We could also lock super_mutex all the time... sluggish */
+ assert (p_mutex != &super_mutex); /* this one cannot be static */
+
+ vlc_mutex_lock (&super_mutex);
+ vlc_mutex_init (p_mutex);
+ /* FIXME: destroy the mutex some time... */
+ vlc_mutex_unlock (&super_mutex);
+ }
EnterCriticalSection (&p_mutex->mutex);
#endif
More information about the vlc-devel
mailing list