From: Ben Pfaff Date: Tue, 23 Apr 2013 22:02:13 +0000 (-0700) Subject: ovsdb-types: Make ovsdb_base_type_get_enum_type() thread-safe. X-Git-Tag: sliver-openvswitch-2.0.90-1~34^2~58 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=d2d3264cd62c646792fa712d86946d17708d81a8;p=sliver-openvswitch.git ovsdb-types: Make ovsdb_base_type_get_enum_type() thread-safe. Signed-off-by: Ben Pfaff Acked-by: Andy Zhou --- diff --git a/lib/ovsdb-types.c b/lib/ovsdb-types.c index b47bfad39..83e6a5629 100644 --- a/lib/ovsdb-types.c +++ b/lib/ovsdb-types.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010, 2011 Nicira, Inc. +/* Copyright (c) 2009, 2010, 2011, 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. @@ -22,6 +22,7 @@ #include "dynamic-string.h" #include "json.h" +#include "ovs-thread.h" #include "ovsdb-data.h" #include "ovsdb-error.h" #include "ovsdb-parser.h" @@ -158,16 +159,23 @@ ovsdb_base_type_init(struct ovsdb_base_type *base, enum ovsdb_atomic_type type) const struct ovsdb_type * ovsdb_base_type_get_enum_type(enum ovsdb_atomic_type atomic_type) { + static struct ovsthread_once once = OVSTHREAD_ONCE_INITIALIZER; static struct ovsdb_type *types[OVSDB_N_TYPES]; - if (!types[atomic_type]) { - struct ovsdb_type *type; + if (ovsthread_once_start(&once)) { + enum ovsdb_atomic_type i; - types[atomic_type] = type = xmalloc(sizeof *type); - ovsdb_base_type_init(&type->key, atomic_type); - ovsdb_base_type_init(&type->value, OVSDB_TYPE_VOID); - type->n_min = 1; - type->n_max = UINT_MAX; + for (i = 0; i < OVSDB_N_TYPES; i++) { + struct ovsdb_type *type; + + types[i] = type = xmalloc(sizeof *type); + ovsdb_base_type_init(&type->key, i); + ovsdb_base_type_init(&type->value, OVSDB_TYPE_VOID); + type->n_min = 1; + type->n_max = UINT_MAX; + } + + ovsthread_once_done(&once); } return types[atomic_type]; }