From b8247ace0350412681e0bc502f8bb617cfa426b8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Wed, 6 May 2009 20:23:32 +0300 Subject: [PATCH] Make the config file lock per process rather than per instance --- src/config/file.c | 15 +++++++++------ src/libvlc.c | 2 -- src/libvlc.h | 3 --- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/src/config/file.c b/src/config/file.c index 4012ea2ee8..322f6932c4 100644 --- a/src/config/file.c +++ b/src/config/file.c @@ -410,7 +410,6 @@ static int config_PrepareDir (vlc_object_t *obj) static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, bool b_autosave ) { - libvlc_priv_t *priv = libvlc_priv (p_this->p_libvlc); module_t *p_parser; FILE *file = NULL; char *permanent = NULL, *temporary = NULL; @@ -420,9 +419,6 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, bool b_backup; int i_index; - /* Acquire config file lock */ - vlc_mutex_lock( &priv->config_lock ); - if( config_PrepareDir( p_this ) ) { msg_Err( p_this, "no configuration directory" ); @@ -521,9 +517,15 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, goto error; } + /* The temporary configuration file is per-PID. Therefore SaveConfigFile() + * should be serialized against itself within a given process. */ + static vlc_mutex_t lock = VLC_STATIC_MUTEX; + vlc_mutex_lock (&lock); + int fd = utf8_open (temporary, O_CREAT|O_WRONLY|O_TRUNC, S_IRUSR|S_IWUSR); if (fd == -1) { + vlc_mutex_unlock (&lock); module_list_free (list); goto error; } @@ -531,6 +533,7 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, if (file == NULL) { close (fd); + vlc_mutex_unlock (&lock); module_list_free (list); goto error; } @@ -672,13 +675,14 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, rename (temporary, permanent); /* (...then synchronize the directory, err, TODO...) */ /* ...and finally close the file */ + vlc_mutex_unlock (&lock); #endif - vlc_mutex_unlock (&priv->config_lock); fclose (file); #ifdef WIN32 /* Windows cannot remove open files nor overwrite existing ones */ remove (permanent); rename (temporary, permanent); + vlc_mutex_unlock (&lock); #endif free (temporary); @@ -688,7 +692,6 @@ static int SaveConfigFile( vlc_object_t *p_this, const char *psz_module_name, error: if( file ) fclose( file ); - vlc_mutex_unlock( &priv->config_lock ); free (temporary); free (permanent); free( p_bigbuffer ); diff --git a/src/libvlc.c b/src/libvlc.c index 3f441f69fd..2f5d2f13f8 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -282,7 +282,6 @@ libvlc_int_t * libvlc_InternalCreate( void ) /* Initialize mutexes */ vlc_mutex_init( &priv->timer_lock ); - vlc_mutex_init( &priv->config_lock ); vlc_cond_init( &priv->exiting ); return p_libvlc; @@ -1130,7 +1129,6 @@ void libvlc_InternalDestroy( libvlc_int_t *p_libvlc ) /* Destroy mutexes */ vlc_cond_destroy( &priv->exiting ); - vlc_mutex_destroy( &priv->config_lock ); vlc_mutex_destroy( &priv->timer_lock ); #ifndef NDEBUG /* Hack to dump leaked objects tree */ diff --git a/src/libvlc.h b/src/libvlc.h index 07bc6490f1..94c21304d2 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -201,9 +201,6 @@ typedef struct libvlc_priv_t libvlc_int_t public_data; vlc_cond_t exiting; ///< signaled when VLC wants to exit - /* Configuration */ - vlc_mutex_t config_lock; ///< config file lock - int i_last_input_id ; ///< Last id of input item /* Messages */ -- 2.39.2