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]