You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by tr...@apache.org on 2005/09/22 23:58:05 UTC
svn commit: r291024 - in /jakarta/commons/sandbox/exec/trunk: ./
src/main/java/org/apache/commons/exec/
src/main/java/org/apache/commons/exec/environment/
Author: trygvis
Date: Thu Sep 22 14:57:56 2005
New Revision: 291024
URL: http://svn.apache.org/viewcvs?rev=291024&view=rev
Log:
Fixing 36287: "Generalize ProcessDestroyer"
Patch by Niklas Gustavsson.
o Making the ProcessDestroyer an interface and and moving all the code to
ShutdownHookProcessDestroyer.
o Adding myself as a developer.
Added:
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java (with props)
Modified:
jakarta/commons/sandbox/exec/trunk/pom.xml
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java
jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java
Modified: jakarta/commons/sandbox/exec/trunk/pom.xml
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/pom.xml?rev=291024&r1=291023&r2=291024&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/pom.xml (original)
+++ jakarta/commons/sandbox/exec/trunk/pom.xml Thu Sep 22 14:57:56 2005
@@ -12,10 +12,10 @@
<version>1.0.4</version>
</dependency>
<dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>3.8.1</version>
- <scope>test</scope>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ <scope>test</scope>
</dependency>
</dependencies>
<developers>
@@ -26,6 +26,13 @@
<organization>Apache</organization>
<timezone>+10</timezone>
</developer>
+ <developer>
+ <id>trygvis</id>
+ <name>Trygve Laugstø</name>
+ <email>trygvis AT apache DOT org</email>
+ <organization>Apache</organization>
+ <timezone>+1</timezone>
+ </developer>
</developers>
<contributors>
<contributor>
@@ -100,4 +107,3 @@
<url>http://issues.apache.org/bugzilla/</url>
</issueManagement>
</project>
-
Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java?rev=291024&r1=291023&r2=291024&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/Execute.java Thu Sep 22 14:57:56 2005
@@ -58,7 +58,7 @@
.createVMLauncher();
/** Used to destroy processes when the VM exits. */
- private static ProcessDestroyer processDestroyer = new ProcessDestroyer();
+ private static ProcessDestroyer processDestroyer = new ShutdownHookProcessDestroyer();
/**
* ByteArrayOutputStream#toString doesn't seem to work reliably on OS/390,
@@ -216,14 +216,11 @@
* the environment for the command
* @param dir
* the working directory for the command
- * @param useVM
- * use the built-in exec command for JDK 1.3 if available.
* @return the process started
* @throws IOException
* forwarded from the particular launcher used
*/
- public static Process launch(final CommandLine command,
- final Environment env, final File dir)
+ public static Process launch(final CommandLine command, final Environment env, final File dir)
throws IOException {
CommandLauncher launcher = vmLauncher;
@@ -311,7 +308,7 @@
}
OutputStream dummyOut = new OutputStream() {
- public void write(final int b) throws IOException {
+ public void write(final int b) {
}
};
Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java?rev=291024&r1=291023&r2=291024&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ProcessDestroyer.java Thu Sep 22 14:57:56 2005
@@ -17,160 +17,36 @@
package org.apache.commons.exec;
-import java.util.Enumeration;
-import java.util.Vector;
-
/**
- * Destroys all registered <code>Process</code>es when the VM exits.
+ * Destroys all registered @link java.lang.Process after a certain event,
+ * typically when the VM exits
+ * (@see org.apache.commons.exec.ShutdownHookProcessDestroyer).
*/
-class ProcessDestroyer implements Runnable {
-
- private Vector processes = new Vector();
-
- private ProcessDestroyerImpl destroyProcessThread = null;
-
- // whether or not this ProcessDestroyer has been registered as a
- // shutdown hook
- private boolean added = false;
-
- // whether or not this ProcessDestroyer is currently running as
- // shutdown hook
- private boolean running = false;
-
- private class ProcessDestroyerImpl extends Thread {
- private boolean shouldDestroy = true;
-
- public ProcessDestroyerImpl() {
- super("ProcessDestroyer Shutdown Hook");
- }
-
- public void run() {
- if (shouldDestroy) {
- ProcessDestroyer.this.run();
- }
- }
-
- public void setShouldDestroy(final boolean shouldDestroy) {
- this.shouldDestroy = shouldDestroy;
- }
- }
-
- /**
- * Constructs a <code>ProcessDestroyer</code> and obtains
- * <code>Runtime.addShutdownHook()</code> and
- * <code>Runtime.removeShutdownHook()</code> through reflection. The
- * ProcessDestroyer manages a list of processes to be destroyed when the VM
- * exits. If a process is added when the list is empty, this
- * <code>ProcessDestroyer</code> is registered as a shutdown hook. If
- * removing a process results in an empty list, the
- * <code>ProcessDestroyer</code> is removed as a shutdown hook.
- */
- public ProcessDestroyer() {
- }
-
- /**
- * Registers this <code>ProcessDestroyer</code> as a shutdown hook, uses
- * reflection to ensure pre-JDK 1.3 compatibility.
- */
- private void addShutdownHook() {
- if (!running) {
- destroyProcessThread = new ProcessDestroyerImpl();
- Runtime.getRuntime().addShutdownHook(destroyProcessThread);
- added = true;
- }
- }
+public interface ProcessDestroyer {
/**
- * Removes this <code>ProcessDestroyer</code> as a shutdown hook, uses
- * reflection to ensure pre-JDK 1.3 compatibility
- */
- private void removeShutdownHook() {
- if (added && !running) {
- boolean removed = Runtime.getRuntime().removeShutdownHook(
- destroyProcessThread);
- if (!removed) {
- // System.err.println("Could not remove shutdown hook");
- // TODO should we just ignore?
- }
- /*
- * start the hook thread, a unstarted thread may not be eligible for
- * garbage collection Cf.: http://developer.java.sun.com/developer/
- * bugParade/bugs/4533087.html
- */
-
- destroyProcessThread.setShouldDestroy(false);
- destroyProcessThread.start();
- // this should return quickly, since it basically is a NO-OP.
- try {
- destroyProcessThread.join(20000);
- } catch (InterruptedException ie) {
- // the thread didn't die in time
- // it should not kill any processes unexpectedly
- }
- destroyProcessThread = null;
- added = false;
- }
- }
-
- /**
- * Returns whether or not the ProcessDestroyer is registered as as shutdown
- * hook
- *
- * @return true if this is currently added as shutdown hook
- */
- public boolean isAddedAsShutdownHook() {
- return added;
- }
-
- /**
- * Returns <code>true</code> if the specified <code>Process</code> was
- * successfully added to the list of processes to destroy upon VM exit.
+ * Returns <code>true</code> if the specified
+ * @link java.lang.Process was
+ * successfully added to the list of processes to be destroy.
*
* @param process
- * the process to add
- * @return <code>true</code> if the specified <code>Process</code> was
- * successfully added
- */
- public boolean add(final Process process) {
- synchronized (processes) {
- // if this list is empty, register the shutdown hook
- if (processes.size() == 0) {
- addShutdownHook();
- }
- processes.addElement(process);
- return processes.contains(process);
- }
- }
-
- /**
- * Returns <code>true</code> if the specified <code>Process</code> was
- * successfully removed from the list of processes to destroy upon VM exit.
+ * the process to add
+ * @return <code>true</code> if the specified
+ * @link java.lang.Process was
+ * successfully added
+ */
+ boolean add(Process process);
+
+ /**
+ * Returns <code>true</code> if the specified
+ * @link java.lang.Process was
+ * successfully removed from the list of processes to be destroy.
*
* @param process
* the process to remove
- * @return <code>true</code> if the specified <code>Process</code> was
- * successfully removed
- */
- public boolean remove(final Process process) {
- synchronized (processes) {
- boolean processRemoved = processes.removeElement(process);
- if (processRemoved && processes.size() == 0) {
- removeShutdownHook();
- }
- return processRemoved;
- }
- }
-
- /**
- * Invoked by the VM when it is exiting.
+ * @return <code>true</code> if the specified
+ * @link java.lang.Process was
+ * successfully removed
*/
- public void run() {
- synchronized (processes) {
- running = true;
- Enumeration e = processes.elements();
- while (e.hasMoreElements()) {
- ((Process) e.nextElement()).destroy();
- }
- }
- }
+ boolean remove(Process process);
}
Added: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java?rev=291024&view=auto
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java (added)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java Thu Sep 22 14:57:56 2005
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2005 The Apache Software Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+package org.apache.commons.exec;
+
+import java.util.Enumeration;
+import java.util.Vector;
+
+/**
+ * Destroys all registered <code>Process</code>es when the VM exits.
+ */
+public class ShutdownHookProcessDestroyer implements ProcessDestroyer, Runnable {
+
+ private final Vector processes = new Vector();
+
+ private ProcessDestroyerImpl destroyProcessThread = null;
+
+ /**
+ * Whether or not this ProcessDestroyer has been registered as a shutdown hook
+ */
+ private boolean added = false;
+
+ /**
+ * Whether or not this ProcessDestroyer is currently running as shutdown hook
+ */
+ private boolean running = false;
+
+ private class ProcessDestroyerImpl extends Thread {
+ private boolean shouldDestroy = true;
+
+ public ProcessDestroyerImpl() {
+ super("ProcessDestroyer Shutdown Hook");
+ }
+
+ public void run() {
+ if (shouldDestroy) {
+ ShutdownHookProcessDestroyer.this.run();
+ }
+ }
+
+ public void setShouldDestroy(final boolean shouldDestroy) {
+ this.shouldDestroy = shouldDestroy;
+ }
+ }
+
+ /**
+ * Constructs a <code>ProcessDestroyer</code> and obtains
+ * <code>Runtime.addShutdownHook()</code> and
+ * <code>Runtime.removeShutdownHook()</code> through reflection. The
+ * ProcessDestroyer manages a list of processes to be destroyed when the VM
+ * exits. If a process is added when the list is empty, this
+ * <code>ProcessDestroyer</code> is registered as a shutdown hook. If
+ * removing a process results in an empty list, the
+ * <code>ProcessDestroyer</code> is removed as a shutdown hook.
+ */
+ public ShutdownHookProcessDestroyer() {
+ }
+
+ /**
+ * Registers this <code>ProcessDestroyer</code> as a shutdown hook, uses
+ * reflection to ensure pre-JDK 1.3 compatibility.
+ */
+ private void addShutdownHook() {
+ if (!running) {
+ destroyProcessThread = new ProcessDestroyerImpl();
+ Runtime.getRuntime().addShutdownHook(destroyProcessThread);
+ added = true;
+ }
+ }
+
+ /**
+ * Removes this <code>ProcessDestroyer</code> as a shutdown hook, uses
+ * reflection to ensure pre-JDK 1.3 compatibility
+ */
+ private void removeShutdownHook() {
+ if (added && !running) {
+ boolean removed = Runtime.getRuntime().removeShutdownHook(
+ destroyProcessThread);
+ if (!removed) {
+ // System.err.println("Could not remove shutdown hook");
+ // TODO should we just ignore?
+ }
+ /*
+ * start the hook thread, a unstarted thread may not be eligible for
+ * garbage collection Cf.: http://developer.java.sun.com/developer/
+ * bugParade/bugs/4533087.html
+ */
+
+ destroyProcessThread.setShouldDestroy(false);
+ destroyProcessThread.start();
+ // this should return quickly, since it basically is a NO-OP.
+ try {
+ destroyProcessThread.join(20000);
+ } catch (InterruptedException ie) {
+ // the thread didn't die in time
+ // it should not kill any processes unexpectedly
+ }
+ destroyProcessThread = null;
+ added = false;
+ }
+ }
+
+ /**
+ * Returns whether or not the ProcessDestroyer is registered as as shutdown
+ * hook
+ *
+ * @return true if this is currently added as shutdown hook
+ */
+ public boolean isAddedAsShutdownHook() {
+ return added;
+ }
+
+ /**
+ * Returns <code>true</code> if the specified <code>Process</code> was
+ * successfully added to the list of processes to destroy upon VM exit.
+ *
+ * @param process
+ * the process to add
+ * @return <code>true</code> if the specified <code>Process</code> was
+ * successfully added
+ */
+ public boolean add(final Process process) {
+ synchronized (processes) {
+ // if this list is empty, register the shutdown hook
+ if (processes.size() == 0) {
+ addShutdownHook();
+ }
+ processes.addElement(process);
+ return processes.contains(process);
+ }
+ }
+
+ /**
+ * Returns <code>true</code> if the specified <code>Process</code> was
+ * successfully removed from the list of processes to destroy upon VM exit.
+ *
+ * @param process
+ * the process to remove
+ * @return <code>true</code> if the specified <code>Process</code> was
+ * successfully removed
+ */
+ public boolean remove(final Process process) {
+ synchronized (processes) {
+ boolean processRemoved = processes.removeElement(process);
+ if (processRemoved && processes.size() == 0) {
+ removeShutdownHook();
+ }
+ return processRemoved;
+ }
+ }
+
+ /**
+ * Invoked by the VM when it is exiting.
+ */
+ public void run() {
+ synchronized (processes) {
+ running = true;
+ Enumeration e = processes.elements();
+ while (e.hasMoreElements()) {
+ ((Process) e.nextElement()).destroy();
+ }
+ }
+ }
+}
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/ShutdownHookProcessDestroyer.java
------------------------------------------------------------------------------
svn:keywords = Id
Modified: jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java?rev=291024&r1=291023&r2=291024&view=diff
==============================================================================
--- jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java (original)
+++ jakarta/commons/sandbox/exec/trunk/src/main/java/org/apache/commons/exec/environment/EnvironmentVariable.java Thu Sep 22 14:57:56 2005
@@ -150,4 +150,4 @@
return key.equals(envVar.key) && value.equals(envVar.value);
}
-}
\ No newline at end of file
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org