[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