[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