From 811d6451a1f089d69859328e16d99b650990c84a Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Tue, 23 Apr 2013 14:04:54 -0700 Subject: [PATCH] dirs: Make thread-safe. Signed-off-by: Ben Pfaff --- lib/dirs.c.in | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) 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); } -- 2.47.0