mmanders    01/06/19 16:04:39

  Modified:    src/share/org/apache/tomcat/core Tag: tomcat_32
                        ServletWrapper.java
  Log:
  Syncronized around call to loader.shouldReload to prevent getting the loader in an 
invalid state.  Fixes Bug # 1628.
  
  Revision  Changes    Path
  No                   revision
  
  
  No                   revision
  
  
  1.60.2.6  +38 -32    
jakarta-tomcat/src/share/org/apache/tomcat/core/Attic/ServletWrapper.java
  
  Index: ServletWrapper.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-tomcat/src/share/org/apache/tomcat/core/Attic/ServletWrapper.java,v
  retrieving revision 1.60.2.5
  retrieving revision 1.60.2.6
  diff -u -r1.60.2.5 -r1.60.2.6
  --- ServletWrapper.java       2001/01/12 04:39:05     1.60.2.5
  +++ ServletWrapper.java       2001/06/19 23:04:38     1.60.2.6
  @@ -422,38 +422,44 @@
        if( isReloadable ) {// && ! "invoker".equals( getServletName())) {
            ServletLoader loader=context.getServletLoader();
            if( loader!=null) {
  -             // XXX no need to check after we remove the old loader
  -             if( loader.shouldReload() ) {
  -                 // workaround for destroy 
  -                 try {
  -                     destroy();
  -                 } catch(Exception ex ) {
  -                     context.log( "Error in destroy ", ex );
  -                 }
  -                 initialized=false;
  -                 loader.reload();
  -                 
  -                 ContextManager cm=context.getContextManager();
  -                 cm.doReload( req, context );
  -                 
  -                 servlet=null;
  -                 servletClass=null;
  -                 /* Initial attempt to shut down the context and sessions.
  -                    
  -                    String path=context.getPath();
  -                    String docBase=context.getDocBase();
  -                    // XXX all other properties need to be saved
  -                    // or something else
  -                    ContextManager cm=context.getContextManager();
  -                    cm.removeContext(path);
  -                    Context ctx=new Context();
  -                    ctx.setPath( path );
  -                    ctx.setDocBase( docBase );
  -                    cm.addContext( ctx );
  -                    context=ctx;
  -                    // XXX shut down context, remove sessions, etc
  -                 */
  -             }
  +                // We need to syncronize here so that multiple threads don't
  +                // try and reload the class.  The first thread through will
  +                // create the new loader which will make shouldReload return
  +                // false for subsequent threads.
  +                synchronized(this) {
  +                    // XXX no need to check after we remove the old loader
  +                    if( loader.shouldReload() ) {
  +                        // workaround for destroy 
  +                        try {
  +                            destroy();
  +                        } catch(Exception ex ) {
  +                            context.log( "Error in destroy ", ex );
  +                        }
  +                        initialized=false;
  +                        loader.reload();
  +                        
  +                        ContextManager cm=context.getContextManager();
  +                        cm.doReload( req, context );
  +                        
  +                        servlet=null;
  +                        servletClass=null;
  +                        /* Initial attempt to shut down the context and sessions.
  +                           
  +                           String path=context.getPath();
  +                           String docBase=context.getDocBase();
  +                           // XXX all other properties need to be saved
  +                           // or something else
  +                           ContextManager cm=context.getContextManager();
  +                           cm.removeContext(path);
  +                           Context ctx=new Context();
  +                           ctx.setPath( path );
  +                           ctx.setDocBase( docBase );
  +                           cm.addContext( ctx );
  +                           context=ctx;
  +                           // XXX shut down context, remove sessions, etc
  +                        */
  +                    }
  +                }
            }
        }
       }
  
  
  

Reply via email to