Re: svn commit: r1044145 - in /tomcat/trunk: java/org/apache/catalina/core/ java/org/apache/tomcat/util/threads/ test/org/apache/tomcat/util/threads/

2010-12-12 Thread Mark Thomas
On 12/12/2010 00:14, Sylvain Laurent wrote:
> Good catch!

Not really - I was running the unit tests for a completely different
issue when I stumbled across if :)

It does show the value of the unit tests though.

> Actually I think my commit revealed a current bug in tc 6 & 7 : 
> https://issues.apache.org/bugzilla/show_bug.cgi?id=50459
> 
> I fixed it with http://svn.apache.org/viewvc?rev=1044746&view=rev . Now all 
> tests pass (checked with "ant clean test").

Thanks for such a quick fix.

Mark

> 
> Sylvain
> 
> On 11 déc. 2010, at 21:34, Mark Thomas wrote:
> 
>> On 09/12/2010 22:11, slaur...@apache.org wrote:
>>> Author: slaurent
>>> Date: Thu Dec  9 22:11:27 2010
>>> New Revision: 1044145
>>>
>>> URL: http://svn.apache.org/viewvc?rev=1044145&view=rev
>>> Log:
>>> bug 49159: Improve ThreadLocal memory leak clean-up 
>>> https://issues.apache.org/bugzilla/show_bug.cgi?id=49159
>>
>> -1. This breaks at least one unit test.
>>
>> Mark
>>
>> -
>> 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



Re: svn commit: r1044145 - in /tomcat/trunk: java/org/apache/catalina/core/ java/org/apache/tomcat/util/threads/ test/org/apache/tomcat/util/threads/

2010-12-11 Thread Sylvain Laurent
Good catch!

Actually I think my commit revealed a current bug in tc 6 & 7 : 
https://issues.apache.org/bugzilla/show_bug.cgi?id=50459

I fixed it with http://svn.apache.org/viewvc?rev=1044746&view=rev . Now all 
tests pass (checked with "ant clean test").

Sylvain

On 11 déc. 2010, at 21:34, Mark Thomas wrote:

> On 09/12/2010 22:11, slaur...@apache.org wrote:
>> Author: slaurent
>> Date: Thu Dec  9 22:11:27 2010
>> New Revision: 1044145
>> 
>> URL: http://svn.apache.org/viewvc?rev=1044145&view=rev
>> Log:
>> bug 49159: Improve ThreadLocal memory leak clean-up 
>> https://issues.apache.org/bugzilla/show_bug.cgi?id=49159
> 
> -1. This breaks at least one unit test.
> 
> Mark
> 
> -
> 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



Re: svn commit: r1044145 - in /tomcat/trunk: java/org/apache/catalina/core/ java/org/apache/tomcat/util/threads/ test/org/apache/tomcat/util/threads/

2010-12-11 Thread Mark Thomas
On 09/12/2010 22:11, slaur...@apache.org wrote:
> Author: slaurent
> Date: Thu Dec  9 22:11:27 2010
> New Revision: 1044145
> 
> URL: http://svn.apache.org/viewvc?rev=1044145&view=rev
> Log:
> bug 49159: Improve ThreadLocal memory leak clean-up 
> https://issues.apache.org/bugzilla/show_bug.cgi?id=49159

-1. This breaks at least one unit test.

Mark

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



svn commit: r1044145 - in /tomcat/trunk: java/org/apache/catalina/core/ java/org/apache/tomcat/util/threads/ test/org/apache/tomcat/util/threads/

2010-12-09 Thread slaurent
Author: slaurent
Date: Thu Dec  9 22:11:27 2010
New Revision: 1044145

URL: http://svn.apache.org/viewvc?rev=1044145&view=rev
Log:
bug 49159: Improve ThreadLocal memory leak clean-up 
https://issues.apache.org/bugzilla/show_bug.cgi?id=49159

Use a dedicated thread when calling web application code when it is started and 
stopped (calls to Listeners, Filters, Servlets).

Added:

tomcat/trunk/java/org/apache/tomcat/util/threads/DedicatedThreadExecutor.java   
(with props)
tomcat/trunk/test/org/apache/tomcat/util/threads/

tomcat/trunk/test/org/apache/tomcat/util/threads/DedicatedThreadExecutorTest.java
   (with props)
Modified:
tomcat/trunk/java/org/apache/catalina/core/StandardContext.java

Modified: tomcat/trunk/java/org/apache/catalina/core/StandardContext.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/core/StandardContext.java?rev=1044145&r1=1044144&r2=1044145&view=diff
==
--- tomcat/trunk/java/org/apache/catalina/core/StandardContext.java (original)
+++ tomcat/trunk/java/org/apache/catalina/core/StandardContext.java Thu Dec  9 
22:11:27 2010
@@ -37,6 +37,7 @@ import java.util.Map;
 import java.util.Set;
 import java.util.Stack;
 import java.util.TreeMap;
+import java.util.concurrent.Callable;
 
 import javax.management.ListenerNotFoundException;
 import javax.management.MBeanNotificationInfo;
@@ -117,6 +118,7 @@ import org.apache.tomcat.JarScanner;
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.modeler.Registry;
 import org.apache.tomcat.util.scan.StandardJarScanner;
+import org.apache.tomcat.util.threads.DedicatedThreadExecutor;
 
 /**
  * Standard implementation of the Context interface.  Each
@@ -4966,6 +4968,7 @@ public class StandardContext extends Con
 }
 }
 
+DedicatedThreadExecutor temporaryExecutor = new 
DedicatedThreadExecutor();
 try {
 
 // Create context attributes that will be required
@@ -4992,7 +4995,21 @@ public class StandardContext extends Con
 
 // Configure and call application event listeners
 if (ok) {
-if (!listenerStart()) {
+// we do it in a dedicated thread for memory leak protection, 
in
+// case the Listeners registers some ThreadLocals that they
+// forget to cleanup
+Boolean listenerStarted =
+temporaryExecutor.execute(new Callable() {
+public Boolean call() throws Exception {
+ClassLoader old = bindThread();
+try {
+return listenerStart();
+} finally {
+unbindThread(old);
+}
+}
+});
+if (!listenerStarted) {
 log.error( "Error listenerStart");
 ok = false;
 }
@@ -5013,20 +5030,48 @@ public class StandardContext extends Con
 
 // Configure and call application filters
 if (ok) {
-if (!filterStart()) {
-log.error( "Error filterStart");
+// we do it in a dedicated thread for memory leak protection, 
in
+// case the Filters register some ThreadLocals that they forget
+// to cleanup
+Boolean filterStarted =
+temporaryExecutor.execute(new Callable() {
+public Boolean call() throws Exception {
+ClassLoader old = bindThread();
+try {
+return filterStart();
+} finally {
+unbindThread(old);
+}
+}
+});
+if (!filterStarted) {
+log.error("Error filterStart");
 ok = false;
 }
 }
 
 // Load and initialize all "load on startup" servlets
 if (ok) {
-loadOnStartup(findChildren());
+// we do it in a dedicated thread for memory leak protection, 
in
+// case the Servlets register some ThreadLocals that they 
forget
+// to cleanup
+temporaryExecutor.execute(new Callable() {
+public Void call() throws Exception {
+ClassLoader old = bindThread();
+try {
+loadOnStartup(findChildren());
+return null;
+} finally {
+unbindThread(old);
+}
+}
+});