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