60 lines
2.4 KiB
Diff
60 lines
2.4 KiB
Diff
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();
|
|
}
|
|
}
|