diff --git a/src/lxc/lxclock.c b/src/lxc/lxclock.c index 3857ff06c..64823d2a5 100644 --- a/src/lxc/lxclock.c +++ b/src/lxc/lxclock.c @@ -31,6 +31,10 @@ #include #include +#ifdef MUTEX_DEBUGGING +#include +#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 dcdf79d2d..12ba82750 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 4bc2c35e4..3fab9ae7e 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -39,11 +39,6 @@ #include #include #include -#include - -#ifdef MUTEX_DEBUGGING -#include -#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();