Repository: activemq-6 Updated Branches: refs/heads/master 28ca327b8 -> e419feb88
HORNETQ-1381 create new threads under AccessControlContext of the creator of ActiveMQThreadFactory Project: http://git-wip-us.apache.org/repos/asf/activemq-6/repo Commit: http://git-wip-us.apache.org/repos/asf/activemq-6/commit/ff9052b8 Tree: http://git-wip-us.apache.org/repos/asf/activemq-6/tree/ff9052b8 Diff: http://git-wip-us.apache.org/repos/asf/activemq-6/diff/ff9052b8 Branch: refs/heads/master Commit: ff9052b83b9ae9e4982d089eb2147f78bce6526d Parents: b61747d Author: Ivo Studensky <istud...@redhat.com> Authored: Fri Dec 5 12:23:48 2014 +0100 Committer: Ivo Studensky <istud...@redhat.com> Committed: Fri Dec 5 12:23:48 2014 +0100 ---------------------------------------------------------------------- .../activemq/utils/ActiveMQThreadFactory.java | 51 +++++++++++++++----- 1 file changed, 38 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/activemq-6/blob/ff9052b8/activemq-commons/src/main/java/org/apache/activemq/utils/ActiveMQThreadFactory.java ---------------------------------------------------------------------- diff --git a/activemq-commons/src/main/java/org/apache/activemq/utils/ActiveMQThreadFactory.java b/activemq-commons/src/main/java/org/apache/activemq/utils/ActiveMQThreadFactory.java index 5c76120..b857825 100644 --- a/activemq-commons/src/main/java/org/apache/activemq/utils/ActiveMQThreadFactory.java +++ b/activemq-commons/src/main/java/org/apache/activemq/utils/ActiveMQThreadFactory.java @@ -16,6 +16,7 @@ */ package org.apache.activemq.utils; +import java.security.AccessControlContext; import java.security.AccessController; import java.security.PrivilegedAction; import java.util.concurrent.ThreadFactory; @@ -40,6 +41,8 @@ public final class ActiveMQThreadFactory implements ThreadFactory private final ClassLoader tccl; + private final AccessControlContext acc; + public ActiveMQThreadFactory(final String groupName, final boolean daemon, final ClassLoader tccl) { group = new ThreadGroup(groupName + "-" + System.identityHashCode(this)); @@ -49,24 +52,46 @@ public final class ActiveMQThreadFactory implements ThreadFactory this.tccl = tccl; this.daemon = daemon; + + this.acc = (System.getSecurityManager() == null) ? null : AccessController.getContext(); } public Thread newThread(final Runnable command) { - // always create a thread in a privileged block. - return AccessController.doPrivileged(new PrivilegedAction<Thread>() + // create a thread in a privileged block if running with Security Manager + if (acc != null && System.getSecurityManager() != null) + { + return AccessController.doPrivileged(new ThreadCreateAction(command), acc); + } + else + { + return createThread(command); + } + } + + private final class ThreadCreateAction implements PrivilegedAction<Thread> + { + private final Runnable target; + + private ThreadCreateAction(final Runnable target) + { + this.target = target; + } + + public Thread run() { - @Override - public Thread run() - { - final Thread t = new Thread(group, command, "Thread-" + threadCount.getAndIncrement() + " (" + group.getName() + ")"); - t.setDaemon(daemon); - t.setPriority(threadPriority); - t.setContextClassLoader(tccl); - - return t; - } - }); + return createThread(target); + } + } + + private Thread createThread(final Runnable command) + { + final Thread t = new Thread(group, command, "Thread-" + threadCount.getAndIncrement() + " (" + group.getName() + ")"); + t.setDaemon(daemon); + t.setPriority(threadPriority); + t.setContextClassLoader(tccl); + + return t; } }