[ovs-dev] [threads 09/11] Use random_*() instead of rand(), for thread safety.

Ansis Atteka aatteka at nicira.com
Mon Jun 24 21:46:45 UTC 2013


On Wed, Jun 19, 2013 at 1:17 PM, Ben Pfaff <blp at nicira.com> wrote:

> None of these test programs are threaded, but has little cost and means
> that "grep" doesn't turn up any instances of these thread-unsafe functions
> in our tree.
>
> Signed-off-by: Ben Pfaff <blp at nicira.com>
> ---
>  tests/test-classifier.c |   25 +++++++++++++------------
>  tests/test-hindex.c     |    3 ++-
>  tests/test-hmap.c       |    5 +++--
>  tests/test-util.c       |    4 ++--
>  4 files changed, 20 insertions(+), 17 deletions(-)
>
> diff --git a/tests/test-classifier.c b/tests/test-classifier.c
> index f616494..981251b 100644
> --- a/tests/test-classifier.c
> +++ b/tests/test-classifier.c
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2009, 2010, 2011, 2012 Nicira, Inc.
> + * Copyright (c) 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.
> @@ -34,6 +34,7 @@
>  #include "flow.h"
>  #include "ofp-util.h"
>  #include "packets.h"
> +#include "random.h"
>  #include "unaligned.h"
>
>  #undef NDEBUG
> @@ -404,7 +405,7 @@ compare_classifiers(struct classifier *cls, struct
> tcls *tcls)
>          struct flow flow;
>          unsigned int x;
>
> -        x = rand () % N_FLOW_VALUES;
> +        x = random_uint32() % N_FLOW_VALUES;
>
Did you consider to use random_range(N_FLOW_VALUES) here? It seems that you
did this in other places.

         memset(&flow, 0, sizeof flow);
>          flow.nw_src = nw_src_values[get_value(&x, N_NW_SRC_VALUES)];
>          flow.nw_dst = nw_dst_values[get_value(&x, N_NW_DST_VALUES)];
> @@ -579,7 +580,7 @@ static void
>  shuffle(unsigned int *p, size_t n)
>  {
>      for (; n > 1; n--, p++) {
> -        unsigned int *q = &p[rand() % n];
> +        unsigned int *q = &p[random_range(n)];
>          unsigned int tmp = *p;
>          *p = *q;
>          *q = tmp;
> @@ -590,7 +591,7 @@ static void
>  shuffle_u32s(uint32_t *p, size_t n)
>  {
>      for (; n > 1; n--, p++) {
> -        uint32_t *q = &p[rand() % n];
> +        uint32_t *q = &p[random_range(n)];
>          uint32_t tmp = *p;
>          *p = *q;
>          *q = tmp;
> @@ -879,7 +880,7 @@ test_many_rules_in_one_table(int argc OVS_UNUSED, char
> *argv[] OVS_UNUSED)
>          int i;
>
>          do {
> -            wcf = rand() & ((1u << CLS_N_FIELDS) - 1);
> +            wcf = random_uint32() & ((1u << CLS_N_FIELDS) - 1);
>              value_mask = ~wcf & ((1u << CLS_N_FIELDS) - 1);
>          } while ((1 << count_ones(value_mask)) < N_RULES);
>
> @@ -887,10 +888,10 @@ test_many_rules_in_one_table(int argc OVS_UNUSED,
> char *argv[] OVS_UNUSED)
>          tcls_init(&tcls);
>
>          for (i = 0; i < N_RULES; i++) {
> -            unsigned int priority = rand();
> +            unsigned int priority = random_uint32();
>
>              do {
> -                value_pats[i] = rand() & value_mask;
> +                value_pats[i] = random_uint32() & value_mask;
>              } while (array_contains(value_pats, i, value_pats[i]));
>
>              rules[i] = make_rule(wcf, priority, value_pats[i]);
> @@ -928,7 +929,7 @@ test_many_rules_in_n_tables(int n_tables)
>      assert(n_tables < 10);
>      for (i = 0; i < n_tables; i++) {
>          do {
> -            wcfs[i] = rand() & ((1u << CLS_N_FIELDS) - 1);
> +            wcfs[i] = random_uint32() & ((1u << CLS_N_FIELDS) - 1);
>          } while (array_contains(wcfs, i, wcfs[i]));
>      }
>
> @@ -937,7 +938,7 @@ test_many_rules_in_n_tables(int n_tables)
>          struct classifier cls;
>          struct tcls tcls;
>
> -        srand(iteration);
> +        random_set_seed(iteration + 1);
>          for (i = 0; i < MAX_RULES; i++) {
>              priorities[i] = i * 129;
>          }
> @@ -949,8 +950,8 @@ test_many_rules_in_n_tables(int n_tables)
>          for (i = 0; i < MAX_RULES; i++) {
>              struct test_rule *rule;
>              unsigned int priority = priorities[i];
> -            int wcf = wcfs[rand() % n_tables];
> -            int value_pat = rand() & ((1u << CLS_N_FIELDS) - 1);
> +            int wcf = wcfs[random_range(n_tables)];
> +            int value_pat = random_uint32() & ((1u << CLS_N_FIELDS) - 1);
>              rule = make_rule(wcf, priority, value_pat);
>              tcls_insert(&tcls, rule);
>              classifier_insert(&cls, &rule->cls_rule);
> @@ -963,7 +964,7 @@ test_many_rules_in_n_tables(int n_tables)
>              struct test_rule *target;
>              struct cls_cursor cursor;
>
> -            target = clone_rule(tcls.rules[rand() % tcls.n_rules]);
> +            target = clone_rule(tcls.rules[random_uint32() %
> tcls.n_rules]);
>
Same here.

>
>              cls_cursor_init(&cursor, &cls, &target->cls_rule);
>              CLS_CURSOR_FOR_EACH_SAFE (rule, next_rule, cls_rule, &cursor)
> {
> diff --git a/tests/test-hindex.c b/tests/test-hindex.c
> index b5fe9f0..7a3ef72 100644
> --- a/tests/test-hindex.c
> +++ b/tests/test-hindex.c
> @@ -21,6 +21,7 @@
>  #include "hindex.h"
>  #include <string.h>
>  #include "hash.h"
> +#include "random.h"
>  #include "util.h"
>
>  #undef NDEBUG
> @@ -108,7 +109,7 @@ static void
>  shuffle(int *p, size_t n)
>  {
>      for (; n > 1; n--, p++) {
> -        int *q = &p[rand() % n];
> +        int *q = &p[random_range(n)];
>          int tmp = *p;
>          *p = *q;
>          *q = tmp;
> diff --git a/tests/test-hmap.c b/tests/test-hmap.c
> index c202eae..6102be3 100644
> --- a/tests/test-hmap.c
> +++ b/tests/test-hmap.c
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2008, 2009, 2010 Nicira, Inc.
> + * Copyright (c) 2008, 2009, 2010, 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.
> @@ -21,6 +21,7 @@
>  #include "hmap.h"
>  #include <string.h>
>  #include "hash.h"
> +#include "random.h"
>  #include "util.h"
>
>  #undef NDEBUG
> @@ -108,7 +109,7 @@ static void
>  shuffle(int *p, size_t n)
>  {
>      for (; n > 1; n--, p++) {
> -        int *q = &p[rand() % n];
> +        int *q = &p[random_range(n)];
>          int tmp = *p;
>          *p = *q;
>          *q = tmp;
> diff --git a/tests/test-util.c b/tests/test-util.c
> index 3422af3..729b4e6 100644
> --- a/tests/test-util.c
> +++ b/tests/test-util.c
> @@ -1,5 +1,5 @@
>  /*
> - * Copyright (c) 2011, 2012 Nicira, Inc.
> + * Copyright (c) 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.
> @@ -94,7 +94,7 @@ static void
>  shuffle(unsigned int *p, size_t n)
>  {
>      for (; n > 1; n--, p++) {
> -        unsigned int *q = &p[rand() % n];
> +        unsigned int *q = &p[random_range(n)];
>          unsigned int tmp = *p;
>          *p = *q;
>          *q = tmp;
>
> Otherwise looks good to me.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20130624/58fadfc0/attachment-0003.html>


More information about the dev mailing list