You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ce...@apache.org on 2019/03/10 20:16:23 UTC

svn commit: r1855161 - in /xmlbeans/trunk: ./ src/common/org/apache/xmlbeans/impl/common/ src/store/org/apache/xmlbeans/impl/store/ src/typeimpl/org/apache/xmlbeans/impl/schema/ src/typeimpl/org/apache/xmlbeans/impl/values/ src/xmlpublic/org/apache/xml...

Author: centic
Date: Sun Mar 10 20:16:23 2019
New Revision: 1855161

URL: http://svn.apache.org/viewvc?rev=1855161&view=rev
Log:
XMLBEANS-502: Allow to manually clear ThreadLocals via a new ThreadLocalUtil.clearAllThreadLocals()
 
This allows to avoid memory leaks or log warnings in applications that 
make heavy use of thread-pools or web-containers, e.g. Tomcat

Added:
    xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/ThreadLocalUtil.java
    xmlbeans/trunk/test/src/misc/detailed/ThreadLocalUtilTest.java
Modified:
    xmlbeans/trunk/CHANGES.txt
    xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/SystemCache.java
    xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/CharUtil.java
    xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java
    xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderImpl.java
    xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/schema/StscState.java
    xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/values/NamespaceContext.java
    xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlBeans.java
    xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlFactoryHook.java
    xmlbeans/trunk/test/src/misc/checkin/CharUtilTests.java
    xmlbeans/trunk/test/src/misc/detailed/SystemCacheTests.java

Modified: xmlbeans/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/CHANGES.txt?rev=1855161&r1=1855160&r2=1855161&view=diff
==============================================================================
--- xmlbeans/trunk/CHANGES.txt (original)
+++ xmlbeans/trunk/CHANGES.txt Sun Mar 10 20:16:23 2019
@@ -1,5 +1,6 @@
 Changes in V3.0.3 since V3.0.2
 
+* XMLBEANS-502: Allow to clear all ThreadLocals from the current thread
 * XMLBEANS-503: Allow to specify -nowarn in the Ant task
 * XMLBEANS-537: Add missing StscState.end() to avoid memory leaks
 * XMLBEANS-532: Streamline build.xml and update tests to Junit4

Modified: xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/SystemCache.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/SystemCache.java?rev=1855161&r1=1855160&r2=1855161&view=diff
==============================================================================
--- xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/SystemCache.java (original)
+++ xmlbeans/trunk/src/common/org/apache/xmlbeans/impl/common/SystemCache.java Sun Mar 10 20:16:23 2019
@@ -95,6 +95,10 @@ public class SystemCache
 
     private ThreadLocal tl_saxLoaders = new ThreadLocal();
 
+    public void clearThreadLocals() {
+        tl_saxLoaders.remove();
+    }
+
     public Object getSaxLoader()
     {
         SoftReference s = (SoftReference) tl_saxLoaders.get();

Modified: xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/CharUtil.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/CharUtil.java?rev=1855161&r1=1855160&r2=1855161&view=diff
==============================================================================
--- xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/CharUtil.java (original)
+++ xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/CharUtil.java Sun Mar 10 20:16:23 2019
@@ -909,6 +909,10 @@ public final class CharUtil
     private static ThreadLocal tl_charUtil =
         new ThreadLocal() { protected Object initialValue() { return new SoftReference(new CharUtil( CHARUTIL_INITIAL_BUFSIZE )); } };
 
+    public static void clearThreadLocals() {
+        tl_charUtil.remove();
+    }
+
     private CharIterator _charIter = new CharIterator();
 
     // TODO - 64 is kinda arbitrary.  Perhaps it should be configurable.

Modified: xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java?rev=1855161&r1=1855160&r2=1855161&view=diff
==============================================================================
--- xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java (original)
+++ xmlbeans/trunk/src/store/org/apache/xmlbeans/impl/store/Locale.java Sun Mar 10 20:16:23 2019
@@ -1897,6 +1897,10 @@ public final class Locale
             }
         };
 
+    public static void clearThreadLocals() {
+        tl_scrubBuffer.remove();
+    }
+
     static ScrubBuffer getScrubBuffer(int wsr)
     {
         SoftReference softRef = (SoftReference) tl_scrubBuffer.get();

Modified: xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderImpl.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderImpl.java?rev=1855161&r1=1855160&r2=1855161&view=diff
==============================================================================
--- xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderImpl.java (original)
+++ xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/schema/SchemaTypeLoaderImpl.java Sun Mar 10 20:16:23 2019
@@ -71,6 +71,13 @@ public class SchemaTypeLoaderImpl extend
         private ThreadLocal _cachedTypeSystems =
             new ThreadLocal() { protected Object initialValue() { return new ArrayList(); } };
 
+        @Override
+        public void clearThreadLocals() {
+            _cachedTypeSystems.remove();
+
+            super.clearThreadLocals();
+        }
+
         public SchemaTypeLoader getFromTypeLoaderCache(ClassLoader cl)
         {
             ArrayList a = (ArrayList) _cachedTypeSystems.get();

Modified: xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/schema/StscState.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/schema/StscState.java?rev=1855161&r1=1855160&r2=1855161&view=diff
==============================================================================
--- xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/schema/StscState.java (original)
+++ xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/schema/StscState.java Sun Mar 10 20:16:23 2019
@@ -1267,6 +1267,10 @@ public class StscState
 
     private static ThreadLocal tl_stscStack = new ThreadLocal();
 
+    public static void clearThreadLocals() {
+        tl_stscStack.remove();
+    }
+
     public static StscState start()
     {
         StscStack stscStack = (StscStack) tl_stscStack.get();

Modified: xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/values/NamespaceContext.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/values/NamespaceContext.java?rev=1855161&r1=1855160&r2=1855161&view=diff
==============================================================================
--- xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/values/NamespaceContext.java (original)
+++ xmlbeans/trunk/src/typeimpl/org/apache/xmlbeans/impl/values/NamespaceContext.java Sun Mar 10 20:16:23 2019
@@ -90,6 +90,10 @@ public class NamespaceContext implements
 
     private static ThreadLocal tl_namespaceContextStack = new ThreadLocal();
 
+    public static void clearThreadLocals() {
+        tl_namespaceContextStack.remove();
+    }
+
     private static NamespaceContextStack getNamespaceContextStack()
     {
         NamespaceContextStack namespaceContextStack = (NamespaceContextStack) tl_namespaceContextStack.get();

Added: xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/ThreadLocalUtil.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/ThreadLocalUtil.java?rev=1855161&view=auto
==============================================================================
--- xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/ThreadLocalUtil.java (added)
+++ xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/ThreadLocalUtil.java Sun Mar 10 20:16:23 2019
@@ -0,0 +1,46 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package org.apache.xmlbeans;
+
+import org.apache.xmlbeans.impl.common.SystemCache;
+import org.apache.xmlbeans.impl.schema.StscState;
+import org.apache.xmlbeans.impl.store.CharUtil;
+import org.apache.xmlbeans.impl.store.Locale;
+import org.apache.xmlbeans.impl.values.NamespaceContext;
+
+public class ThreadLocalUtil {
+
+    /**
+     * Clear {@link ThreadLocal}s of the current thread.
+     *
+     * This can be used to clean out a thread before "returning"
+     * it to a thread-pool or a Web-Container like Tomcat.
+     */
+    public static void clearAllThreadLocals() {
+        // clear thread locals in all classes which may hold some
+        XmlBeans.clearThreadLocals();
+        XmlFactoryHook.ThreadContext.clearThreadLocals();
+        StscState.clearThreadLocals();
+        CharUtil.clearThreadLocals();
+        Locale.clearThreadLocals();
+        NamespaceContext.clearThreadLocals();
+
+        // SystemCache is not a singleton, but also creates ThreadLocals,
+        // so we get the current instance and clean it out as well
+        SystemCache systemCache = SystemCache.get();
+        systemCache.clearThreadLocals();
+    }
+}

Modified: xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlBeans.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlBeans.java?rev=1855161&r1=1855160&r2=1855161&view=diff
==============================================================================
--- xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlBeans.java (original)
+++ xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlBeans.java Sun Mar 10 20:16:23 2019
@@ -90,6 +90,11 @@ public final class XmlBeans
             }
         };
 
+    public static void clearThreadLocals() {
+        // clear thread local here
+        _threadLocalLoaderQNameCache.remove();
+    }
+
     /**
      * Returns a thread local QNameCache
      */

Modified: xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlFactoryHook.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlFactoryHook.java?rev=1855161&r1=1855160&r2=1855161&view=diff
==============================================================================
--- xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlFactoryHook.java (original)
+++ xmlbeans/trunk/src/xmlpublic/org/apache/xmlbeans/XmlFactoryHook.java Sun Mar 10 20:16:23 2019
@@ -92,6 +92,10 @@ public interface XmlFactoryHook
     {
         private static ThreadLocal threadHook = new ThreadLocal();
 
+        public static void clearThreadLocals() {
+            threadHook.remove();
+        }
+
         /**
          * Returns the current thread's hook, or null if none.
          */ 

Modified: xmlbeans/trunk/test/src/misc/checkin/CharUtilTests.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/test/src/misc/checkin/CharUtilTests.java?rev=1855161&r1=1855160&r2=1855161&view=diff
==============================================================================
--- xmlbeans/trunk/test/src/misc/checkin/CharUtilTests.java (original)
+++ xmlbeans/trunk/test/src/misc/checkin/CharUtilTests.java Sun Mar 10 20:16:23 2019
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.Random;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 
 public class CharUtilTests
 {
@@ -232,4 +233,11 @@ public class CharUtilTests
     }
 
     private Random _rnd = new Random( 0 );
+
+    @Test
+    public void testThreadLocal() {
+        assertNotNull("Should always get a CharUtil from ThreadLocals", CharUtil.getThreadLocalCharUtil());
+        CharUtil.clearThreadLocals();
+        assertNotNull("Should always get a CharUtil from ThreadLocals", CharUtil.getThreadLocalCharUtil());
+    }
 }
\ No newline at end of file

Modified: xmlbeans/trunk/test/src/misc/detailed/SystemCacheTests.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/test/src/misc/detailed/SystemCacheTests.java?rev=1855161&r1=1855160&r2=1855161&view=diff
==============================================================================
--- xmlbeans/trunk/test/src/misc/detailed/SystemCacheTests.java (original)
+++ xmlbeans/trunk/test/src/misc/detailed/SystemCacheTests.java Sun Mar 10 20:16:23 2019
@@ -20,10 +20,11 @@ import org.apache.xmlbeans.impl.common.S
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 
 public class SystemCacheTests {
     @Test
-    public void testSystemCacheImplFromAPITest() throws Throwable {
+    public void testSystemCacheImplFromAPITest() {
         // store the default SystemCache implementation before switch
         SystemCache defaultImpl = SystemCache.get();
 
@@ -33,11 +34,25 @@ public class SystemCacheTests {
         SystemCacheTestImpl testImpl = new SystemCacheTestImpl();
         SystemCache.set(testImpl);
         assertEquals("misc.detailed.SystemCacheTestImpl", testImpl.getClass().getName());
-        assertEquals(testImpl.getAccessed(), 1);
+        assertEquals(SystemCacheTestImpl.getAccessed(), 1);
 
         // switch back to default impl
         SystemCache.set(defaultImpl);
         assertEquals("org.apache.xmlbeans.impl.common.SystemCache", defaultImpl.getClass().getName());
     }
 
+    @Test
+    public void testClearThreadLocal() {
+        SystemCache cache = SystemCache.get();
+        String saxLoader = "object is not cast currently...";
+
+        cache.setSaxLoader(saxLoader);
+        assertEquals(saxLoader, cache.getSaxLoader());
+
+        cache.clearThreadLocals();
+        assertNull(cache.getSaxLoader());
+
+        cache.setSaxLoader(saxLoader);
+        assertEquals(saxLoader, cache.getSaxLoader());
+    }
 }

Added: xmlbeans/trunk/test/src/misc/detailed/ThreadLocalUtilTest.java
URL: http://svn.apache.org/viewvc/xmlbeans/trunk/test/src/misc/detailed/ThreadLocalUtilTest.java?rev=1855161&view=auto
==============================================================================
--- xmlbeans/trunk/test/src/misc/detailed/ThreadLocalUtilTest.java (added)
+++ xmlbeans/trunk/test/src/misc/detailed/ThreadLocalUtilTest.java Sun Mar 10 20:16:23 2019
@@ -0,0 +1,44 @@
+/*   Copyright 2004 The Apache Software Foundation
+ *
+ *   Licensed under the Apache License, Version 2.0 (the "License");
+ *   you may not use this file except in compliance with the License.
+ *   You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *   Unless required by applicable law or agreed to in writing, software
+ *   distributed under the License is distributed on an "AS IS" BASIS,
+ *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *   See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+
+package misc.detailed;
+
+import org.apache.xmlbeans.ThreadLocalUtil;
+import org.apache.xmlbeans.impl.common.SystemCache;
+import org.apache.xmlbeans.impl.schema.StscState;
+import org.apache.xmlbeans.impl.store.CharUtil;
+import org.junit.Test;
+
+public class ThreadLocalUtilTest {
+    @Test
+    public void testClearThreadLocalsNoData() {
+        // simply calling it without any thread locals should work
+        ThreadLocalUtil.clearAllThreadLocals();
+    }
+
+    @Test
+    public void testClearThreadLocalsWithData() {
+        // calling it with thread locals should work as well
+        CharUtil.getThreadLocalCharUtil();
+
+        SystemCache cache = SystemCache.get();
+        String saxLoader = "object is not cast currently...";
+        cache.setSaxLoader(saxLoader);
+        StscState.start();
+        StscState.end();
+
+        ThreadLocalUtil.clearAllThreadLocals();
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org