diff -up frysk-0.4/frysk-core/frysk/util/ProcRunUtil.java.lostfork frysk-0.4/frysk-core/frysk/util/ProcRunUtil.java
--- frysk-0.4/frysk-core/frysk/util/ProcRunUtil.java.lostfork 2010-03-30 09:44:35.000000000 -0400
+++ frysk-0.4/frysk-core/frysk/util/ProcRunUtil.java 2010-03-30 10:30:47.000000000 -0400
@@ -41,6 +41,7 @@ package frysk.util;
import java.util.HashSet;
+import frysk.rsl.Log;
import frysk.proc.Action;
import frysk.proc.Manager;
import frysk.proc.Proc;
@@ -58,8 +59,13 @@ import gnu.classpath.tools.getopt.Option
* Utilities must implement {@link ProcRunObserver} to use.
*/
public class ProcRunUtil {
+ private static final Log fine = Log.fine(ProcRunUtil.class);
private final HashSet knownTasks = new HashSet();
+ // A fork triggers two events, one for the parent, and one for the
+ // child (when the child stops). This is the set of tasks for
+ // which the child event has yet to arrive.
+ private final HashSet missingForkedOffspring = new HashSet();
ForkedObserver forkedObserver = new ForkedObserver();
AttachedObserver attachedObserver = new AttachedObserver();
@@ -115,6 +121,8 @@ public class ProcRunUtil {
private void addObservers(Task task) {
if (knownTasks.add(task)) {
+ fine.log(this, "addObservers", task);
+ missingForkedOffspring.remove(task);
task.requestAddClonedObserver(procRunObserver);
task.requestAddExecedObserver(procRunObserver);
task.requestAddForkedObserver(procRunObserver);
@@ -128,11 +136,14 @@ public class ProcRunUtil {
class ForkedObserver implements TaskObserver.Forked {
public Action updateForkedOffspring(Task parent, Task offspring) {
+ fine.log(this, "updateForkedOffspring parent", parent, "offspring", offspring);
addObservers(offspring.getProc());
return Action.BLOCK;
}
public Action updateForkedParent(Task parent, Task offspring) {
+ fine.log(this, "updateForkedParent parent", parent, "offspring", offspring);
+ missingForkedOffspring.add(offspring);
return Action.CONTINUE;
}
@@ -198,7 +209,9 @@ public class ProcRunUtil {
public void taskRemoved (Task task)
{
knownTasks.remove(task);
- if(knownTasks.size() == 0){
+ fine.log(this, "taskRemoved", task, "knownTasks", knownTasks.size(),
+ "missingForkedOffspring", missingForkedOffspring.size());
+ if (knownTasks.size() == 0 && missingForkedOffspring.size() == 0){
Manager.eventLoop.requestStop();
}
}