[ovs-dev] [threads 06/23] meta-flow: Make thread-safe.
Alex Wang
alexw at nicira.com
Mon Jul 22 16:20:37 UTC 2013
Looks good to me, thanks,
On Thu, Jul 18, 2013 at 4:15 PM, Ben Pfaff <blp at nicira.com> wrote:
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
> lib/meta-flow.c | 41 +++++++++++++++++++++++------------------
> 1 files changed, 23 insertions(+), 18 deletions(-)
>
> diff --git a/lib/meta-flow.c b/lib/meta-flow.c
> index 6b3b5eb..8f67b94 100644
> --- a/lib/meta-flow.c
> +++ b/lib/meta-flow.c
> @@ -27,6 +27,7 @@
> #include "dynamic-string.h"
> #include "ofp-errors.h"
> #include "ofp-util.h"
> +#include "ovs-thread.h"
> #include "packets.h"
> #include "random.h"
> #include "shash.h"
> @@ -580,13 +581,17 @@ struct nxm_field {
> };
>
> /* Contains 'struct nxm_field's. */
> -static struct hmap all_fields = HMAP_INITIALIZER(&all_fields);
> +static struct hmap all_fields;
> +
> +/* Maps from an mf_field's 'name' or 'extra_name' to the mf_field. */
> +static struct shash mf_by_name;
>
> /* Rate limit for parse errors. These always indicate a bug in an
> OpenFlow
> * controller and so there's not much point in showing a lot of them. */
> static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(1, 5);
>
> const struct mf_field *mf_from_nxm_header__(uint32_t header);
> +static void nxm_init(void);
>
> /* Returns the field with the given 'id'. */
> const struct mf_field *
> @@ -601,19 +606,7 @@ mf_from_id(enum mf_field_id id)
> const struct mf_field *
> mf_from_name(const char *name)
> {
> - static struct shash mf_by_name = SHASH_INITIALIZER(&mf_by_name);
> -
> - if (shash_is_empty(&mf_by_name)) {
> - const struct mf_field *mf;
> -
> - for (mf = mf_fields; mf < &mf_fields[MFF_N_IDS]; mf++) {
> - shash_add_once(&mf_by_name, mf->name, mf);
> - if (mf->extra_name) {
> - shash_add_once(&mf_by_name, mf->extra_name, mf);
> - }
> - }
> - }
> -
> + nxm_init();
> return shash_find_data(&mf_by_name, name);
> }
>
> @@ -641,24 +634,36 @@ nxm_init_add_field(const struct mf_field *mf,
> uint32_t header)
> }
>
> static void
> -nxm_init(void)
> +nxm_do_init(void)
> {
> const struct mf_field *mf;
>
> + hmap_init(&all_fields);
> + shash_init(&mf_by_name);
> for (mf = mf_fields; mf < &mf_fields[MFF_N_IDS]; mf++) {
> nxm_init_add_field(mf, mf->nxm_header);
> if (mf->oxm_header != mf->nxm_header) {
> nxm_init_add_field(mf, mf->oxm_header);
> }
> +
> + shash_add_once(&mf_by_name, mf->name, mf);
> + if (mf->extra_name) {
> + shash_add_once(&mf_by_name, mf->extra_name, mf);
> + }
> }
> }
>
> +static void
> +nxm_init(void)
> +{
> + static pthread_once_t once = PTHREAD_ONCE_INIT;
> + pthread_once(&once, nxm_do_init);
> +}
> +
> const struct mf_field *
> mf_from_nxm_header(uint32_t header)
> {
> - if (hmap_is_empty(&all_fields)) {
> - nxm_init();
> - }
> + nxm_init();
> return mf_from_nxm_header__(header);
> }
>
> --
> 1.7.2.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20130722/2b7fbb6f/attachment-0003.html>
More information about the dev
mailing list