X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;ds=sidebyside;f=lib%2Fovsdb-types.c;h=83e6a56296c43ae91f855d37fe50299ebc9945fd;hb=ac0bdaa33090fd4fef119479166717be7153cdeb;hp=b3452dd831b67e4ff2e6d8166554712a583739e6;hpb=a0bc29a541fc7dc6e20137d5558e2094d614e6ab;p=sliver-openvswitch.git diff --git a/lib/ovsdb-types.c b/lib/ovsdb-types.c index b3452dd83..83e6a5629 100644 --- a/lib/ovsdb-types.c +++ b/lib/ovsdb-types.c @@ -1,4 +1,4 @@ -/* Copyright (c) 2009, 2010 Nicira Networks +/* 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]; } @@ -556,7 +564,6 @@ ovsdb_type_is_valid(const struct ovsdb_type *type) && ovsdb_base_type_is_valid(&type->key) && ovsdb_base_type_is_valid(&type->value) && type->n_min <= 1 - && type->n_min <= type->n_max && type->n_max >= 1); }