Blob Blame History Raw
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 <PID>  || fauxv <COREFILE> [<EXEFILE>] " +
         	       "|| fauvx <COREFILE> [<EXEFILE>]");  
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 <exe>", args, procRunObserver, customOptions, options);
-	procRunUtil.start();
+	TaskStopUtil fdebugdump = new TaskStopUtil("fdebugdump", args,
+						   new DebugDumpEvent(),
+						   null);
+	fdebugdump.setUsage("Usage: fdebugdump <EXE> | fdebugdump <PID> | fdebugdump <COREFILE> [ <EXEFILE> ]");
+	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 <PID> || fdebuginfo <EXEFILE> " +
 	                    "|| fdebuginfo <COREFILE> [<EXEFILE>]");   
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 <PID> || fexe <EXEFILE> " +
                       "|| fexe <COREFILE> [<EXEFILE>]"); 
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 <PID> || fmaps <EXEFILE> " +
 	               "|| fmaps <COREFILE> [<EXEFILE>]");   
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 <PID> || fstack <COREFILE> [<EXEFILE>]");   
 	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