[lxc-devel] [PATCH] gather all locking related code into src/lxc/lxclock.c

Serge Hallyn serge.hallyn at ubuntu.com
Thu Nov 14 18:00:12 UTC 2013


Quoting S.Çağlar Onur (caglar at 10ur.org):
> Signed-off-by: S.Çağlar Onur <caglar at 10ur.org>

Thanks.

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>

> ---
>  src/lxc/lxclock.c | 74 +++++++++++++++++++++++++++++++++++++++++++++----------
>  src/lxc/lxclock.h |  3 +++
>  src/lxc/utils.c   | 57 +-----------------------------------------
>  3 files changed, 65 insertions(+), 69 deletions(-)
> 
> diff --git a/src/lxc/lxclock.c b/src/lxc/lxclock.c
> index 3857ff0..64823d2 100644
> --- a/src/lxc/lxclock.c
> +++ b/src/lxc/lxclock.c
> @@ -31,6 +31,10 @@
>  #include <lxc/log.h>
>  #include <lxc/lxccontainer.h>
>  
> +#ifdef MUTEX_DEBUGGING
> +#include <execinfo.h>
> +#endif
> +
>  #define OFLAG (O_CREAT | O_RDWR)
>  #define SEMMODE 0660
>  #define SEMVALUE 1
> @@ -40,10 +44,55 @@ lxc_log_define(lxc_lock, lxc);
>  
>  #ifdef MUTEX_DEBUGGING
>  pthread_mutex_t thread_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
> +pthread_mutex_t static_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
> +
> +inline void dump_stacktrace(void)
> +{
> +	void *array[MAX_STACKDEPTH];
> +	size_t size;
> +	char **strings;
> +	size_t i;
> +
> +	size = backtrace(array, MAX_STACKDEPTH);
> +	strings = backtrace_symbols(array, size);
> +
> +	// Using fprintf here as our logging module is not thread safe
> +	fprintf(stderr, "\tObtained %zd stack frames.\n", size);
> +
> +	for (i = 0; i < size; i++)
> +		fprintf(stderr, "\t\t%s\n", strings[i]);
> +
> +	free (strings);
> +}
>  #else
>  pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER;
> +pthread_mutex_t static_mutex = PTHREAD_MUTEX_INITIALIZER;
> +
> +inline void dump_stacktrace(void) {;}
>  #endif
>  
> +void lock_mutex(pthread_mutex_t *l)
> +{
> +	int ret;
> +
> +	if ((ret = pthread_mutex_lock(l)) != 0) {
> +		fprintf(stderr, "pthread_mutex_lock returned:%d %s", ret, strerror(ret));
> +		dump_stacktrace();
> +		exit(1);
> +	}
> +}
> +
> +void unlock_mutex(pthread_mutex_t *l)
> +{
> +	int ret;
> +
> +	if ((ret = pthread_mutex_unlock(l)) != 0) {
> +		fprintf(stderr, "pthread_mutex_lock returned:%d %s", ret, strerror(ret));
> +		dump_stacktrace();
> +		exit(1);
> +	}
> +}
> +
>  static char *lxclock_name(const char *p, const char *n)
>  {
>  	int ret;
> @@ -267,24 +316,23 @@ void lxc_putlock(struct lxc_lock *l)
>  
>  void process_lock(void)
>  {
> -	int ret;
> -
> -	if ((ret = pthread_mutex_lock(&thread_mutex)) != 0) {
> -		ERROR("pthread_mutex_lock returned:%d %s", ret, strerror(ret));
> -		dump_stacktrace();
> -		exit(1);
> -	}
> +	lock_mutex(&thread_mutex);
>  }
>  
>  void process_unlock(void)
>  {
> -	int ret;
> +	unlock_mutex(&thread_mutex);
> +}
>  
> -	if ((ret = pthread_mutex_unlock(&thread_mutex)) != 0) {
> -		ERROR("pthread_mutex_unlock returned:%d %s", ret, strerror(ret));
> -		dump_stacktrace();
> -		exit(1);
> -	}
> +/* Protects static const values inside the lxc_global_config_value funtion */
> +void static_lock(void)
> +{
> +	lock_mutex(&static_mutex);
> +}
> +
> +void static_unlock(void)
> +{
> +	unlock_mutex(&static_mutex);
>  }
>  
>  int container_mem_lock(struct lxc_container *c)
> diff --git a/src/lxc/lxclock.h b/src/lxc/lxclock.h
> index dcdf79d..12ba827 100644
> --- a/src/lxc/lxclock.h
> +++ b/src/lxc/lxclock.h
> @@ -87,6 +87,9 @@ extern void lxc_putlock(struct lxc_lock *l);
>  
>  extern void process_lock(void);
>  extern void process_unlock(void);
> +extern void static_lock(void);
> +extern void static_unlock(void);
> +
>  struct lxc_container;
>  extern int container_mem_lock(struct lxc_container *c);
>  extern void container_mem_unlock(struct lxc_container *c);
> diff --git a/src/lxc/utils.c b/src/lxc/utils.c
> index 4bc2c35..3fab9ae 100644
> --- a/src/lxc/utils.c
> +++ b/src/lxc/utils.c
> @@ -39,11 +39,6 @@
>  #include <sys/types.h>
>  #include <sys/wait.h>
>  #include <assert.h>
> -#include <pthread.h>
> -
> -#ifdef MUTEX_DEBUGGING
> -#include <execinfo.h>
> -#endif
>  
>  #ifndef HAVE_GETLINE
>  #ifdef HAVE_FGETLN
> @@ -59,57 +54,6 @@
>  
>  lxc_log_define(lxc_utils, lxc);
>  
> -
> -#ifdef MUTEX_DEBUGGING
> -static pthread_mutex_t static_mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
> -
> -inline void dump_stacktrace(void)
> -{
> -	void *array[MAX_STACKDEPTH];
> -	size_t size;
> -	char **strings;
> -	size_t i;
> -
> -	size = backtrace(array, MAX_STACKDEPTH);
> -	strings = backtrace_symbols(array, size);
> -
> -	// Using fprintf here as our logging module is not thread safe
> -	fprintf(stderr, "\tObtained %zd stack frames.\n", size);
> -
> -	for (i = 0; i < size; i++)
> -		fprintf(stderr, "\t\t%s\n", strings[i]);
> -
> -	free (strings);
> -}
> -#else
> -static pthread_mutex_t static_mutex = PTHREAD_MUTEX_INITIALIZER;
> -
> -inline void dump_stacktrace(void) {;}
> -#endif
> -
> -/* Protects static const values inside the lxc_global_config_value funtion */
> -static void static_lock(void)
> -{
> -	int ret;
> -
> -	if ((ret = pthread_mutex_lock(&static_mutex)) != 0) {
> -		ERROR("pthread_mutex_lock returned:%d %s", ret, strerror(ret));
> -		dump_stacktrace();
> -		exit(1);
> -	}
> -}
> -
> -static void static_unlock(void)
> -{
> -	int ret;
> -
> -	if ((ret = pthread_mutex_unlock(&static_mutex)) != 0) {
> -		ERROR("pthread_mutex_unlock returned:%d %s", ret, strerror(ret));
> -		dump_stacktrace();
> -		exit(1);
> -	}
> -}
> -
>  static int _recursive_rmdir_onedev(char *dirname, dev_t pdev)
>  {
>  	struct dirent dirent, *direntp;
> @@ -392,6 +336,7 @@ out:
>  	if (fin)
>  		fclose(fin);
>  	process_unlock();
> +
>  	static_lock();
>  	value = values[i];
>  	static_unlock();
> -- 
> 1.8.3.2
> 
> 
> ------------------------------------------------------------------------------
> DreamFactory - Open Source REST & JSON Services for HTML5 & Native Apps
> OAuth, Users, Roles, SQL, NoSQL, BLOB Storage and External API Access
> Free app hosting. Or install the open source package on any LAMP server.
> Sign up and see examples for AngularJS, jQuery, Sencha Touch and Native!
> http://pubads.g.doubleclick.net/gampad/clk?id=63469471&iu=/4140/ostg.clktrk
> _______________________________________________
> Lxc-devel mailing list
> Lxc-devel at lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/lxc-devel




More information about the lxc-devel mailing list