Remy, Remy Maucherat wrote On 09/28/05 03:12,: > [EMAIL PROTECTED] wrote: > >> + /* >> + * Clear the IntrospectionUtils cache. >> + * >> + * Implementation note: >> + * Any reference to IntrospectionUtils which may cause the static >> + * initalizer of that class to be invoked must occur prior to >> setting >> + * the started flag to FALSE, because the static initializer of >> + * IntrospectionUtils makes a call to >> + * org.apache.commons.logging.LogFactory.getLog(), which ultimately >> + * calls the loadClass() method of the thread context classloader, >> + * which is the same as this classloader, whose impl throws a >> + * ThreadDeath if the started flag has been set to FALSE. >> + */ >> + IntrospectionUtils.clear(); >> + > > > This commit does not make sense to me. The static initializer is called > when loading the class, and obviously the webapp CL is not going to load > IntrospectionUtils.
This code in IntrospectionUtils.java: private static org.apache.commons.logging.Log log= org.apache.commons.logging.LogFactory.getLog( IntrospectionUtils.class ); will cause LogFactoryImpl.getLogConstructor() to be called, which in turn will invoke LogFactoryImpl.loadClass(String name), which is implemented as follows: private static Class loadClass( final String name ) throws ClassNotFoundException { Object result = AccessController.doPrivileged( new PrivilegedAction() { public Object run() { ClassLoader threadCL = getContextClassLoader(); if (threadCL != null) { try { return threadCL.loadClass(name); } catch( ClassNotFoundException ex ) { // ignore } } try { return Class.forName( name ); } catch (ClassNotFoundException e) { return e; } } }); if (result instanceof Class) return (Class)result; throw (ClassNotFoundException)result; } Notice the use of the thread context classloader (to load the class with the given name), which is the same as the WebappClassLoader. WebappClassLoader.loadClass() has this: // Don't load classes if class loader is stopped if (!started) { log.info(sm.getString("webappClassLoader.stopped")); throw new ThreadDeath(); } We have seen the ThreadDeath in our callstacks, hence this fix. Jan > You should forget that the CVS exists, as we're in the middle of > migrating to SVN (of course, losing that commit will not be a problem). > > Rémy > > --------------------------------------------------------------------- > To unsubscribe, e-mail: [EMAIL PROTECTED] > For additional commands, e-mail: [EMAIL PROTECTED] > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]