[jboss-cvs] JBossAS SVN: r91588 - projects/jboss-threads/trunk/main/src/main/java/org/jboss/threads.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Wed Jul 22 23:48:51 EDT 2009


Author: david.lloyd at jboss.com
Date: 2009-07-22 23:48:51 -0400 (Wed, 22 Jul 2009)
New Revision: 91588

Added:
   projects/jboss-threads/trunk/main/src/main/java/org/jboss/threads/ResettingDirectExecutor.java
Log:
Add direct executor which nukes threadlocals after the task is complete

Added: projects/jboss-threads/trunk/main/src/main/java/org/jboss/threads/ResettingDirectExecutor.java
===================================================================
--- projects/jboss-threads/trunk/main/src/main/java/org/jboss/threads/ResettingDirectExecutor.java	                        (rev 0)
+++ projects/jboss-threads/trunk/main/src/main/java/org/jboss/threads/ResettingDirectExecutor.java	2009-07-23 03:48:51 UTC (rev 91588)
@@ -0,0 +1,75 @@
+package org.jboss.threads;
+
+import java.lang.reflect.Field;
+import java.security.AccessController;
+import java.security.PrivilegedAction;
+
+/**
+ * A direct executor which resets the thread-local maps after every task (if possible).
+ */
+public class ResettingDirectExecutor implements DirectExecutor {
+    private final DirectExecutor delegate;
+
+    private static final Field THREAD_LOCAL_MAP_FIELD;
+    private static final Field INHERITABLE_THREAD_LOCAL_MAP_FIELD;
+    private static final RuntimePermission MODIFY_THREAD_PERMISSION = new RuntimePermission("modifyThread");
+
+    static {
+        THREAD_LOCAL_MAP_FIELD = AccessController.doPrivileged(new PrivilegedAction<Field>() {
+            public Field run() {
+                final Field field;
+                try {
+                    field = Thread.class.getDeclaredField("threadLocals");
+                    field.setAccessible(true);
+                } catch (NoSuchFieldException e) {
+                    return null;
+                }
+                return field;
+            }
+        });
+        INHERITABLE_THREAD_LOCAL_MAP_FIELD = AccessController.doPrivileged(new PrivilegedAction<Field>() {
+            public Field run() {
+                final Field field;
+                try {
+                    field = Thread.class.getDeclaredField("threadLocals");
+                    field.setAccessible(true);
+                } catch (NoSuchFieldException e) {
+                    return null;
+                }
+                return field;
+            }
+        });
+    }
+
+    /**
+     * Construct a new instance.
+     *
+     * @param delegate the executor which will actually execute the task
+     */
+    public ResettingDirectExecutor(DirectExecutor delegate) {
+        final SecurityManager sm = System.getSecurityManager();
+        if (sm != null) {
+            sm.checkPermission(MODIFY_THREAD_PERMISSION);
+        }
+        this.delegate = delegate;
+    }
+
+    private static void clear(final Thread currentThread, final Field field) {
+        try {
+            field.set(currentThread, null);
+        } catch (IllegalAccessException e) {
+            // ignore
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void execute(Runnable command) {
+        try {
+            delegate.execute(command);
+        } finally {
+            final Thread thread = Thread.currentThread();
+            clear(thread, THREAD_LOCAL_MAP_FIELD);
+            clear(thread, INHERITABLE_THREAD_LOCAL_MAP_FIELD);
+        }
+    }
+}




More information about the jboss-cvs-commits mailing list