]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
Revert "remove static_lock()/static_unlock() and start to use thread local storage...
authorSerge Hallyn <serge.hallyn@ubuntu.com>
Mon, 23 Dec 2013 18:27:32 +0000 (12:27 -0600)
committerSerge Hallyn <serge.hallyn@ubuntu.com>
Mon, 23 Dec 2013 18:27:32 +0000 (12:27 -0600)
This reverts commit 95b422fccfed6e6f5973c768c0cfdbca65c68e67.

Conflicts:
src/lxc/utils.c

src/lxc/lxclock.c
src/lxc/lxclock.h
src/lxc/utils.c

index 62e774ff9a429149b1f86ae208f94f3dd6e002db..64823d2a58edbcdfe4ade6e1b3b782e41bfb38a8 100644 (file)
@@ -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);
index a02a0320c6da973ffb897a1792d99505a5ef03d3..820e819acc9187a7b30518fe59c2684fe8c37452 100644 (file)
@@ -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;
 
 /*!
index 2f00b4afd1f62df7e4ec1256ba3219eb0556df49..1ea3fb0ee8db81fb2f2799667719c13d456464cf 100644 (file)
@@ -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)