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.
* 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>
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
*****************************************************************************/
#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
*****************************************************************************/
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
*****************************************************************************/
* 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>
*
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
*****************************************************************************/
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() )
{
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;
}
*****************************************************************************/
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;
}
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; }
* 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>
{
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. */
}
/* 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;
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 );
* 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>
#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
*****************************************************************************/
* 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>
*
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 );
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 );
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 );