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();
  
  
  

Reply via email to