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 + */ + } + } } } }