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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]