From 647d6d857afb5085da31424c869d5802aff599a0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sat, 30 Aug 2008 11:15:04 +0300 Subject: [PATCH] Initialize messages stacks inside the message bank --- src/libvlc.h | 12 ------------ src/misc/messages.c | 23 +++++++++++++++++++++-- src/misc/threads.c | 4 ---- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/src/libvlc.h b/src/libvlc.h index d110a76427..00d7be55e6 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -95,21 +95,9 @@ void msg_Flush (libvlc_int_t *); void msg_Destroy (libvlc_int_t *); /** Internal message stack context */ -typedef struct -{ - int i_code; - char * psz_message; -} msg_context_t; - void msg_StackSet ( int, const char*, ... ); void msg_StackAdd ( const char*, ... ); const char* msg_StackMsg ( void ); -/** The global thread var for msg stack context - * We store this as a static global variable so we don't need a vlc_object_t - * everywhere. - * This key is created in vlc_threads_init and is therefore ready to use at - * the very beginning of the universe */ -extern vlc_threadvar_t msg_context_global_key; void msg_StackDestroy (void *); /* diff --git a/src/misc/messages.c b/src/misc/messages.c index a3e1f47bd8..3b5298c836 100644 --- a/src/misc/messages.c +++ b/src/misc/messages.c @@ -55,6 +55,15 @@ #include #include "../libvlc.h" +typedef struct +{ + int i_code; + char * psz_message; +} msg_context_t; + +static vlc_threadvar_t msg_context; +static uintptr_t banks = 0; + /***************************************************************************** * Local macros *****************************************************************************/ @@ -100,6 +109,11 @@ void msg_Create (libvlc_int_t *p_libvlc) CREATE_ALWAYS, 0, NULL ); SetFilePointer( QUEUE.logfile, 0, NULL, FILE_END ); #endif + + vlc_mutex_t *lock = var_AcquireMutex( "msg-stack" ); + if( banks++ == 0 ) + vlc_threadvar_create( &msg_context, NULL ); + vlc_mutex_unlock( lock ); } /** @@ -129,6 +143,11 @@ void msg_Destroy (libvlc_int_t *p_libvlc) FlushMsg( &QUEUE ); + vlc_mutex_t *lock = var_AcquireMutex( "msg-stack" ); + if( --banks == 0 ) + vlc_threadvar_delete( &msg_context ); + vlc_mutex_unlock( lock ); + #ifdef UNDER_CE CloseHandle( QUEUE.logfile ); #endif @@ -608,12 +627,12 @@ static void PrintMsg ( vlc_object_t * p_this, msg_item_t * p_item ) static msg_context_t* GetContext(void) { - msg_context_t *p_ctx = vlc_threadvar_get( &msg_context_global_key ); + msg_context_t *p_ctx = vlc_threadvar_get( &msg_context ); if( p_ctx == NULL ) { MALLOC_NULL( p_ctx, msg_context_t ); p_ctx->psz_message = NULL; - vlc_threadvar_set( &msg_context_global_key, p_ctx ); + vlc_threadvar_set( &msg_context, p_ctx ); } return p_ctx; } diff --git a/src/misc/threads.c b/src/misc/threads.c index 133c695471..99c602aac4 100644 --- a/src/misc/threads.c +++ b/src/misc/threads.c @@ -66,8 +66,6 @@ libvlc_global_data_t *vlc_global( void ) return p_root; } -vlc_threadvar_t msg_context_global_key; - #if defined(LIBVLC_USE_PTHREAD) static inline unsigned long vlc_threadid (void) { @@ -178,7 +176,6 @@ int vlc_threads_init( void ) } /* We should be safe now. Do all the initialization stuff we want. */ - vlc_threadvar_create( &msg_context_global_key, msg_StackDestroy ); #ifndef LIBVLC_USE_PTHREAD_CANCEL vlc_threadvar_create( &cancel_key, free ); #endif @@ -214,7 +211,6 @@ void vlc_threads_end( void ) #ifndef LIBVLC_USE_PTHREAD vlc_threadvar_delete( &cancel_key ); #endif - vlc_threadvar_delete( &msg_context_global_key ); } i_initializations--; -- 2.39.2