Looks good to me, One question, why do we have the "#line directive" in "lib/dirs.c.in"? We have already created "dirs.c" in "lib/automake.mk". What is the use of "#line directive" here?
Thanks, On Thu, Jul 18, 2013 at 4:15 PM, Ben Pfaff <b...@nicira.com> wrote: > Signed-off-by: Ben Pfaff <b...@nicira.com> > --- > lib/dirs.c.in | 37 +++++++++++++++++++++++++++++-------- > 1 files changed, 29 insertions(+), 8 deletions(-) > > diff --git a/lib/dirs.c.in b/lib/dirs.c.in > index 658a74b..85c49ee 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 <config.h> > #include "dirs.h" > #include <stdlib.h> > +#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); > } > -- > 1.7.2.5 > > _______________________________________________ > dev mailing list > dev@openvswitch.org > http://openvswitch.org/mailman/listinfo/dev >
_______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev