home *** CD-ROM | disk | FTP | other *** search
Java Source | 1998-03-20 | 21.6 KB | 586 lines |
- /*
- * @(#)Runtime.java 1.41 98/03/18
- *
- * Copyright 1995-1998 by Sun Microsystems, Inc.,
- * 901 San Antonio Road, Palo Alto, California, 94303, U.S.A.
- * All rights reserved.
- *
- * This software is the confidential and proprietary information
- * of Sun Microsystems, Inc. ("Confidential Information"). You
- * shall not disclose such Confidential Information and shall use
- * it only in accordance with the terms of the license agreement
- * you entered into with Sun.
- */
-
- package java.lang;
-
- import java.io.*;
- import java.util.StringTokenizer;
-
- /**
- * Every Java application has a single instance of class
- * <code>Runtime</code> that allows the application to interface with
- * the environment in which the application is running. The current
- * runtime can be obtained from the <code>getRuntime</code> method.
- * <p>
- * An application cannot create its own instance of this class.
- *
- * @author unascribed
- * @version 1.41, 03/18/98
- * @see java.lang.Runtime#getRuntime()
- * @since JDK1.0
- */
-
- public class Runtime {
- private static Runtime currentRuntime = new Runtime();
-
- /**
- * Returns the runtime object associated with the current Java application.
- *
- * @return the <code>Runtime</code> object associated with the current
- * Java application.
- */
- public static Runtime getRuntime() {
- return currentRuntime;
- }
-
- /** Don't let anyone else instantiate this class */
- private Runtime() {}
-
- /* Helper for exit
- */
- private native void exitInternal(int status);
-
- /**
- * Terminates the currently running Java Virtual Machine. This
- * method never returns normally.
- * <p>
- * If there is a security manager, its <code>checkExit</code> method
- * is called with the status as its argument. This may result in a
- * security exception.
- * <p>
- * The argument serves as a status code; by convention, a nonzero
- * status code indicates abnormal termination.
- *
- * @param status exit status.
- * @exception SecurityException if the current thread cannot exit with
- * the specified status.
- * @see java.lang.SecurityException
- * @see java.lang.SecurityManager#checkExit(int)
- */
- public void exit(int status) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkExit(status);
- }
- exitInternal(status);
- }
-
- /* Wormhole for calling java.lang.ref.Finalizer.setRunFinalizersOnExit */
- private static native void runFinalizersOnExit0(boolean value);
-
- /**
- * Enable or disable finalization on exit; doing so specifies that the
- * finalizers of all objects that have finalizers that have not yet been
- * automatically invoked are to be run before the Java runtime exits.
- * By default, finalization on exit is disabled. An invocation of
- * the runFinalizersOnExit method is permitted only if the caller is
- * allowed to exit, and is otherwise rejected by the security manager.
- * @see Runtime#gc
- * @see Runtime#exit
- */
- public static void runFinalizersOnExit(boolean value) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- try {
- security.checkExit(0);
- } catch (SecurityException e) {
- throw new SecurityException("runFinalizersOnExit");
- }
- }
- runFinalizersOnExit0(value);
- }
-
- /* Helper for exec
- */
- private native Process execInternal(String cmdarray[], String envp[])
- throws IOException;
-
- /**
- * Executes the specified string command in a separate process.
- * <p>
- * The <code>command</code> argument is parsed into tokens and then
- * executed as a command in a separate process. This method has
- * exactly the same effect as <code>exec(command, null)</code>.
- *
- * @param command a specified system command.
- * @return a <code>Process</code> object for managing the subprocess.
- * @exception SecurityException if the current thread cannot create a
- * subprocess.
- * @see java.lang.Runtime#exec(java.lang.String, java.lang.String[])
- */
- public Process exec(String command) throws IOException {
- return exec(command, null);
- }
-
- /**
- * Executes the specified string command in a separate process with the
- * specified environment.
- * <p>
- * This method breaks the <code>command</code> string into tokens and
- * creates a new array <code>cmdarray</code> containing the tokens; it
- * then performs the call <code>exec(cmdarray, envp)</code>.
- *
- * @param command a specified system command.
- * @param envp array containing environment in format
- * <i>name</i>=<i>value</i>
- * @return a <code>Process</code> object for managing the subprocess.
- * @exception SecurityException if the current thread cannot create a
- * subprocess.
- * @see java.lang.Runtime#exec(java.lang.String[], java.lang.String[])
- */
- public Process exec(String command, String envp[]) throws IOException {
- int count = 0;
- String cmdarray[];
- StringTokenizer st;
-
- st = new StringTokenizer(command);
- count = st.countTokens();
-
- cmdarray = new String[count];
- st = new StringTokenizer(command);
- count = 0;
- while (st.hasMoreTokens()) {
- cmdarray[count++] = st.nextToken();
- }
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkExec(cmdarray[0]);
- }
- return execInternal(cmdarray, envp);
- }
-
- /**
- * Executes the specified command and arguments in a separate process.
- * <p>
- * The command specified by the tokens in <code>cmdarray</code> is
- * executed as a command in a separate process. This has exactly the
- * same effect as <code>exec(cmdarray, null)</code>.
- *
- * @param cmdarray array containing the command to call and
- * its arguments.
- * @return a <code>Process</code> object for managing the subprocess.
- * @exception SecurityException if the current thread cannot create a
- * subprocess.
- * @see java.lang.Runtime#exec(java.lang.String[], java.lang.String[])
- */
- public Process exec(String cmdarray[]) throws IOException {
- return exec(cmdarray, null);
- }
-
- /**
- * Executes the specified command and arguments in a separate process
- * with the specified environment.
- * <p>
- * If there is a security manager, its <code>checkExec</code> method
- * is called with the first component of the array
- * <code>cmdarray</code> as its argument. This may result in a security
- * exception.
- * <p>
- * Given an array of strings <code>cmdarray</code>, representing the
- * tokens of a command line, and an array of strings <code>envp</code>,
- * representing an "environment" that defines system
- * properties, this method creates a new process in which to execute
- * the specified command.
- *
- * @param cmdarray array containing the command to call and
- * its arguments.
- * @param envp array containing environment in format
- * <i>name</i>=<i>value</i>.
- * @return a <code>Process</code> object for managing the subprocess.
- * @exception SecurityException if the current thread cannot create a
- * subprocess.
- * @see java.lang.SecurityException
- * @see java.lang.SecurityManager#checkExec(java.lang.String)
- */
- public Process exec(String cmdarray[], String envp[]) throws IOException {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkExec(cmdarray[0]);
- }
- return execInternal(cmdarray, envp);
- }
-
- /**
- * Returns the amount of free memory in the system. The value returned
- * by this method is always less than the value returned by the
- * <code>totalMemory</code> method. Calling the <code>gc</code> method may
- * result in increasing the value returned by <code>freeMemory.</code>
- *
- * @return an approximation to the total amount of memory currently
- * available for future allocated objects, measured in bytes.
- */
- public native long freeMemory();
-
- /**
- * Returns the total amount of memory in the Java Virtual Machine.
- *
- * @return the total amount of memory currently available for allocating
- * objects, measured in bytes.
- */
- public native long totalMemory();
-
- /**
- * Runs the garbage collector.
- * Calling this method suggests that the Java Virtual Machine expend
- * effort toward recycling unused objects in order to make the memory
- * they currently occupy available for quick reuse. When control
- * returns from the method call, the Java Virtual Machine has made
- * its best effort to recycle all unused objects.
- * <p>
- * The name <code>gc</code> stands for "garbage
- * collector". The Java Virtual Machine performs this recycling
- * process automatically as needed even if the <code>gc</code> method
- * is not invoked explicitly.
- */
- public native void gc();
-
- /* Wormhole for calling java.lang.ref.Finalizer.runFinalization */
- private static native void runFinalization0();
-
- /**
- * Runs the finalization methods of any objects pending finalization.
- * Calling this method suggests that the Java Virtual Machine expend
- * effort toward running the <code>finalize</code> methods of objects
- * that have been found to be discarded but whose <code>finalize</code>
- * methods have not yet been run. When control returns from the
- * method call, the Java Virtual Machine has made a best effort to
- * complete all outstanding finalizations.
- * <p>
- * The Java Virtual Machine performs the finalization process
- * automatically as needed if the <code>runFinalization</code> method
- * is not invoked explicitly.
- *
- * @see java.lang.Object#finalize()
- */
- public void runFinalization() {
- runFinalization0();
- }
-
- /**
- * Enables/Disables tracing of instructions.
- * If the <code>boolean</code> argument is <code>true</code>, this
- * method asks the Java Virtual Machine to print out a detailed trace
- * of each instruction in the Java Virtual Machine as it is executed.
- * The virtual machine may ignore this request if it does not support
- * this feature. The destination of the trace output is system
- * dependent.
- * <p>
- * If the <code>boolean</code> argument is <code>false</code>, this
- * method causes the Java Virtual Machine to stop performing the
- * detailed instruction trace it is performing.
- *
- * @param on <code>true</code> to enable instruction tracing;
- * <code>false</code> to disable this feature.
- */
- public native void traceInstructions(boolean on);
-
- /**
- * Enables/Disables tracing of method calls.
- * If the <code>boolean</code> argument is <code>true</code>, this
- * method asks the Java Virtual Machine to print out a detailed trace
- * of each method in the Java Virtual Machine as it is called. The
- * virtual machine may ignore this request if it does not support
- * this feature. The destination of the trace output is system dependent.
- * <p>
- * If the <code>boolean</code> argument is <code>false</code>, this
- * method causes the Java Virtual Machine to stop performing the
- * detailed method trace it is performing.
- *
- * @param on <code>true</code> to enable instruction tracing;
- * <code>false</code> to disable this feature.
- */
- public native void traceMethodCalls(boolean on);
-
- /**
- * Initializes the linker and returns the search path for shared libraries.
- */
- private native String buildLibName(String pathname, String filename);
-
- /* Helper for load and loadLibrary */
- private boolean loadFileInternal(Class cls, String filename) {
- File file = new File(filename);
- String canonPath;
- try {
- canonPath = file.getCanonicalPath();
- } catch (IOException e) {
- return false;
- }
- return ClassLoader.loadLibrary(cls.getClassLoader(), canonPath);
- }
-
- /** The paths searched for libraries */
- private String paths[];
-
- private void initializeLinker() {
- String ldpath = System.getProperty("java.library.path", "");
- String ps = File.pathSeparator;
- int ldlen = ldpath.length();
- int i, j, n;
- // Count the separators in the path
- i = ldpath.indexOf(ps);
- n = 0;
- while (i >= 0) {
- n++;
- i = ldpath.indexOf(ps, i+1);
- }
-
- // allocate the array of paths - n :'s = n + 1 path elements
- paths = new String[n + 1];
-
- // Fill the array with paths from the ldpath
- n = i = 0;
- j = ldpath.indexOf(ps);
- while (j >= 0) {
- if (j - i > 0) {
- paths[n++] = ldpath.substring(i, j);
- } else if (j - i == 0) {
- paths[n++] = ".";
- }
- i = j + 1;
- j = ldpath.indexOf(ps, i);
- }
- paths[n] = ldpath.substring(i, ldlen);
- }
-
- /**
- * Loads the specified filename as a dynamic library. The filename
- * argument must be a complete pathname.
- * From <code>java_g</code> it will automagically insert "_g" before the
- * ".so" (for example
- * <code>Runtime.getRuntime().load("/home/avh/lib/libX11.so");</code>).
- * <p>
- * If there is a security manager, its <code>checkLink</code> method
- * is called with the <code>filename</code> as its argument. This may
- * result in a security exception.
- *
- * @param filename the file to load.
- * @exception SecurityException if the current thread cannot load the
- * specified dynamic library.
- * @exception UnsatisfiedLinkError if the file does not exist.
- * @see java.lang.Runtime#getRuntime()
- * @see java.lang.SecurityException
- * @see java.lang.SecurityManager#checkLink(java.lang.String)
- */
- public void load(String filename) {
- load0(System.getCallerClass(), filename);
- }
-
- synchronized void load0(Class cls, String filename) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkLink(filename);
- }
- if (!loadFileInternal(cls, filename)) {
- throw new UnsatisfiedLinkError(filename);
- } /* else load was successful; return */
- }
-
- /**
- * Loads the dynamic library with the specified library name. The
- * mapping from a library name to a specific filename is done in a
- * system-specific manner.
- * <p>
- * First, if there is a security manager, its <code>checkLink</code>
- * method is called with the <code>filename</code> as its argument.
- * This may result in a security exception.
- * <p>
- * If this method is called more than once with the same library
- * name, the second and subsequent calls are ignored.
- *
- * @param libname the name of the library.
- * @exception SecurityException if the current thread cannot load the
- * specified dynamic library.
- * @exception UnsatisfiedLinkError if the library does not exist.
- * @see java.lang.SecurityException
- * @see java.lang.SecurityManager#checkLink(java.lang.String)
- */
- public void loadLibrary(String libname) {
- loadLibrary0(System.getCallerClass(), libname);
- }
-
- synchronized void loadLibrary0(Class cls, String libname) {
- SecurityManager security = System.getSecurityManager();
- if (security != null) {
- security.checkLink(libname);
- }
- if (paths == null) {
- initializeLinker();
- }
- for (int i = 0 ; i < paths.length ; i++) {
- String tempname = buildLibName(paths[i], libname);
- if (loadFileInternal(cls, tempname)) {
- return;
- }
- }
- // Oops, it failed
- throw new UnsatisfiedLinkError("no " + libname +
- " in shared library path");
- }
-
- /**
- * Creates a localized version of an input stream. This method takes
- * an <code>InputStream</code> and returns an <code>InputStream</code>
- * equivalent to the argument in all respects except that it is
- * localized: as characters in the local character set are read from
- * the stream, they are automatically converted from the local
- * character set to Unicode.
- * <p>
- * If the argument is already a localized stream, it may be returned
- * as the result.
- *
- * @deprecated As of JDK 1.1, the preferred way translate a byte
- * stream in the local encoding into a character stream in Unicode is via
- * the <code>InputStreamReader</code> and <code>BufferedReader</code>
- * classes.
- *
- * @return a localized input stream.
- * @see java.io.InputStream
- * @see java.io.BufferedReader#BufferedReader(java.io.Reader)
- * @see java.io.InputStreamReader#InputStreamReader(java.io.InputStream)
- */
- public InputStream getLocalizedInputStream(InputStream in) {
- return in;
- }
-
- /**
- * Creates a localized version of an output stream. This method
- * takes an <code>OutputStream</code> and returns an
- * <code>OutputStream</code> equivalent to the argument in all respects
- * except that it is localized: as Unicode characters are written to
- * the stream, they are automatically converted to the local
- * character set.
- * <p>
- * If the argument is already a localized stream, it may be returned
- * as the result.
- *
- * @deprecated As of JDK 1.1, the preferred way to translate a
- * Unicode character stream into a byte stream in the local encoding is via
- * the <code>OutputStreamWriter</code>, <code>BufferedWriter</code>, and
- * <code>PrintWriter</code> classes.
- *
- * @return a localized output stream.
- * @see java.io.OutputStream
- * @see java.io.BufferedWriter#BufferedWriter(java.io.Writer)
- * @see java.io.OutputStreamWriter#OutputStreamWriter(java.io.OutputStream)
- * @see java.io.PrintWriter#PrintWriter(java.io.OutputStream)
- */
- public OutputStream getLocalizedOutputStream(OutputStream out) {
- return out;
- }
-
-
- /**
- * The <code>MemoryAdvice</code> interface defines the values returned by
- * the <code>getMemoryAdvice</code> and <code>waitForMemoryAdvice</code>
- * methods of the <code>Runtime</code> class. These methods allow a
- * program to query the runtime system for advice about how it should
- * manage its memory usage. There are four increasingly-dire levels of
- * advice.
- *
- * @see Runtime#waitForMemoryAdvice
- * @see Runtime#getMemoryAdvice
- * @since JDK1.2
- */
- static public interface MemoryAdvice {
-
- /**
- * A memory-advice level of <code>GREEN</code> tells the program that
- * no special actions are suggested.
- */
- public static final int GREEN = 0;
-
- /**
- * A memory-advice level of <code>YELLOW</code> tells the program that
- * it would be beneficial, but not essential, to discard some objects
- * in the near future. On a system with virtual memory, this level
- * typically implies that the virtual machine will soon request
- * additional memory resources. If the maximum size of the heap is set
- * when the virtual machine starts, this level typically implies that a
- * preset low-memory threshold has been reached. Note that these two
- * conditions are not mutually exclusive.
- */
- public static final int YELLOW = 1;
-
- /**
- * A memory-advice level of <code>ORANGE</code> tells the program that
- * it should try to discard objects as soon as possible in order to
- * maintain good performance. On a system with virtual memory, this
- * level typically implies that paging is imminent. If the maximum
- * size of the heap is set when the virtual machine starts, this level
- * typically implies that a preset very-low-memory threshold has been
- * reached. Note that these two conditions are not mutually exclusive.
- */
- public static final int ORANGE = 2;
-
- /**
- * A memory-advice level of <code>RED</code> tells the program that it
- * should take every conceivable action to discard objects. This level
- * typically means that very little memory is left. Any cleanup
- * actions should, therefore, allocate as few objects as possible.
- */
- public static final int RED = 3;
-
- }
-
-
- private int memoryAdvice = MemoryAdvice.GREEN; /* Updated by GC */
- private Object memoryAdviceLock = new Object();
-
- /**
- * Wait until the memory-advice level is different from <code>level</code>.
- * If the current level is different from <code>level</code>, return that
- * level immediately. Otherwise block until the level changes.
- *
- * <p> This method is intended primarily for use in the implementation of
- * caches that flush cache entries according to the amount of memory
- * available.
- *
- * @param level One of <code>GREEN</code>, <code>YELLOW</code>,
- * <code>ORANGE</code>, or <code>RED</code>; these
- * constants are defined in the
- * <code>Runtime.MemoryAdvice</code> interface
- *
- * @return The new memory-advice level
- *
- * @exception InterruptedException If the wait is interrupted
- *
- * @see Runtime#MemoryAdvice
- * @since JDK1.2
- */
- public int waitForMemoryAdvice(int level) throws InterruptedException {
- synchronized (memoryAdviceLock) {
- int current;
- for (;;) {
- current = memoryAdvice;
- if (current != level) break;
- memoryAdviceLock.wait();
- }
- return current;
- }
- }
-
- /**
- * Return the runtime system's current memory-advice level.
- *
- * @see Runtime#MemoryAdvice
- * @since JDK1.2
- */
- public int getMemoryAdvice() {
- synchronized (memoryAdviceLock) {
- return memoryAdvice;
- }
- }
-
- }
-