summaryrefslogtreecommitdiff
path: root/dbg_mlc.c
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2022-01-15 12:51:52 +0300
committerIvan Maidanski <ivmai@mail.ru>2022-01-15 12:51:52 +0300
commit4bb36e42aad6361676ae5ccd43108db3efea0ccb (patch)
tree35c92ae256595995850c5890e658cafa8d72582a /dbg_mlc.c
parent457b0241f1a2bfbee6f5257a5c9646e944d406d2 (diff)
downloadbdwgc-4bb36e42aad6361676ae5ccd43108db3efea0ccb.tar.gz
Remove duplication of random numbers generator formula
(refactoring) * dbg_mlc.c [LINT2] (GC_random): Rename to GC_rand and change return type from long to int; define as static (to match that in disclaim_test but w/o GC_ATTR_NO_SANITIZE_THREAD); define only if KEEP_BACK_PTRS. * dbg_mlc.c [LINT2] (GC_random): Change type of seed local variable to GC_RAND_STATE_T; use GC_RAND_NEXT() instead of the direct RNG formula. * tests/disclaim_test.c [GC_PTHREADS || LINT2] (GC_rand): Likewise. * tests/disclaim_weakmap_test.c [GC_PTHREADS || LINT2] (GC_rand): Likewise. * dbg_mlc.c [KEEP_BACK_PTRS && LINT2] (RANDOM): Replace GC_random() to (int)GC_rand(). * dbg_mlc.c [KEEP_BACK_PTRS && !LINT2] (GC_RAND_MAX): Undefine before redefine. * dbg_mlc.c [KEEP_BACK_PTRS] (GC_generate_random_heap_address): Cast RANDOM() and GC_RAND_MAX to word. * include/private/gc_priv.h [LINT2] (GC_random): Do not declare. * include/private/gc_priv.h [THREADS || LINT2] (GC_RAND_STATE_T, GC_RAND_NEXT): New macro; add comment. * include/private/gc_priv.h [THREADS || LINT2] (GC_RAND_MAX): Cast to int; define also in case of THREADS. * tests/disclaim_bench.c [LINT2] (seed): New static variable. * tests/disclaim_bench.c [LINT2] (rand): Define to GC_RAND_NEXT(&seed) instead of (int)GC_random(). * tests/disclaim_test.c [GC_PTHREADS || LINT2] (GC_rand): Do not refer GC_random in comment.
Diffstat (limited to 'dbg_mlc.c')
-rw-r--r--dbg_mlc.c26
1 files changed, 12 insertions, 14 deletions
diff --git a/dbg_mlc.c b/dbg_mlc.c
index b333a128..1ffee0f4 100644
--- a/dbg_mlc.c
+++ b/dbg_mlc.c
@@ -54,23 +54,20 @@
}
#endif /* !SHORT_DBG_HDRS */
+#ifdef KEEP_BACK_PTRS
+
#ifdef LINT2
- long GC_random(void)
+ static int GC_rand(void)
{
- static unsigned seed = 1; /* not thread-safe */
+ static GC_RAND_STATE_T seed;
- /* Linear congruential pseudo-random numbers generator. */
- seed = (seed * 1103515245U + 12345) & GC_RAND_MAX; /* overflow is ok */
- return (long)seed;
+ return GC_RAND_NEXT(&seed);
}
-#endif
-#ifdef KEEP_BACK_PTRS
-
-#ifdef LINT2
-# define RANDOM() GC_random()
+# define RANDOM() (long)GC_rand()
#else
# include <stdlib.h>
+# undef GC_RAND_MAX
# define GC_RAND_MAX RAND_MAX
# if defined(__GLIBC__) || defined(SOLARIS) \
@@ -163,16 +160,17 @@
GC_API void * GC_CALL GC_generate_random_heap_address(void)
{
size_t i;
- word heap_offset = RANDOM();
+ word heap_offset = (word)RANDOM();
- if (GC_heapsize > GC_RAND_MAX) {
+ if (GC_heapsize > (word)GC_RAND_MAX) {
heap_offset *= GC_RAND_MAX;
- heap_offset += RANDOM();
+ heap_offset += (word)RANDOM();
}
heap_offset %= GC_heapsize;
/* This doesn't yield a uniform distribution, especially if */
- /* e.g. RAND_MAX = 1.5* GC_heapsize. But for typical cases, */
+ /* e.g. RAND_MAX is 1.5*GC_heapsize. But for typical cases, */
/* it's not too bad. */
+
for (i = 0;; ++i) {
size_t size;