X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fdirs.c.in;h=85c49ee0bcdf310b10c24a47e1a49a844d7d8cb8;hb=003ce655b7116d18c86a74c50391e54990346931;hp=658a74b4c6179d7be18fbb6d5e5cc1d00e7bf4bd;hpb=c3bf549800cecfa0c5fbd669139f441b7dd5d237;p=sliver-openvswitch.git diff --git a/lib/dirs.c.in b/lib/dirs.c.in index 658a74b4c..85c49ee0b 100644 --- a/lib/dirs.c.in +++ b/lib/dirs.c.in @@ -1,6 +1,6 @@ #line 2 "@srcdir@/lib/dirs.c.in" /* - * Copyright (c) 2008, 2009, 2010, 2011, 2012 Nicira, Inc. + * Copyright (c) 2008, 2009, 2010, 2011, 2012, 2013 Nicira, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,22 +18,25 @@ #include #include "dirs.h" #include +#include "ovs-thread.h" #include "util.h" struct directory { const char *value; /* Actual value; NULL if not yet determined. */ const char *default_value; /* Default value. */ const char *var_name; /* Environment variable to override default. */ + struct ovsthread_once once; /* Ensures 'value' gets initialized once. */ }; static const char * get_dir(struct directory *d) { - if (!d->value) { + if (ovsthread_once_start(&d->once)) { d->value = getenv(d->var_name); if (!d->value || !d->value[0]) { d->value = d->default_value; } + ovsthread_once_done(&d->once); } return d->value; } @@ -41,36 +44,50 @@ get_dir(struct directory *d) const char * ovs_sysconfdir(void) { - static struct directory d = { NULL, @sysconfdir@, "OVS_SYSCONFDIR" }; + static struct directory d = { + NULL, @sysconfdir@, "OVS_SYSCONFDIR", OVSTHREAD_ONCE_INITIALIZER + }; + return get_dir(&d); } const char * ovs_pkgdatadir(void) { - static struct directory d = { NULL, @pkgdatadir@, "OVS_PKGDATADIR" }; + static struct directory d = { + NULL, @pkgdatadir@, "OVS_PKGDATADIR", OVSTHREAD_ONCE_INITIALIZER + }; + return get_dir(&d); } const char * ovs_rundir(void) { - static struct directory d = { NULL, @RUNDIR@, "OVS_RUNDIR" }; + static struct directory d = { + NULL, @RUNDIR@, "OVS_RUNDIR", OVSTHREAD_ONCE_INITIALIZER + }; + return get_dir(&d); } const char * ovs_logdir(void) { - static struct directory d = { NULL, @LOGDIR@, "OVS_LOGDIR" }; + static struct directory d = { + NULL, @LOGDIR@, "OVS_LOGDIR", OVSTHREAD_ONCE_INITIALIZER + }; + return get_dir(&d); } const char * ovs_dbdir(void) { + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; static const char *dbdir; - if (!dbdir) { + + if (ovsthread_once_start(&once)) { dbdir = getenv("OVS_DBDIR"); if (!dbdir || !dbdir[0]) { char *sysconfdir = getenv("OVS_SYSCONFDIR"); @@ -79,6 +96,7 @@ ovs_dbdir(void) ? xasprintf("%s/openvswitch", sysconfdir) : @DBDIR@); } + ovsthread_once_done(&once); } return dbdir; } @@ -86,6 +104,9 @@ ovs_dbdir(void) const char * ovs_bindir(void) { - static struct directory d = { NULL, @bindir@, "OVS_BINDIR" }; + static struct directory d = { + NULL, @bindir@, "OVS_BINDIR", OVSTHREAD_ONCE_INITIALIZER + }; + return get_dir(&d); }