On May 14, 2017, at 11:27 AM, Massimo Manghi 
<man...@biol.unipr.it<mailto:man...@biol.unipr.it>> wrote:



On 05/14/2017 03:45 AM, Karl Lehenbauer wrote:
This is kind of cool.  If the mod_rivet master interpreter has gotten
its random seed initialized, say by some Tcl code requesting a random
number, then when Apache forks off children they will inherit the same
random seed and hence produce the same sequence.

This can be fixed from the Rivet config by forcing children to re-seed
the RNG, something like:

RivetServerConf ChildInitScript "expr {srand([clock clicks] + [pid])}”

It might be a good idea to do this in C in Rivet whenever running
SeparateVirtualInterps off.



Did you actually try also the case with separate interpreters? In mod_rivet 2.3 
these interpreters are slaves of a single root interpreter. How deeply are 
slave interpreters initialized wrt their parent?

In mod_rivet 3.0 the problem should be confined in the prefork bridge when 
SeparateVirtualInterps Off, otherwise separate interpreters are interpreters in 
their own right, not slaves

-- Massimo

Good catch, Massimo...  I had not tried it.  However from the command line it 
looks like new interpreters are seeded uniquely, even safe interpreters...

 $ tclsh

 % info patchlevel
8.6.6

 % interp create
interp0
 % interp0 eval "expr rand()"
0.06173784474923175

 % interp create
interp1
 % interp1 eval "expr rand()"
0.40116244712898624

 % interp create -safe
interp2
 % interp2 eval "expr rand()"
0.2504010522972797

 % interp create -safe
interp3
 % interp3 eval "expr rand()"
0.27850173519854515

Reply via email to