From: Serge Hallyn Date: Mon, 23 Dec 2013 18:27:32 +0000 (-0600) Subject: Revert "remove static_lock()/static_unlock() and start to use thread local storage... X-Git-Tag: lxc-1.0.0.beta2~119 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=916643522fa9b6800abe5ef8e84fc07bf58e80b7;p=thirdparty%2Flxc.git Revert "remove static_lock()/static_unlock() and start to use thread local storage (v2)" This reverts commit 95b422fccfed6e6f5973c768c0cfdbca65c68e67. Conflicts: src/lxc/utils.c --- diff --git a/src/lxc/lxclock.c b/src/lxc/lxclock.c index 62e774ff9..64823d2a5 100644 --- a/src/lxc/lxclock.c +++ b/src/lxc/lxclock.c @@ -44,6 +44,7 @@ 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) { @@ -65,6 +66,7 @@ inline void dump_stacktrace(void) } #else pthread_mutex_t thread_mutex = PTHREAD_MUTEX_INITIALIZER; +pthread_mutex_t static_mutex = PTHREAD_MUTEX_INITIALIZER; inline void dump_stacktrace(void) {;} #endif @@ -322,6 +324,17 @@ void process_unlock(void) unlock_mutex(&thread_mutex); } +/* 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) { return lxclock(c->privlock, 0); diff --git a/src/lxc/lxclock.h b/src/lxc/lxclock.h index a02a0320c..820e819ac 100644 --- a/src/lxc/lxclock.h +++ b/src/lxc/lxclock.h @@ -123,6 +123,16 @@ extern void process_lock(void); */ extern void process_unlock(void); +/*! + * \brief Lock global data. + */ +extern void static_lock(void); + +/*! + * \brief Unlock global data. + */ +extern void static_unlock(void); + struct lxc_container; /*! diff --git a/src/lxc/utils.c b/src/lxc/utils.c index 2f00b4afd..1ea3fb0ee 100644 --- a/src/lxc/utils.c +++ b/src/lxc/utils.c @@ -254,6 +254,9 @@ const char *lxc_global_config_value(const char *option_name) { NULL, NULL }, }; + /* Protected by a mutex to eliminate conflicting load and store operations */ + static const char *values[sizeof(options) / sizeof(options[0])] = { 0 }; + char *user_config_path = NULL; char *user_lxc_path = NULL; char *user_home = NULL; @@ -278,8 +281,6 @@ const char *lxc_global_config_value(const char *option_name) user_lxc_path = strdup(LXCPATH); } - /* placed in the thread local storage pool */ - static __thread const char *values[sizeof(options) / sizeof(options[0])] = { 0 }; const char *(*ptr)[2]; const char *value; size_t i; @@ -297,13 +298,15 @@ const char *lxc_global_config_value(const char *option_name) return NULL; } + static_lock(); if (values[i]) { free(user_config_path); free(user_lxc_path); value = values[i]; - + static_unlock(); return value; } + static_unlock(); process_lock(); fin = fopen_cloexec(user_config_path, "r"); @@ -341,12 +344,15 @@ const char *lxc_global_config_value(const char *option_name) while (*p && (*p == ' ' || *p == '\t')) p++; if (!*p) continue; + static_lock(); values[i] = copy_global_config_value(p); + static_unlock(); free(user_lxc_path); goto out; } } /* could not find value, use default */ + static_lock(); if (strcmp(option_name, "lxcpath") == 0) values[i] = user_lxc_path; else { @@ -358,6 +364,7 @@ const char *lxc_global_config_value(const char *option_name) * as an error... */ if (!values[i]) errno = 0; + static_unlock(); out: process_lock(); @@ -365,7 +372,10 @@ out: fclose(fin); process_unlock(); - return values[i]; + static_lock(); + value = values[i]; + static_unlock(); + return value; } const char *default_lvm_vg(void)