Author: markt
Date: Thu Jun 30 12:16:37 2011
New Revision: 1141502

URL: http://svn.apache.org/viewvc?rev=1141502&view=rev
Log:
Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=51445
Correctly initialise all instances of Servlets that implement SingleThreadModel.
Based on a patch by Felix Schumacher.

Modified:
    tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java
    tomcat/trunk/test/org/apache/catalina/core/TestStandardWrapper.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java?rev=1141502&r1=1141501&r2=1141502&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardWrapper.java Thu Jun 30 
12:16:37 2011
@@ -1115,14 +1115,14 @@ public class StandardWrapper extends Con
 
             classLoadTime=(int) (System.currentTimeMillis() -t1);
 
-            initServlet(servlet);
-
-            // Register our newly initialized instance
             singleThreadModel = servlet instanceof SingleThreadModel;
             if (singleThreadModel) {
                 if (instancePool == null)
                     instancePool = new Stack<Servlet>();
             }
+
+            initServlet(servlet);
+
             fireContainerEvent("load", this);
 
             loadTime=System.currentTimeMillis() -t1;
@@ -1186,7 +1186,7 @@ public class StandardWrapper extends Con
     private synchronized void initServlet(Servlet servlet)
             throws ServletException {
         
-        if (instanceInitialized) return;
+        if (instanceInitialized && !singleThreadModel) return;
 
         // Call the initialization method of this servlet
         try {

Modified: tomcat/trunk/test/org/apache/catalina/core/TestStandardWrapper.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/core/TestStandardWrapper.java?rev=1141502&r1=1141501&r2=1141502&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/core/TestStandardWrapper.java 
(original)
+++ tomcat/trunk/test/org/apache/catalina/core/TestStandardWrapper.java Thu Jun 
30 12:16:37 2011
@@ -333,7 +333,7 @@ public class TestStandardWrapper extends
 
     public static final int BUG51445_THREAD_COUNT = 5;
 
-    public void testBug51445() throws Exception {
+    public void testBug51445AddServlet() throws Exception {
         Tomcat tomcat = getTomcatInstance();
 
         // Must have a real docBase - just use temp
@@ -370,6 +370,46 @@ public class TestStandardWrapper extends
 
     }
 
+    public void testBug51445AddChild() throws Exception {
+        Tomcat tomcat = getTomcatInstance();
+
+        // Must have a real docBase - just use temp
+        StandardContext ctx = (StandardContext) 
+            tomcat.addContext("", System.getProperty("java.io.tmpdir"));
+        
+        StandardWrapper wrapper = new StandardWrapper();
+        wrapper.setServletName("Bug51445");
+        wrapper.setServletClass(Bug51445Servlet.class.getName());
+        ctx.addChild(wrapper);
+        ctx.addServletMapping("/", "Bug51445");
+        
+        tomcat.start();
+
+        // Start the threads
+        Bug51445Thread[] threads = new Bug51445Thread[5];
+        for (int i = 0; i < BUG51445_THREAD_COUNT; i ++) {
+            threads[i] = new Bug51445Thread(getPort());
+            threads[i].start();
+        }
+
+        // Wait for threads to finish
+        for (int i = 0; i < BUG51445_THREAD_COUNT; i ++) {
+            threads[i].join();
+        }
+
+        Set<String> servlets = new HashSet<String>();
+        // Check the result
+        for (int i = 0; i < BUG51445_THREAD_COUNT; i ++) {
+            String[] results = threads[i].getResult().split(",");
+            assertEquals(2, results.length);
+            assertEquals("10", results[0]);
+            System.out.println(results[1]);
+            assertFalse(servlets.contains(results[1]));
+            servlets.add(results[1]);
+        }
+
+    }
+
     private static class Bug51445Thread extends Thread {
 
         private int port;

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1141502&r1=1141501&r2=1141502&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Thu Jun 30 12:16:37 2011
@@ -176,6 +176,11 @@
         Improve the handling for Servlets that implement the deprecated
         SingleThreadModel when embedding Tomcat. (markt)
       </fix>
+      <fix>
+        <bug>51445</bug>: Correctly initialise all instances of Servlets that
+        implement SingleThreadModel. Based on a patch by Felix Schumacher.
+        (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to