0N/A/*
2362N/A * Copyright (c) 2000, 2005, Oracle and/or its affiliates. All rights reserved.
0N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
0N/A *
0N/A * This code is free software; you can redistribute it and/or modify it
0N/A * under the terms of the GNU General Public License version 2 only, as
2362N/A * published by the Free Software Foundation. Oracle designates this
0N/A * particular file as subject to the "Classpath" exception as provided
2362N/A * by Oracle in the LICENSE file that accompanied this code.
0N/A *
0N/A * This code is distributed in the hope that it will be useful, but WITHOUT
0N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
0N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
0N/A * version 2 for more details (a copy is included in the LICENSE file that
0N/A * accompanied this code).
0N/A *
0N/A * You should have received a copy of the GNU General Public License version
0N/A * 2 along with this work; if not, write to the Free Software Foundation,
0N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
0N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
0N/A */
0N/A
0N/Apackage sun.rmi.runtime;
0N/A
0N/Aimport java.security.AccessController;
0N/Aimport java.security.PrivilegedAction;
0N/Aimport sun.security.util.SecurityConstants;
0N/A
0N/A/**
0N/A * A PrivilegedAction for creating a new thread conveniently with an
0N/A * AccessController.doPrivileged construct.
0N/A *
0N/A * All constructors allow the choice of the Runnable for the new
0N/A * thread to execute, the name of the new thread (which will be
0N/A * prefixed with "RMI "), and whether or not it will be a daemon
0N/A * thread.
0N/A *
0N/A * The new thread may be created in the system thread group (the root
0N/A * of the thread group tree) or an internally created non-system
0N/A * thread group, as specified at construction of this class.
0N/A *
0N/A * The new thread will have the system class loader as its initial
0N/A * context class loader (that is, its context class loader will NOT be
0N/A * inherited from the current thread).
0N/A *
0N/A * @author Peter Jones
0N/A **/
0N/Apublic final class NewThreadAction implements PrivilegedAction<Thread> {
0N/A
0N/A /** cached reference to the system (root) thread group */
0N/A static final ThreadGroup systemThreadGroup =
0N/A AccessController.doPrivileged(new PrivilegedAction<ThreadGroup>() {
0N/A public ThreadGroup run() {
0N/A ThreadGroup group = Thread.currentThread().getThreadGroup();
0N/A ThreadGroup parent;
0N/A while ((parent = group.getParent()) != null) {
0N/A group = parent;
0N/A }
0N/A return group;
0N/A }
0N/A });
0N/A
0N/A /**
0N/A * special child of the system thread group for running tasks that
0N/A * may execute user code, so that the security policy for threads in
0N/A * the system thread group will not apply
0N/A */
0N/A static final ThreadGroup userThreadGroup =
0N/A AccessController.doPrivileged(new PrivilegedAction<ThreadGroup>() {
0N/A public ThreadGroup run() {
0N/A return new ThreadGroup(systemThreadGroup, "RMI Runtime");
0N/A }
0N/A });
0N/A
0N/A private final ThreadGroup group;
0N/A private final Runnable runnable;
0N/A private final String name;
0N/A private final boolean daemon;
0N/A
0N/A NewThreadAction(ThreadGroup group, Runnable runnable,
0N/A String name, boolean daemon)
0N/A {
0N/A this.group = group;
0N/A this.runnable = runnable;
0N/A this.name = name;
0N/A this.daemon = daemon;
0N/A }
0N/A
0N/A /**
0N/A * Creates an action that will create a new thread in the
0N/A * system thread group.
0N/A *
0N/A * @param runnable the Runnable for the new thread to execute
0N/A *
0N/A * @param name the name of the new thread
0N/A *
0N/A * @param daemon if true, new thread will be a daemon thread;
0N/A * if false, new thread will not be a daemon thread
0N/A */
0N/A public NewThreadAction(Runnable runnable, String name, boolean daemon) {
0N/A this(systemThreadGroup, runnable, name, daemon);
0N/A }
0N/A
0N/A /**
0N/A * Creates an action that will create a new thread.
0N/A *
0N/A * @param runnable the Runnable for the new thread to execute
0N/A *
0N/A * @param name the name of the new thread
0N/A *
0N/A * @param daemon if true, new thread will be a daemon thread;
0N/A * if false, new thread will not be a daemon thread
0N/A *
0N/A * @param user if true, thread will be created in a non-system
0N/A * thread group; if false, thread will be created in the system
0N/A * thread group
0N/A */
0N/A public NewThreadAction(Runnable runnable, String name, boolean daemon,
0N/A boolean user)
0N/A {
0N/A this(user ? userThreadGroup : systemThreadGroup,
0N/A runnable, name, daemon);
0N/A }
0N/A
0N/A public Thread run() {
0N/A SecurityManager sm = System.getSecurityManager();
0N/A if (sm != null) {
0N/A sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION);
0N/A }
0N/A Thread t = new Thread(group, runnable, "RMI " + name);
0N/A t.setContextClassLoader(ClassLoader.getSystemClassLoader());
0N/A t.setDaemon(daemon);
0N/A return t;
0N/A }
0N/A}