craigmcc 00/12/21 17:54:34 Modified: catalina/src/share/org/apache/catalina/session ManagerBase.java StandardManager.java Log: Cause the random number to be initialized when a webapp first starts, rather than waiting for the first call to request.getSession(). Actually use the calculated seed value to initialize the random number generator, rather than just calculating it :-(. On at least Linux and Win98, this totally eliminates the multi-second seeding delay -- apparently, the default seeding algorithm is the one that is computationally expensive. Revision Changes Path 1.3 +29 -19 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/ManagerBase.java Index: ManagerBase.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/ManagerBase.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- ManagerBase.java 2000/10/13 23:33:26 1.2 +++ ManagerBase.java 2000/12/22 01:54:33 1.3 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/ManagerBase.java,v 1.2 2000/10/13 23:33:26 craigmcc Exp $ - * $Revision: 1.2 $ - * $Date: 2000/10/13 23:33:26 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/ManagerBase.java,v 1.3 2000/12/22 01:54:33 craigmcc Exp $ + * $Revision: 1.3 $ + * $Date: 2000/12/22 01:54:33 $ * * ==================================================================== * @@ -86,7 +86,7 @@ * be subclassed to create more sophisticated Manager implementations. * * @author Craig R. McClanahan - * @version $Revision: 1.2 $ $Date: 2000/10/13 23:33:26 $ + * @version $Revision: 1.3 $ $Date: 2000/12/22 01:54:33 $ */ public abstract class ManagerBase implements Manager { @@ -413,21 +413,31 @@ public synchronized Random getRandom() { if (this.random == null) { - log(sm.getString("managerBase.seeding", randomClass)); - try { - Class clazz = Class.forName(randomClass); - this.random = (Random) clazz.newInstance(); - long seed = System.currentTimeMillis(); - char entropy[] = getEntropy().toCharArray(); - for (int i = 0; i < entropy.length; i++) { - long update = ((byte) entropy[i]) << ((i % 8) * 8); - seed ^= update; - } - } catch (Exception e) { - log(sm.getString("managerBase.random", randomClass), e); - this.random = new java.util.Random(); - } - log(sm.getString("managerBase.complete", randomClass)); + synchronized (this) { + if (this.random == null) { + // Calculate the new random number generator seed + log(sm.getString("managerBase.seeding", randomClass)); + long seed = System.currentTimeMillis(); + char entropy[] = getEntropy().toCharArray(); + for (int i = 0; i < entropy.length; i++) { + long update = ((byte) entropy[i]) << ((i % 8) * 8); + seed ^= update; + } + try { + // Construct and seed a new random number generator + Class clazz = Class.forName(randomClass); + this.random = (Random) clazz.newInstance(); + this.random.setSeed(seed); + } catch (Exception e) { + // Fall back to the simple case + log(sm.getString("managerBase.random", randomClass), + e); + this.random = new java.util.Random(); + this.random.setSeed(seed); + } + log(sm.getString("managerBase.complete", randomClass)); + } + } } return (this.random); 1.5 +11 -4 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardManager.java Index: StandardManager.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardManager.java,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- StandardManager.java 2000/10/14 21:43:54 1.4 +++ StandardManager.java 2000/12/22 01:54:33 1.5 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardManager.java,v 1.4 2000/10/14 21:43:54 craigmcc Exp $ - * $Revision: 1.4 $ - * $Date: 2000/10/14 21:43:54 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/session/StandardManager.java,v 1.5 2000/12/22 01:54:33 craigmcc Exp $ + * $Revision: 1.5 $ + * $Date: 2000/12/22 01:54:33 $ * * ==================================================================== * @@ -105,7 +105,7 @@ * <code>stop()</code> methods of this class at the correct times. * * @author Craig R. McClanahan - * @version $Revision: 1.4 $ $Date: 2000/10/14 21:43:54 $ + * @version $Revision: 1.5 $ $Date: 2000/12/22 01:54:33 $ */ public final class StandardManager @@ -573,6 +573,13 @@ (sm.getString("standardManager.alreadyStarted")); lifecycle.fireLifecycleEvent(START_EVENT, null); started = true; + + // Force initialization of the random number generator + if (debug >= 1) + log("Force random number initialization starting"); + String dummy = generateSessionId(); + if (debug >= 1) + log("Force random number initialization completed"); // Start the background reaper thread threadStart();