Skip to content

Commit

Permalink
Revert "remove static_lock()/static_unlock() and start to use thread …
Browse files Browse the repository at this point in the history
…local storage (v2)"

This reverts commit 95b422f.

Conflicts:
	src/lxc/utils.c
  • Loading branch information
hallyn committed Dec 23, 2013
1 parent 5cad2f0 commit 9166435
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 4 deletions.
13 changes: 13 additions & 0 deletions src/lxc/lxclock.c
Expand Up @@ -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)
{
Expand All @@ -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
Expand Down Expand Up @@ -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);
Expand Down
10 changes: 10 additions & 0 deletions src/lxc/lxclock.h
Expand Up @@ -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;

/*!
Expand Down
18 changes: 14 additions & 4 deletions src/lxc/utils.c
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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");
Expand Down Expand Up @@ -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 {
Expand All @@ -358,14 +364,18 @@ const char *lxc_global_config_value(const char *option_name)
* as an error... */
if (!values[i])
errno = 0;
static_unlock();

out:
process_lock();
if (fin)
fclose(fin);
process_unlock();

return values[i];
static_lock();
value = values[i];
static_unlock();
return value;
}

const char *default_lvm_vg(void)
Expand Down

0 comments on commit 9166435

Please sign in to comment.