0N/A/*
2362N/A * Copyright (c) 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.Permission;
0N/Aimport java.security.PrivilegedAction;
0N/Aimport java.util.concurrent.ScheduledThreadPoolExecutor;
0N/Aimport java.util.concurrent.ThreadFactory;
0N/Aimport java.util.concurrent.TimeUnit;
0N/Aimport java.util.concurrent.atomic.AtomicInteger;
0N/Aimport java.util.logging.Level;
0N/Aimport sun.security.action.GetIntegerAction;
0N/A
0N/A/**
0N/A * RMI runtime implementation utilities.
0N/A *
0N/A * There is a single instance of this class, which can be obtained
0N/A * with a GetInstanceAction. Getting the instance requires
0N/A * RuntimePermission("sun.rmi.runtime.RuntimeUtil.getInstance")
0N/A * because the public methods of this class expose security-sensitive
0N/A * capabilities.
0N/A *
0N/A * @author Peter Jones
0N/A **/
0N/Apublic final class RuntimeUtil {
0N/A
0N/A /** runtime package log */
0N/A private static final Log runtimeLog =
0N/A Log.getLog("sun.rmi.runtime", null, false);
0N/A
0N/A /** number of scheduler threads */
0N/A private static final int schedulerThreads = // default 1
0N/A AccessController.doPrivileged(
0N/A new GetIntegerAction("sun.rmi.runtime.schedulerThreads", 1));
0N/A
0N/A /** permission required to get instance */
0N/A private static final Permission GET_INSTANCE_PERMISSION =
0N/A new RuntimePermission("sun.rmi.runtime.RuntimeUtil.getInstance");
0N/A
0N/A /** the singleton instance of this class */
0N/A private static final RuntimeUtil instance = new RuntimeUtil();
0N/A
0N/A /** thread pool for scheduling delayed tasks */
0N/A private final ScheduledThreadPoolExecutor scheduler;
0N/A
0N/A private RuntimeUtil() {
0N/A scheduler = new ScheduledThreadPoolExecutor(
0N/A schedulerThreads,
0N/A new ThreadFactory() {
0N/A private final AtomicInteger count = new AtomicInteger(0);
0N/A public Thread newThread(Runnable runnable) {
0N/A try {
0N/A return AccessController.doPrivileged(
0N/A new NewThreadAction(runnable,
0N/A "Scheduler(" + count.getAndIncrement() + ")",
0N/A true));
0N/A } catch (Throwable t) {
0N/A runtimeLog.log(Level.WARNING,
0N/A "scheduler thread factory throws", t);
0N/A return null;
0N/A }
0N/A }
0N/A });
0N/A /*
0N/A * We would like to allow the scheduler's threads to terminate
0N/A * if possible, but a bug in DelayQueue.poll can cause code
0N/A * like this to result in a busy loop:
0N/A */
0N/A // stpe.setKeepAliveTime(10, TimeUnit.MINUTES);
0N/A // stpe.allowCoreThreadTimeOut(true);
0N/A }
0N/A
0N/A /**
0N/A * A PrivilegedAction for getting the RuntimeUtil instance.
0N/A **/
0N/A public static class GetInstanceAction
0N/A implements PrivilegedAction<RuntimeUtil>
0N/A {
0N/A /**
0N/A * Creates an action that returns the RuntimeUtil instance.
0N/A **/
0N/A public GetInstanceAction() {
0N/A }
0N/A
0N/A public RuntimeUtil run() {
0N/A return getInstance();
0N/A }
0N/A }
0N/A
0N/A private static RuntimeUtil getInstance() {
0N/A SecurityManager sm = System.getSecurityManager();
0N/A if (sm != null) {
0N/A sm.checkPermission(GET_INSTANCE_PERMISSION);
0N/A }
0N/A return instance;
0N/A }
0N/A
0N/A /**
0N/A * Returns the shared thread pool for scheduling delayed tasks.
0N/A *
0N/A * Note that the returned pool has limited concurrency, so
0N/A * submitted tasks should be short-lived and should not block.
0N/A **/
0N/A public ScheduledThreadPoolExecutor getScheduler() {
0N/A return scheduler;
0N/A }
0N/A}