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

Ben Pfaff blp at nicira.com
Wed Jun 19 20:17:10 UTC 2013


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;
         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]);
 
             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;
-- 
1.7.2.5




More information about the dev mailing list