remm 01/07/13 23:51:40 Modified: catalina/src/share/org/apache/catalina/loader LocalStrings.properties WebappClassLoader.java WebappLoader.java Log: - Fix a race condition in the modified method, as reported by Jon Stevens. One of the arrays could be could be bigger than the other by one elemnt. - If there is an exception in modified, it is now logged and caught, instead of killing the thread which tracks modifications. Revision Changes Path 1.3 +1 -0 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/loader/LocalStrings.properties Index: LocalStrings.properties =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/loader/LocalStrings.properties,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- LocalStrings.properties 2001/06/21 01:39:07 1.2 +++ LocalStrings.properties 2001/07/14 06:51:39 1.3 @@ -27,3 +27,4 @@ webappLoader.removeRepository=Removing repository {0} webappLoader.starting=Starting this Loader webappLoader.stopping=Stopping this Loader +webappLoader.failModifiedCheck=Error tracking modifications 1.9 +22 -12 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java Index: WebappClassLoader.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- WebappClassLoader.java 2001/07/12 21:22:25 1.8 +++ WebappClassLoader.java 2001/07/14 06:51:39 1.9 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java,v 1.8 2001/07/12 21:22:25 remm Exp $ - * $Revision: 1.8 $ - * $Date: 2001/07/12 21:22:25 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/loader/WebappClassLoader.java,v 1.9 2001/07/14 06:51:39 remm Exp $ + * $Revision: 1.9 $ + * $Date: 2001/07/14 06:51:39 $ * * ==================================================================== * @@ -123,7 +123,7 @@ * * @author Remy Maucherat * @author Craig R. McClanahan - * @version $Revision: 1.8 $ $Date: 2001/07/12 21:22:25 $ + * @version $Revision: 1.9 $ $Date: 2001/07/14 06:51:39 $ */ public class WebappClassLoader extends URLClassLoader @@ -687,13 +687,23 @@ // Checking for modified loaded resources int length = paths.length; + // A rare race condition can occur in the updates of the two arrays + // It's totally ok if the latest class added is not checked (it will + // be checked the next time + int length2 = lastModifiedDates.length; + if (length > length2) + length = length2; + for (int i = 0; i < length; i++) { try { long lastModified = ((ResourceAttributes) resources.getAttributes(paths[i])) .getLastModified().getTime(); if (lastModified != lastModifiedDates[i]) { - log(" Resource '" + paths[i] + "' was modified"); + log(" Resource '" + paths[i] + + "' was modified; Date is now: " + + new java.util.Date(lastModified) + " Was: " + + new java.util.Date(lastModifiedDates[i])); return (true); } } catch (NamingException e) { @@ -1535,19 +1545,19 @@ int j; - String[] result = new String[paths.length + 1]; - for (j = 0; j < paths.length; j++) { - result[j] = paths[j]; - } - result[paths.length] = fullPath; - paths = result; - long[] result2 = new long[lastModifiedDates.length + 1]; for (j = 0; j < lastModifiedDates.length; j++) { result2[j] = lastModifiedDates[j]; } result2[lastModifiedDates.length] = entry.lastModified; lastModifiedDates = result2; + + String[] result = new String[paths.length + 1]; + for (j = 0; j < paths.length; j++) { + result[j] = paths[j]; + } + result[paths.length] = fullPath; + paths = result; } 1.11 +12 -7 jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/loader/WebappLoader.java Index: WebappLoader.java =================================================================== RCS file: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/loader/WebappLoader.java,v retrieving revision 1.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- WebappLoader.java 2001/07/13 01:47:47 1.10 +++ WebappLoader.java 2001/07/14 06:51:39 1.11 @@ -1,7 +1,7 @@ /* - * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/loader/WebappLoader.java,v 1.10 2001/07/13 01:47:47 remm Exp $ - * $Revision: 1.10 $ - * $Date: 2001/07/13 01:47:47 $ + * $Header: /home/cvs/jakarta-tomcat-4.0/catalina/src/share/org/apache/catalina/loader/WebappLoader.java,v 1.11 2001/07/14 06:51:39 remm Exp $ + * $Revision: 1.11 $ + * $Date: 2001/07/14 06:51:39 $ * * ==================================================================== * @@ -119,7 +119,7 @@ * * @author Craig R. McClanahan * @author Remy Maucherat - * @version $Revision: 1.10 $ $Date: 2001/07/13 01:47:47 $ + * @version $Revision: 1.11 $ $Date: 2001/07/14 06:51:39 $ */ public class WebappLoader @@ -1250,9 +1250,14 @@ // Wait for our check interval threadSleep(); - // Perform our modification check - if (!classLoader.modified()) - continue; + try { + // Perform our modification check + if (!classLoader.modified()) + continue; + } catch (Exception e) { + log(sm.getString("webappLoader.failModifiedCheck"), e); + continue; + } // Handle a need for reloading notifyContext();