Changeset: 20a08cf056b8 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/20a08cf056b8
Modified Files:
        gdk/gdk_sample.c
Branch: default
Log Message:

The random number generator (next()) is not reentrant, so use private state.


diffs (82 lines):

diff --git a/gdk/gdk_sample.c b/gdk/gdk_sample.c
--- a/gdk/gdk_sample.c
+++ b/gdk/gdk_sample.c
@@ -98,7 +98,7 @@ OIDTreeToBATAntiset(struct oidtreenode *
 }
 
 static BAT *
-do_batsample(oid hseq, BUN cnt, BUN n, random_state_engine rse, MT_Lock *lock)
+do_batsample(oid hseq, BUN cnt, BUN n, random_state_engine rse)
 {
        BAT *bn;
        BUN slen;
@@ -204,34 +204,15 @@ do_batsample(oid hseq, BUN cnt, BUN n, r
                        return NULL;
                }
 
-               if (lock)
-                       MT_lock_set(lock);
-               /* generate a list of random numbers; note we use the
-                * "tree" array, but we use the value from each location
-                * before it is overwritten by the use as part of the
-                * binary tree */
-               for (rescnt = 0; rescnt < n; rescnt++)
-                       tree[rescnt].r = next(rse);
-
                /* while we do not have enough sample OIDs yet */
-               BUN rnd = 0;
                for (rescnt = 0; rescnt < n; rescnt++) {
                        oid candoid;
                        do {
-                               if (rnd == n) {
-                                       /* we ran out of random numbers,
-                                        * so generate more */
-                                       for (rnd = rescnt; rnd < n; rnd++)
-                                               tree[rnd].r = next(rse);
-                                       rnd = rescnt;
-                               }
-                               candoid = minoid + tree[rnd++].r % cnt;
+                               candoid = minoid + next(rse) % cnt;
                                /* if that candidate OID was already
                                 * generated, try again */
                        } while (!OIDTreeMaybeInsert(tree, candoid, rescnt));
                }
-               if (lock)
-                       MT_lock_unset(lock);
                if (!antiset) {
                        OIDTreeToBAT(tree, bn);
                } else {
@@ -258,31 +239,15 @@ BATsample_with_seed(BAT *b, BUN n, uint6
        TRC_DEBUG_IF(ALGO) t0 = GDKusec();
        init_random_state_engine(rse, seed);
 
-       BAT *bn = do_batsample(b->hseqbase, BATcount(b), n, rse, NULL);
+       BAT *bn = do_batsample(b->hseqbase, BATcount(b), n, rse);
        TRC_DEBUG(ALGO, ALGOBATFMT "," BUNFMT " -> " ALGOOPTBATFMT
                  " (" LLFMT " usec)\n",
                  ALGOBATPAR(b), n, ALGOOPTBATPAR(bn), GDKusec() - t0);
        return bn;
 }
 
-static MT_Lock rse_lock = MT_LOCK_INITIALIZER(rse_lock);
 BAT *
 BATsample(BAT *b, BUN n)
 {
-       static random_state_engine rse;
-       lng t0 = 0;
-
-       TRC_DEBUG_IF(ALGO) t0 = GDKusec();
-       MT_lock_set(&b->theaplock);
-       BUN batcount = BATcount(b);
-       MT_lock_unset(&b->theaplock);
-       MT_lock_set(&rse_lock);
-       if (rse[0] == 0 && rse[1] == 0 && rse[2] == 0 && rse[3] == 0)
-               init_random_state_engine(rse, (uint64_t) GDKusec());
-       MT_lock_unset(&rse_lock);
-       BAT *bn = do_batsample(b->hseqbase, batcount, n, rse, &rse_lock);
-       TRC_DEBUG(ALGO, ALGOBATFMT "," BUNFMT " -> " ALGOOPTBATFMT
-                 " (" LLFMT " usec)\n",
-                 ALGOBATPAR(b), n, ALGOOPTBATPAR(bn), GDKusec() - t0);
-       return bn;
+       return BATsample_with_seed(b, n, (uint64_t) GDKusec());
 }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to