1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2025-12-28 00:01:33 -08:00

mps br/vmem: simple-chunk-return:

zcoll.c:
 How to get rid of all the objects, so full collect really collects all automatic objects:
   - Rootdrop() helps, but we can still retain a 1.2MB object;
   - stackwipe() does not help much -- these unwanted ambig refs are being left on the stack by MPS code that runs between mps_arena_collect and the flip!
   - therefore StackScan(0/1) to destroy stack+reg root before full collect: it's the only way to be sure.

 Reproducibility:
   - give Make() a random? switch, acted on by df() = diversity function, to allow bypass of rnd();
   - ZRndStateSet, to set the seed for rnd()

 Output:
   - print_M: switchable Mebibytes or Megabytes (more useful, to be honest);
   - get(): don't report message times, it messes up diffs.

 testlib.c/h:
 Reproducibility:
   - fix rnd_state so a rnd_state getter is possible;
   - testlib.h += rnd_state_t, rnd_state(), rnd_state_set(), rnd_state_set_v2()

 trace.c: traceFindGrey diag: no newline please

Copied from Perforce
 Change: 170093
 ServerID: perforce.ravenbrook.com
This commit is contained in:
Richard Kistruck 2010-03-22 23:00:42 +00:00
parent 968eafea90
commit 1ff022cae1
4 changed files with 255 additions and 47 deletions

View file

@ -221,48 +221,100 @@ mps_addr_t rnd_addr(void)
}
/* randomize -- randomize the generator, or initialize to replay */
/* randomize -- randomize the generator, or initialize to replay
*
* There have been 3 versions of the rnd-states reported by this
* function:
*
* 1. before RHSK got his hands on rnd(). These seed values are not
* currently supported, but it might be easy to add support.
*
* 2. v2 states: the published "seed" (state) value was the seed
* *before* the 10 rnds to churn up and separate nearby values
* from time(). This is unfortunate: you can't write a rnd_state
* getter, because it would have to go 10 steps back in time.
*
* 3. v3 states: when autogenerated from time(), the published
* state is that *after* the 10 rnds. Therefore you can get this
* easily, store it, re-use it, etc.
*/
void randomize(int argc, char **argv)
{
int n;
unsigned long seed0;
int i;
int n;
unsigned long seedt;
unsigned long seed0;
if (argc > 1) {
n = sscanf(argv[1], "%lu", &seed0);
Insist(n == 1);
printf("randomize(): resetting initial seed to: %lu.\n", seed0);
printf("randomize(): resetting initial state (v3) to: %lu.\n", seed0);
rnd_state_set(seed0);
} else {
/* time_t uses an arbitrary encoding, but hopefully the low order */
/* 31 bits will have at least one bit changed from run to run. */
seed0 = 1 + time(NULL) % (R_m - 1);
printf("randomize(): choosing initial seed: %lu.\n", seed0);
}
seedt = 1 + time(NULL) % (R_m - 1);
/* The value returned by time() on some OSs may simply be a
* count of seconds: therefore successive runs may start with
* nearby seeds, possibly differing only by 1. So the first value
* returned by rnd() may differ by only 48271. It is conceivable
* that some tests might be able to 'spot' this pattern (for
* example: by using the first rnd() value, mod 100M and rounded
* to multiple of 1024K, as arena size in bytes).
*
* So to mix it up a bit, we do a few iterations now. How many?
* Very roughly, 48271^2 is of the same order as 2^31, so two
* iterations would make the characteristic difference similar to
* the period. Hey, let's go wild and do 10.
*/
rnd_state_set(seedt);
for(i = 0; i < 10; i += 1) {
(void)rnd();
}
seed0 = rnd_state();
printf("randomize(): choosing initial state (v3): %lu.\n", seed0);
rnd_state_set(seed0);
}
}
unsigned long rnd_state(void)
{
return seed;
}
void rnd_state_set(unsigned long seed0)
{
Insist(seed0 < R_m);
Insist(seed0 != 0);
seed = seed0;
rnd_verify(0);
Insist(seed == seed0);
}
/* The 'random' seed is taken from time(), which may simply be a
* count of seconds: therefore successive runs may start with
* nearby seeds, possibly differing only by 1. So the first value
* returned by rnd() may differ by only 48271. It is conceivable
* that some tests might be able to 'spot' this pattern (for
* example: by using the first rnd() value, mod 100M and rounded
* to multiple of 1024K, as arena size in bytes).
*
* So to mix it up a bit, we do a few iterations now. How many?
* Very roughly, 48271^2 is of the same order as 2^31, so two
* iterations would make the characteristic difference similar to
* the period. Hey, let's go wild and do 10.
*/
/* rnd_state_set_2 -- legacy support for v2 rnd states
*
* In v2, the published "seed" (state) value was the seed *before*
* the 10 rnds to churn up and separate nearby values from time().
*
* Set the seed, then convert it to a v3 state by doing those 10 rnds.
*/
void rnd_state_set_v2(unsigned long seed0_v2)
{
int i;
unsigned long seed0;
rnd_state_set(seed0_v2);
for(i = 0; i < 10; i += 1) {
(void)rnd();
}
seed0 = rnd_state();
printf("rnd_state_set_v2(): seed0_v2 = %lu, converted to state_v3 = %lu.\n", seed0_v2, seed0);
rnd_state_set(seed0);
}