Author: kkolinko Date: Fri Feb 12 03:19:31 2010 New Revision: 909212 URL: http://svn.apache.org/viewvc?rev=909212&view=rev Log: When the key is null (i.e., a stale entry), it cannot be removed with an explicit remove(key) call: you'll get an NPE. Those can be removed with expungeStaleEntries() call. Also, simplified the code: Reference.referent can be accessed by calling get() - no need to use reflection for that.
Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java Modified: tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java?rev=909212&r1=909211&r2=909212&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java (original) +++ tomcat/trunk/java/org/apache/catalina/loader/WebappClassLoader.java Fri Feb 12 03:19:31 2010 @@ -2177,15 +2177,13 @@ ThreadLocal.class); mapRemove.setAccessible(true); Object[] table = (Object[]) internalTableField.get(map); + int staleEntriesCount = 0; if (table != null) { for (int j =0; j < table.length; j++) { if (table[j] != null) { boolean remove = false; // Check the key - Field keyField = - Reference.class.getDeclaredField("referent"); - keyField.setAccessible(true); - Object key = keyField.get(table[j]); + Object key = ((Reference<?>) table[j]).get(); if (this.equals(key) || (key != null && this == key.getClass().getClassLoader())) { remove = true; @@ -2200,7 +2198,6 @@ remove = true; } if (remove) { - Object entry = ((Reference<?>) table[j]).get(); Object[] args = new Object[4]; if (key != null) { args[0] = key.getClass().getCanonicalName(); @@ -2221,11 +2218,21 @@ "webappClassLoader.clearThreadLocal", args)); } - mapRemove.invoke(map, entry); + if (key == null) { + staleEntriesCount++; + } else { + mapRemove.invoke(map, key); + } } } } } + if (staleEntriesCount > 0) { + Method mapRemoveStale = + map.getClass().getDeclaredMethod("expungeStaleEntries"); + mapRemoveStale.setAccessible(true); + mapRemoveStale.invoke(map); + } } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org