From 3ca7825a92ed7e8de3bbccc274aa41045e8816b4 Mon Sep 17 00:00:00 2001 From: Sam Hocevar <sam@videolan.org> Date: Tue, 15 Oct 2002 08:35:24 +0000 Subject: [PATCH] * ./include/vlc_threads_funcs.h, ./src/misc/threads.c: eradicated vlc_mutex_need() and vlc_mutex_unneed(). * ./src/misc/variables.c: implemented VLC_VAR_MUTEX variables. * ./modules/misc/gtk_main.c, ./src/libvlc.c: replaced named mutexes with named mutex variables. --- include/vlc_threads_funcs.h | 17 +------ modules/misc/gtk_main.c | 48 ++++++++----------- src/libvlc.c | 15 +++--- src/misc/threads.c | 95 +------------------------------------ src/misc/variables.c | 18 ++++++- 5 files changed, 47 insertions(+), 146 deletions(-) diff --git a/include/vlc_threads_funcs.h b/include/vlc_threads_funcs.h index d813a1c314b6..a5ae6f5e2941 100644 --- a/include/vlc_threads_funcs.h +++ b/include/vlc_threads_funcs.h @@ -3,7 +3,7 @@ * This header provides a portable threads implementation. ***************************************************************************** * Copyright (C) 1999, 2002 VideoLAN - * $Id: vlc_threads_funcs.h,v 1.5 2002/10/04 18:07:21 sam Exp $ + * $Id: vlc_threads_funcs.h,v 1.6 2002/10/15 08:35:24 sam Exp $ * * Authors: Jean-Marc Dressler <polux@via.ecp.fr> * Samuel Hocevar <sam@via.ecp.fr> @@ -38,9 +38,6 @@ VLC_EXPORT( int, __vlc_thread_create, ( vlc_object_t *, char *, int, char *, vo VLC_EXPORT( void, __vlc_thread_ready, ( vlc_object_t * ) ); VLC_EXPORT( void, __vlc_thread_join, ( vlc_object_t *, char *, int ) ); -VLC_EXPORT( vlc_mutex_t *, __vlc_mutex_need, ( vlc_object_t *, char * ) ); -VLC_EXPORT( void , __vlc_mutex_unneed, ( vlc_object_t *, char * ) ); - /***************************************************************************** * vlc_threads_init: initialize threads system *****************************************************************************/ @@ -59,12 +56,6 @@ VLC_EXPORT( void , __vlc_mutex_unneed, ( vlc_object_t *, char * ) ); #define vlc_mutex_init( P_THIS, P_MUTEX ) \ __vlc_mutex_init( VLC_OBJECT(P_THIS), P_MUTEX ) -/***************************************************************************** - * vlc_mutex_need: create a global mutex from its name - *****************************************************************************/ -#define vlc_mutex_need( P_THIS, P_NAME ) \ - __vlc_mutex_need( VLC_OBJECT(P_THIS), P_NAME ) - /***************************************************************************** * vlc_mutex_lock: lock a mutex *****************************************************************************/ @@ -201,12 +192,6 @@ static inline int __vlc_mutex_unlock( char * psz_file, int i_line, return i_result; } -/***************************************************************************** - * vlc_mutex_unneed: destroycreate a global mutex from its name - *****************************************************************************/ -#define vlc_mutex_unneed( P_THIS, P_NAME ) \ - __vlc_mutex_unneed( VLC_OBJECT(P_THIS), P_NAME ) - /***************************************************************************** * vlc_mutex_destroy: destroy a mutex *****************************************************************************/ diff --git a/modules/misc/gtk_main.c b/modules/misc/gtk_main.c index 799cf7dd0ad7..967eec3ca211 100644 --- a/modules/misc/gtk_main.c +++ b/modules/misc/gtk_main.c @@ -2,7 +2,7 @@ * gtk_main.c : Gtk+ wrapper for gtk_main ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: gtk_main.c,v 1.9 2002/10/04 18:07:21 sam Exp $ + * $Id: gtk_main.c,v 1.10 2002/10/15 08:35:24 sam Exp $ * * Authors: Samuel Hocevar <sam@zoy.org> * @@ -42,23 +42,11 @@ static void Close ( vlc_object_t * ); static void GtkMain ( vlc_object_t * ); -/***************************************************************************** - * The gtk_main_t object. - *****************************************************************************/ -#define MAX_ATEXIT 10 - -typedef struct gtk_main_t -{ - VLC_COMMON_MEMBERS - -} gtk_main_t; - /***************************************************************************** * Local variables (mutex-protected). *****************************************************************************/ -static vlc_mutex_t * p_gtklock; -static int i_refcount = 0; -static gtk_main_t * p_gtk_main = NULL; +static int i_refcount = 0; +static vlc_object_t * p_gtk_main = NULL; /***************************************************************************** * Module descriptor @@ -81,20 +69,23 @@ vlc_module_end(); *****************************************************************************/ static int Open( vlc_object_t *p_this ) { + vlc_value_t lockval; + /* FIXME: put this in the module (de)initialization ASAP */ - p_gtklock = vlc_mutex_need( p_this, "gtk" ); + var_Create( p_this->p_libvlc, "gtk", VLC_VAR_MUTEX ); - vlc_mutex_lock( p_gtklock ); + var_Get( p_this->p_libvlc, "gtk", &lockval ); + vlc_mutex_lock( lockval.p_address ); if( i_refcount > 0 ) { i_refcount++; - vlc_mutex_unlock( p_gtklock ); + vlc_mutex_unlock( lockval.p_address ); return VLC_SUCCESS; } - p_gtk_main = vlc_object_create( p_this, sizeof(gtk_main_t) ); + p_gtk_main = vlc_object_create( p_this, VLC_OBJECT_GENERIC ); /* Only initialize gthreads if it's the first time we do it */ if( !g_thread_supported() ) @@ -109,13 +100,13 @@ static int Open( vlc_object_t *p_this ) { vlc_object_destroy( p_gtk_main ); i_refcount--; - vlc_mutex_unlock( p_gtklock ); - vlc_mutex_unneed( p_this, "gtk" ); + vlc_mutex_unlock( lockval.p_address ); + var_Destroy( p_this->p_libvlc, "gtk" ); return VLC_ETHREAD; } i_refcount++; - vlc_mutex_unlock( p_gtklock ); + vlc_mutex_unlock( lockval.p_address ); return VLC_SUCCESS; } @@ -125,14 +116,17 @@ static int Open( vlc_object_t *p_this ) *****************************************************************************/ static void Close( vlc_object_t *p_this ) { - vlc_mutex_lock( p_gtklock ); + vlc_value_t lockval; + + var_Get( p_this->p_libvlc, "gtk", &lockval ); + vlc_mutex_lock( lockval.p_address ); i_refcount--; if( i_refcount > 0 ) { - vlc_mutex_unlock( p_gtklock ); - vlc_mutex_unneed( p_this, "gtk" ); + vlc_mutex_unlock( lockval.p_address ); + var_Destroy( p_this->p_libvlc, "gtk" ); return; } @@ -142,8 +136,8 @@ static void Close( vlc_object_t *p_this ) vlc_object_destroy( p_gtk_main ); p_gtk_main = NULL; - vlc_mutex_unlock( p_gtklock ); - vlc_mutex_unneed( p_this, "gtk" ); + vlc_mutex_unlock( lockval.p_address ); + var_Destroy( p_this->p_libvlc, "gtk" ); } static gint foo( gpointer bar ) { return TRUE; } diff --git a/src/libvlc.c b/src/libvlc.c index f07c7e9166d5..1f1d4d8958d8 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -2,7 +2,7 @@ * libvlc.c: main libvlc source ***************************************************************************** * Copyright (C) 1998-2002 VideoLAN - * $Id: libvlc.c,v 1.39 2002/10/14 16:46:55 sam Exp $ + * $Id: libvlc.c,v 1.40 2002/10/15 08:35:24 sam Exp $ * * Authors: Vincent Seguin <seguin@via.ecp.fr> * Samuel Hocevar <sam@zoy.org> @@ -125,7 +125,7 @@ int VLC_Create( void ) { int i_ret; vlc_t * p_vlc = NULL; - vlc_mutex_t * p_libvlc_lock; + vlc_value_t lockval; /* vlc_threads_init *must* be the first internal call! No other call is * allowed before the thread system has been initialized. */ @@ -136,9 +136,10 @@ int VLC_Create( void ) } /* Now that the thread system is initialized, we don't have much, but - * at least we have vlc_mutex_need */ - p_libvlc_lock = vlc_mutex_need( &libvlc, "libvlc" ); - vlc_mutex_lock( p_libvlc_lock ); + * at least we have var_Create */ + var_Create( &libvlc, "libvlc", VLC_VAR_MUTEX ); + var_Get( &libvlc, "libvlc", &lockval ); + vlc_mutex_lock( lockval.p_address ); if( !libvlc.b_ready ) { char *psz_env; @@ -172,8 +173,8 @@ int VLC_Create( void ) libvlc.b_ready = VLC_TRUE; } - vlc_mutex_unlock( p_libvlc_lock ); - vlc_mutex_unneed( &libvlc, "libvlc" ); + vlc_mutex_unlock( lockval.p_address ); + var_Destroy( &libvlc, "libvlc" ); /* Allocate a vlc object */ p_vlc = vlc_object_create( &libvlc, VLC_OBJECT_VLC ); diff --git a/src/misc/threads.c b/src/misc/threads.c index 8ce3bd10c76a..9bfc174cd190 100644 --- a/src/misc/threads.c +++ b/src/misc/threads.c @@ -2,7 +2,7 @@ * threads.c : threads implementation for the VideoLAN client ***************************************************************************** * Copyright (C) 1999, 2000, 2001, 2002 VideoLAN - * $Id: threads.c,v 1.21 2002/10/04 18:07:22 sam Exp $ + * $Id: threads.c,v 1.22 2002/10/15 08:35:24 sam Exp $ * * Authors: Jean-Marc Dressler <polux@via.ecp.fr> * Samuel Hocevar <sam@zoy.org> @@ -321,99 +321,6 @@ int __vlc_mutex_init( vlc_object_t *p_this, vlc_mutex_t *p_mutex ) #endif } -/***************************************************************************** - * vlc_mutex_need: create a global mutex from its name - *****************************************************************************/ -vlc_mutex_t * __vlc_mutex_need( vlc_object_t *p_this, char *psz_name ) -{ - vlc_namedmutex_t *p_named; - - vlc_mutex_lock( &named_lock ); - - p_named = p_named_list; - while( p_named ) - { - if( !strcmp( psz_name, p_named->psz_name ) ) - { - break; - } - p_named = p_named->p_next; - } - - if( p_named ) - { - p_named->i_usage++; - } - else - { - p_named = malloc( sizeof( vlc_namedmutex_t ) ); - vlc_mutex_init( p_this, &p_named->lock ); - p_named->psz_name = strdup( psz_name ); - p_named->i_usage = 1; - p_named->p_next = p_named_list; - p_named_list = p_named; - } - - vlc_mutex_unlock( &named_lock ); - - return &p_named->lock; -} - -/***************************************************************************** - * vlc_mutex_unneed: destroy a global mutex from its name - *****************************************************************************/ -void __vlc_mutex_unneed( vlc_object_t *p_this, char *psz_name ) -{ - vlc_namedmutex_t *p_named, *p_prev; - - vlc_mutex_lock( &named_lock ); - - p_named = p_named_list; - p_prev = NULL; - while( p_named ) - { - if( !strcmp( psz_name, p_named->psz_name ) ) - { - break; - } - p_prev = p_named; - p_named = p_named->p_next; - } - - if( p_named ) - { - p_named->i_usage--; - - if( p_named->i_usage <= 0 ) - { - /* Unlink named mutex */ - if( p_prev ) - { - p_prev->p_next = p_named->p_next; - } - else - { - p_named_list = p_named->p_next; - } - - /* Release this lock as soon as possible */ - vlc_mutex_unlock( &named_lock ); - - vlc_mutex_destroy( &p_named->lock ); - free( p_named->psz_name ); - free( p_named ); - - return; - } - } - else - { - msg_Err( p_this, "no named mutex called %s", psz_name ); - } - - vlc_mutex_unlock( &named_lock ); -} - /***************************************************************************** * vlc_mutex_destroy: destroy a mutex, inner version *****************************************************************************/ diff --git a/src/misc/variables.c b/src/misc/variables.c index 1b1e4186df8c..f8e9810e7efd 100644 --- a/src/misc/variables.c +++ b/src/misc/variables.c @@ -2,7 +2,7 @@ * variables.c: routines for object variables handling ***************************************************************************** * Copyright (C) 2002 VideoLAN - * $Id: variables.c,v 1.3 2002/10/14 19:04:51 sam Exp $ + * $Id: variables.c,v 1.4 2002/10/15 08:35:24 sam Exp $ * * Authors: Samuel Hocevar <sam@zoy.org> * @@ -85,6 +85,8 @@ int __var_Create( vlc_object_t *p_this, const char *psz_name, int i_type ) p_this->p_vars + i_new, (p_this->i_vars - i_new) * sizeof(variable_t) ); + p_this->i_vars++; + p_var = &p_this->p_vars[i_new]; p_var->i_hash = HashString( psz_name ); @@ -97,7 +99,14 @@ int __var_Create( vlc_object_t *p_this, const char *psz_name, int i_type ) p_var->b_set = VLC_FALSE; p_var->b_active = VLC_TRUE; - p_this->i_vars++; + switch( i_type ) + { + case VLC_VAR_MUTEX: + p_var->val.p_address = malloc( sizeof(vlc_mutex_t) ); + vlc_mutex_init( p_this, (vlc_mutex_t*)p_var->val.p_address ); + p_var->b_set = VLC_TRUE; + break; + } vlc_mutex_unlock( &p_this->var_lock ); @@ -146,6 +155,11 @@ int __var_Destroy( vlc_object_t *p_this, const char *psz_name ) free( p_var->val.psz_string ); } break; + + case VLC_VAR_MUTEX: + vlc_mutex_destroy( (vlc_mutex_t*)p_var->val.p_address ); + free( p_var->val.p_address ); + break; } free( p_var->psz_name ); -- GitLab