diff -up frysk-0.4/frysk-core/frysk/bindir/fauxv.java.taskstoputil frysk-0.4/frysk-core/frysk/bindir/fauxv.java --- frysk-0.4/frysk-core/frysk/bindir/fauxv.java.taskstoputil 2010-03-24 14:11:48.000000000 -0400 +++ frysk-0.4/frysk-core/frysk/bindir/fauxv.java 2010-03-24 14:12:04.000000000 -0400 @@ -42,14 +42,14 @@ package frysk.bindir; import frysk.event.ProcEvent; import frysk.proc.Proc; import frysk.util.AuxvStringBuilder; -import frysk.util.ProcStopUtil; +import frysk.util.TaskStopUtil; public class fauxv { static Proc proc = null; public static void main (String[] args) { - ProcStopUtil fauxv = new ProcStopUtil("fauxv", args, + TaskStopUtil fauxv = new TaskStopUtil("fauxv", args, new PrintAuxvEvent()); fauxv.setUsage("Usage: fauxv || fauxv [] " + "|| fauvx []"); diff -up frysk-0.4/frysk-core/frysk/bindir/fcore.java.taskstoputil frysk-0.4/frysk-core/frysk/bindir/fcore.java --- frysk-0.4/frysk-core/frysk/bindir/fcore.java.taskstoputil 2010-03-24 14:10:12.000000000 -0400 +++ frysk-0.4/frysk-core/frysk/bindir/fcore.java 2010-03-24 14:10:47.000000000 -0400 @@ -44,7 +44,7 @@ import frysk.event.ProcEvent; import frysk.proc.Proc; import frysk.proc.Task; -import frysk.util.ProcStopUtil; +import frysk.util.TaskStopUtil; import frysk.isa.corefiles.LinuxElfCorefile; import frysk.isa.corefiles.LinuxElfCorefileFactory; import gnu.classpath.tools.getopt.Option; @@ -68,7 +68,7 @@ public class fcore { * @param args - pid of the process to core dump */ public static void main (String[] args) { - ProcStopUtil fcore = new ProcStopUtil("fcore", args, + TaskStopUtil fcore = new TaskStopUtil("fcore", args, new createCoreEvent(), options()); fcore.setUsage("Usage: fcore PID"); diff -up frysk-0.4/frysk-core/frysk/bindir/fdebugdump.java.taskstoputil frysk-0.4/frysk-core/frysk/bindir/fdebugdump.java --- frysk-0.4/frysk-core/frysk/bindir/fdebugdump.java.taskstoputil 2010-03-24 14:48:00.000000000 -0400 +++ frysk-0.4/frysk-core/frysk/bindir/fdebugdump.java 2010-03-24 15:00:05.000000000 -0400 @@ -3,35 +3,33 @@ package frysk.bindir; import java.io.PrintWriter; import java.util.Iterator; +import frysk.dwfl.DwflCache; +import frysk.event.ProcEvent; +import frysk.proc.Proc; +import frysk.util.TaskStopUtil; import lib.dwfl.DwarfDie; import lib.dwfl.Dwfl; import lib.dwfl.DwflModule; -import frysk.dwfl.DwflCache; -import frysk.isa.signals.Signal; -import frysk.proc.Action; -import frysk.proc.Task; -import frysk.util.ProcRunUtil; -import frysk.util.ProcRunUtil.ProcRunObserver; -import frysk.util.ProcRunUtil.RunUtilOptions; -import gnu.classpath.tools.getopt.OptionGroup; public class fdebugdump{ private static PrintWriter printWriter = new PrintWriter(System.out); public static void main(String[] args) { - RunUtilOptions options = new RunUtilOptions(); - - OptionGroup[] customOptions = new OptionGroup[]{}; - - ProcRunUtil procRunUtil = new ProcRunUtil("fdebugdump", "fdebugdump ", args, procRunObserver, customOptions, options); - procRunUtil.start(); + TaskStopUtil fdebugdump = new TaskStopUtil("fdebugdump", args, + new DebugDumpEvent(), + null); + fdebugdump.setUsage("Usage: fdebugdump | fdebugdump | fdebugdump [ ]"); + fdebugdump.execute(); + printWriter.flush(); } - private static ProcRunObserver procRunObserver = new ProcRunObserver(){ - - public Action updateAttached(Task task) { - Dwfl dwfl = DwflCache.getDwfl(task); + private static class DebugDumpEvent implements ProcEvent { + public void executeLive(Proc proc) { + executeDead(proc); + } + public void executeDead(Proc proc) { + Dwfl dwfl = DwflCache.getDwfl(proc.getMainTask()); DwflModule[] dwflModules = dwfl.getModules(); for (int i = 0; i < dwflModules.length; i++) { DwflModule module = dwflModules[i]; @@ -42,34 +40,15 @@ public class fdebugdump{ printDie(die, " "); } } - return Action.CONTINUE; } - - public void addFailed(Object observable, Throwable w) {} - - public void addedTo(Object observable) {} - - public void deletedFrom(Object observable) {} - - public Action updateForkedOffspring(Task parent, Task offspring) { return Action.CONTINUE; } - public Action updateForkedParent(Task parent, Task offspring) { return Action.CONTINUE; } - public Action updateExeced(Task task) { return Action.CONTINUE; } - public Action updateClonedParent(Task task, Task clone) { return Action.CONTINUE; } - public Action updateTerminated(Task task, Signal signal, int value) { return Action.CONTINUE; } - public Action updateClonedOffspring(Task parent, Task offspring) { return Action.CONTINUE; } - public void existingTask(Task task) {} - public void taskAdded(Task task) {} - public void taskRemoved(Task task) {} - - }; - private static void printDie(DwarfDie die, String indent){ - printWriter.println(indent + die.getTag() + " " + die.getName()); - - die = die.getChild(); - while(die != null){ - printDie(die, indent+ " "); - die = die.getSibling(); + private static void printDie(DwarfDie die, String indent){ + printWriter.println(indent + die.getTag() + " " + die.getName()); + die = die.getChild(); + while(die != null){ + printDie(die, indent+ " "); + die = die.getSibling(); + } } } } diff -up frysk-0.4/frysk-core/frysk/bindir/fdebuginfo.java.taskstoputil frysk-0.4/frysk-core/frysk/bindir/fdebuginfo.java --- frysk-0.4/frysk-core/frysk/bindir/fdebuginfo.java.taskstoputil 2010-03-24 14:12:48.000000000 -0400 +++ frysk-0.4/frysk-core/frysk/bindir/fdebuginfo.java 2010-03-24 14:13:08.000000000 -0400 @@ -44,7 +44,7 @@ import frysk.proc.Proc; import frysk.proc.Task; import frysk.util.DebuginfoPaths; -import frysk.util.ProcStopUtil; +import frysk.util.TaskStopUtil; public final class fdebuginfo { @@ -54,7 +54,7 @@ public final class fdebuginfo */ public static void main(String[] args) { - ProcStopUtil fdebuginfo = new ProcStopUtil("fdebuginfo", args, + TaskStopUtil fdebuginfo = new TaskStopUtil("fdebuginfo", args, new PrintDebuginfoEvent()); fdebuginfo.setUsage("Usage: fdebuginfo || fdebuginfo " + "|| fdebuginfo []"); diff -up frysk-0.4/frysk-core/frysk/bindir/fexe.java.taskstoputil frysk-0.4/frysk-core/frysk/bindir/fexe.java --- frysk-0.4/frysk-core/frysk/bindir/fexe.java.taskstoputil 2010-03-24 14:12:15.000000000 -0400 +++ frysk-0.4/frysk-core/frysk/bindir/fexe.java 2010-03-24 14:12:33.000000000 -0400 @@ -41,7 +41,7 @@ package frysk.bindir; import frysk.sys.ProcessIdentifier; import frysk.sys.ProcessIdentifierFactory; -import frysk.util.ProcStopUtil; +import frysk.util.TaskStopUtil; import frysk.event.ProcEvent; import frysk.proc.Proc; import frysk.sys.proc.Exe; @@ -64,7 +64,7 @@ public class fexe public static void main(String[] args) { PrintExeEvent printExe = new PrintExeEvent(); - ProcStopUtil fexe = new ProcStopUtil("fexe", args, printExe, + TaskStopUtil fexe = new TaskStopUtil("fexe", args, printExe, options()); fexe.setUsage("Usage: fexe || fexe " + "|| fexe []"); diff -up frysk-0.4/frysk-core/frysk/bindir/fmaps.java.taskstoputil frysk-0.4/frysk-core/frysk/bindir/fmaps.java --- frysk-0.4/frysk-core/frysk/bindir/fmaps.java.taskstoputil 2010-03-24 14:11:15.000000000 -0400 +++ frysk-0.4/frysk-core/frysk/bindir/fmaps.java 2010-03-24 14:11:33.000000000 -0400 @@ -39,7 +39,7 @@ package frysk.bindir; -import frysk.util.ProcStopUtil; +import frysk.util.TaskStopUtil; import frysk.event.ProcEvent; import frysk.proc.Proc; import frysk.proc.MemoryMap; @@ -47,7 +47,7 @@ import frysk.proc.MemoryMap; public class fmaps { public static void main (String[] args) { - ProcStopUtil fmaps = new ProcStopUtil("fmaps", args, + TaskStopUtil fmaps = new TaskStopUtil("fmaps", args, new PrintMapsEvent()); fmaps.setUsage("Usage: fmaps || fmaps " + "|| fmaps []"); diff -up frysk-0.4/frysk-core/frysk/bindir/fstack.java.taskstoputil frysk-0.4/frysk-core/frysk/bindir/fstack.java --- frysk-0.4/frysk-core/frysk/bindir/fstack.java.taskstoputil 2010-03-24 14:13:32.000000000 -0400 +++ frysk-0.4/frysk-core/frysk/bindir/fstack.java 2010-03-24 15:00:53.000000000 -0400 @@ -43,12 +43,11 @@ import java.io.PrintWriter; import java.util.Iterator; import java.util.TreeMap; import frysk.debuginfo.PrintDebugInfoStackOptions; -import frysk.event.Event; import frysk.event.ProcEvent; import frysk.proc.Proc; import frysk.proc.Task; import frysk.rsl.Log; -import frysk.util.ProcStopUtil; +import frysk.util.TaskStopUtil; import frysk.util.StackPrintUtil; import gnu.classpath.tools.getopt.OptionGroup; @@ -60,11 +59,12 @@ public final class fstack { private static final Log fine = Log.fine(fstack.class); public static void main(String[] args) { - ProcStopUtil fstack = new ProcStopUtil("fstack", args, + TaskStopUtil fstack = new TaskStopUtil("fstack", args, new StackerEvent(), options()); fstack.setUsage("Usage: fstack || fstack []"); fstack.execute(); + printWriter.flush(); } /** @@ -74,19 +74,11 @@ public final class fstack { public void executeLive(Proc proc) { fine.log(this, "printTasks"); printTasks(proc); - proc.requestAbandonAndRunEvent(new Event() - { - public void execute () - { - printWriter.flush(); - } - }); } public void executeDead(Proc proc) { fine.log(this, "printTasks"); printTasks(proc); - printWriter.flush(); } } diff -up frysk-0.4/frysk-core/frysk/util/TaskStopUtil.java.taskstoputil frysk-0.4/frysk-core/frysk/util/TaskStopUtil.java --- frysk-0.4/frysk-core/frysk/util/TaskStopUtil.java.taskstoputil 2008-06-09 14:03:07.000000000 -0400 +++ frysk-0.4/frysk-core/frysk/util/TaskStopUtil.java 2010-03-24 14:44:48.000000000 -0400 @@ -39,6 +39,9 @@ package frysk.util; +import java.util.Set; +import java.util.HashSet; + import frysk.event.Event; import frysk.event.ProcEvent; import frysk.proc.Manager; @@ -57,13 +60,13 @@ import frysk.rsl.Log; * * Utilities must define a event.ProcEvent to execute. */ -public class ProcStopUtil { - private static final Log fine = Log.fine(ProcStopUtil.class); +public class TaskStopUtil { + private static final Log fine = Log.fine(TaskStopUtil.class); private String[] args; private CommandlineParser parser; - public ProcStopUtil(String utilName, String[] args, + public TaskStopUtil(String utilName, String[] args, final ProcEvent procEvent, OptionGroup[] utilOptionGroups) { this.args = args; @@ -72,10 +75,10 @@ public class ProcStopUtil { public void parsePids(Proc[] procs) { for (int i= 0; i < procs.length; i++) { Proc proc = procs[i]; - UtilEvent utilEvent = new UtilEvent(proc, procEvent); - new ProcBlockAction(proc, new UtilAction(proc, utilEvent)); - Manager.eventLoop.run(); + new ProcBlockAction(proc, new TasksBlocked(proc, + procEvent)); } + Manager.eventLoop.run(); } //@Override @@ -95,7 +98,7 @@ public class ProcStopUtil { }; } - public ProcStopUtil(String utilName, String[] args, + public TaskStopUtil(String utilName, String[] args, final ProcEvent procEvent) { this(utilName, args, procEvent, null); } @@ -120,17 +123,32 @@ public class ProcStopUtil { } } - private static class UtilAction implements ProcBlockObserver { + private static class TasksBlocked implements ProcBlockObserver, Event { protected Proc proc; - private Event event; + private ProcEvent procEvent; + protected Set procs = new HashSet(); - public UtilAction(Proc proc, Event event) { + public TasksBlocked(Proc proc, ProcEvent procEvent) { this.proc = proc; - this.event = event; + this.procEvent = procEvent; + this.procs.add (proc); } public void allExistingTasksCompleted() { - Manager.eventLoop.add(event); + fine.log("allExistingTasksCompleted proc", proc); + procEvent.executeLive(proc); + // Now ask for it to be detached. + proc.requestAbandonAndRunEvent(this); + } + + // Called when the process has been abandoned. + public void execute () { + fine.log("execute abandonedProc", proc, "remaining", procs); + procs.remove(proc); + if (procs.isEmpty()) { + fine.log("all abandoned"); + Manager.eventLoop.requestStop(); + } } public void taskAddFailed(Object task, Throwable w) { } @@ -143,25 +161,4 @@ public class ProcStopUtil { public void deletedFrom(Object observable) { } } - - private static class UtilEvent - implements Event - { - private Proc proc = null; - private ProcEvent event = null; - - public UtilEvent(Proc proc, ProcEvent event) { - this.proc = proc; - this.event = event; - } - - public void execute() { - fine.log("execute live", proc); - event.executeLive(proc); - - // FIXME: Should request eventloop to stop - // instead of exit. - System.exit(0); - } - } } \ No newline at end of file