On 20/05/2010, Mark Thomas <ma...@apache.org> wrote: > On 20/05/2010 16:25, jfcl...@apache.org wrote: > > Author: jfclere > > Date: Thu May 20 15:25:13 2010 > > New Revision: 946671 > > > > URL: http://svn.apache.org/viewvc?rev=946671&view=rev > > Log: > > Prevent core due to wrong synchronisation. > > > > Modified: > > tomcat/trunk/java/org/apache/catalina/core/AprLifecycleListener.java > > > > Modified: > tomcat/trunk/java/org/apache/catalina/core/AprLifecycleListener.java > > URL: > http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/AprLifecycleListener.java?rev=946671&r1=946670&r2=946671&view=diff > > > ============================================================================== > > --- tomcat/trunk/java/org/apache/catalina/core/AprLifecycleListener.java > (original) > > +++ tomcat/trunk/java/org/apache/catalina/core/AprLifecycleListener.java > Thu May 20 15:25:13 2010 > > @@ -72,9 +72,15 @@ public class AprLifecycleListener > > protected static boolean sslAvailable = false; > > protected static boolean aprAvailable = false; > > > > + protected static String lock = ""; > > + > > > Better as: > > protected static Object lock = new Object();
Even better: protected static final Object lock = new Object(); otherwise the lock can be subverted. > > Mark > > > > public static boolean isAprAvailable() { > > //https://issues.apache.org/bugzilla/show_bug.cgi?id=48613 > > - if (instanceCreated) init(); > > + if (instanceCreated) { > > + synchronized (lock) { > > + init(); > > + } > > + } > > return aprAvailable; > > } > > > > @@ -92,28 +98,32 @@ public class AprLifecycleListener > > public void lifecycleEvent(LifecycleEvent event) { > > > > if (Lifecycle.INIT_EVENT.equals(event.getType())) { > > - init(); > > - if (aprAvailable) { > > - try { > > - initializeSSL(); > > - } catch (Throwable t) { > > - log.info(sm.getString("aprListener.sslInit")); > > + synchronized (lock) { > > + init(); > > + if (aprAvailable) { > > + try { > > + initializeSSL(); > > + } catch (Throwable t) { > > + log.info(sm.getString("aprListener.sslInit")); > > + } > > } > > } > > } else if (Lifecycle.AFTER_STOP_EVENT.equals(event.getType())) { > > - if (!aprAvailable) { > > - return; > > - } > > - try { > > - terminateAPR(); > > - } catch (Throwable t) { > > - log.info(sm.getString("aprListener.aprDestroy")); > > + synchronized (lock) { > > + if (!aprAvailable) { > > + return; > > + } > > + try { > > + terminateAPR(); > > + } catch (Throwable t) { > > + log.info(sm.getString("aprListener.aprDestroy")); > > + } > > } > > } > > > > } > > > > - private static synchronized void terminateAPR() > > + private static void terminateAPR() > > throws ClassNotFoundException, NoSuchMethodException, > > IllegalAccessException, InvocationTargetException > > { > > @@ -121,6 +131,8 @@ public class AprLifecycleListener > > Method method = Class.forName("org.apache.tomcat.jni.Library") > > .getMethod(methodName, (Class [])null); > > method.invoke(null, (Object []) null); > > + aprAvailable = false; > > + aprInitialized = false; > > } > > > > private static void init() > > @@ -188,7 +200,7 @@ public class AprLifecycleListener > > aprAvailable = true; > > } > > > > - private static synchronized void initializeSSL() > > + private static void initializeSSL() > > throws ClassNotFoundException, NoSuchMethodException, > > IllegalAccessException, InvocationTargetException > > { > > > > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > > For additional commands, e-mail: dev-h...@tomcat.apache.org > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org > For additional commands, e-mail: dev-h...@tomcat.apache.org > > --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org