From: Ben Pfaff Date: Tue, 23 Apr 2013 23:19:21 +0000 (-0700) Subject: socket-util: Make get_max_fds() and get_null_fd() thread-safe. X-Git-Tag: sliver-openvswitch-2.0.90-1~34^2~56 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=1d4fd3a5e7aa37624f04f02b42b4e7c075cd138c;p=sliver-openvswitch.git socket-util: Make get_max_fds() and get_null_fd() thread-safe. Signed-off-by: Ben Pfaff Acked-by: Andy Zhou --- diff --git a/lib/socket-util.c b/lib/socket-util.c index fa55480d3..2ba0fd4aa 100644 --- a/lib/socket-util.c +++ b/lib/socket-util.c @@ -132,8 +132,10 @@ rlim_is_finite(rlim_t limit) int get_max_fds(void) { - static int max_fds = -1; - if (max_fds < 0) { + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; + static int max_fds; + + if (ovsthread_once_start(&once)) { struct rlimit r; if (!getrlimit(RLIMIT_NOFILE, &r) && rlim_is_finite(r.rlim_cur)) { max_fds = r.rlim_cur; @@ -141,7 +143,9 @@ get_max_fds(void) VLOG_WARN("failed to obtain fd limit, defaulting to 1024"); max_fds = 1024; } + ovsthread_once_done(&once); } + return max_fds; } @@ -802,15 +806,19 @@ error: int get_null_fd(void) { - static int null_fd = -1; - if (null_fd < 0) { + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; + static int null_fd; + + if (ovsthread_once_start(&once)) { null_fd = open("/dev/null", O_RDWR); if (null_fd < 0) { int error = errno; VLOG_ERR("could not open /dev/null: %s", ovs_strerror(error)); - return -error; + null_fd = -error; } + ovsthread_once_done(&once); } + return null_fd; }