public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: swagiaal@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM] master: swagiaal: Reimplemented ProcRunUtil with rich client notification.
Date: Thu, 20 Mar 2008 20:25:00 -0000 [thread overview]
Message-ID: <20080320202537.3632.qmail@sourceware.org> (raw)
The branch, master has been updated
via 3b36d485999bed1d4e1b6fa7d4922332d8adfe74 (commit)
from dec89fbcd4c87a499c7801dfad629a998e3623e5 (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email.
- Log -----------------------------------------------------------------
commit 3b36d485999bed1d4e1b6fa7d4922332d8adfe74
Author: Sami Wagiaalla <swagiaal@redhat.com>
Date: Thu Mar 20 16:25:15 2008 -0400
swagiaal: Reimplemented ProcRunUtil with rich client notification.
frysk-core/frysk/bindir/ChangeLog
+2008-03-20 Sami Wagiaalla <swagiaal@redhat.com>
+
+ * fstep.java: Use ProcRunUtil.
+
frysk-core/frysk/util/ChangeLog
+2008-03-20 Sami Wagiaalla <swagiaal@redhat.com>
+
+ * ProcRunUtil.java: Reimplemented with rich client notification.
+
-----------------------------------------------------------------------
Summary of changes:
frysk-core/frysk/bindir/ChangeLog | 6 +-
frysk-core/frysk/bindir/fstep.java | 150 ++++++++++--------
frysk-core/frysk/util/ChangeLog | 4 +
.../util/{ProcFollowUtil.java => ProcRunUtil.java} | 169 ++++++-------------
4 files changed, 150 insertions(+), 179 deletions(-)
copy frysk-core/frysk/util/{ProcFollowUtil.java => ProcRunUtil.java} (57%)
First 500 lines of diff:
diff --git a/frysk-core/frysk/bindir/ChangeLog b/frysk-core/frysk/bindir/ChangeLog
index 6f27c50..abbd05e 100644
--- a/frysk-core/frysk/bindir/ChangeLog
+++ b/frysk-core/frysk/bindir/ChangeLog
@@ -1,8 +1,12 @@
+2008-03-20 Sami Wagiaalla <swagiaal@redhat.com>
+
+ * fstep.java: Use ProcRunUtil.
+
2008-03-20 Sami Wagiaalla <swagiaal@redhat.com>
Renamed ProcRunUtil to ProcFollowUtil.
* ferror.java: Updated.
- * fstep.java: Updated.
+ * fstep.java: Updated.
2008-03-20 Andrew Cagney <cagney@redhat.com>
diff --git a/frysk-core/frysk/bindir/fstep.java b/frysk-core/frysk/bindir/fstep.java
index 87dedf5..d509347 100644
--- a/frysk-core/frysk/bindir/fstep.java
+++ b/frysk-core/frysk/bindir/fstep.java
@@ -51,16 +51,15 @@ import frysk.isa.signals.Signal;
import frysk.proc.Action;
import frysk.proc.Auxv;
import frysk.proc.Manager;
-import frysk.proc.Proc;
import frysk.proc.Task;
import frysk.proc.TaskObserver;
-import frysk.util.CommandlineParser;
-import frysk.util.ProcFollowUtil;
+import frysk.util.ProcRunUtil;
+import frysk.util.ProcRunUtil.ProcRunObserver;
import gnu.classpath.tools.getopt.Option;
import gnu.classpath.tools.getopt.OptionGroup;
import gnu.classpath.tools.getopt.OptionException;
-public class fstep implements ProcFollowUtil.NewTaskObserver,
+public class fstep implements ProcRunObserver,
TaskObserver.Code,
TaskObserver.Instruction,
TaskObserver.Terminated
@@ -77,13 +76,9 @@ public class fstep implements ProcFollowUtil.NewTaskObserver,
// Defaults to 1.
private static int instrs;
- // The command to execute
-// static String[] command;
-
// The process id to trace
static int pid;
- private static String[] command;
// Tasks being observed mapped to the total number of steps.
private static final HashMap tasks = new HashMap();
@@ -135,32 +130,35 @@ public class fstep implements ProcFollowUtil.NewTaskObserver,
return new OptionGroup[] { group };
}
- public static void main(String[] args) {
- sample = 0;
- instrs = 1;
-
- // XXX: parser is only needed because fstep uses fstep.command
- // to figure out wether the loaded code should be skipped or
- // not.
- final CommandlineParser parser = new CommandlineParser("fstep") {
- //XXX: this is needed so parser doesnt thin that pids
- //are not supported
- public void parsePids(Proc[] procs) {
- }
- public void parseCommand(Proc command) {
- fstep.command = command.getCmdLine();
- }
- };
- parser.parse(args);
-
- final fstep step = new fstep();
-
- ProcFollowUtil procRunUtil = new ProcFollowUtil("fstep",
- "fstep <PID|EXEC> [OPTIONS]",
- args, step, options(),
- ProcFollowUtil.DEFAULT);
- procRunUtil.start();
- }
+ Option instructionsOption = new Option("instructions", 'i',
+ "how many instructions to print at each step/sample",
+ "instructions")
+ {
+ public void parsed(String argument) throws OptionException
+ {
+ try
+ {
+ instrs = Integer.parseInt(argument);
+ }
+ catch (NumberFormatException nfe)
+ {
+ OptionException ex;
+ ex = new OptionException("instructions must be a number");
+ ex.initCause(nfe);
+ throw ex;
+ }
+ }
+ };
+
+ public static void main(String[] args) {
+ sample = 0;
+ instrs = 1;
+
+ final fstep step = new fstep();
+
+ ProcRunUtil procRunUtil = new ProcRunUtil("fstep", "fstep <PID|EXEC> [OPTIONS]", args, step , options(), ProcRunUtil.DEFAULT);
+ procRunUtil.start();
+ }
/**
* Disassembler to use when real disassembler isn't available.
@@ -194,54 +192,51 @@ public class fstep implements ProcFollowUtil.NewTaskObserver,
}
}
- public void notifyNewTask(Task task)
+ public Action updateAttached(Task task)
{
- // We only need one disassembler since all Tasks share their memory.
- if (disassembler == null)
- {
- if (Disassembler.available())
- disassembler = new Disassembler(task.getMemory());
- else
- disassembler = new DummyDisassembler(task.getMemory());
- }
-
- tasks.put(task, Long.valueOf(0));
-
// If this is an attach for a command given on the command line
// then we want to start stepping at the actual start of the
// process (and not inside the dynamic linker).
long startAddress = 0;
- if (command != null && command.length != 0)
- {
- Auxv[] auxv = task.getProc().getAuxv ();
- for (int i = 0; i < auxv.length; i++)
- {
- if (auxv[i].type == inua.elf.AT.ENTRY)
- {
+ Auxv[] auxv = task.getProc().getAuxv();
+ for (int i = 0; i < auxv.length; i++) {
+ if (auxv[i].type == inua.elf.AT.ENTRY) {
startAddress = auxv[i].val;
break;
- }
- }
- }
-
-// System.out.println("fstep.updateAttached() startAddress 0x" + Long.toHexString(startAddress));
+ }
+ }
if (startAddress == 0)
{
// Immediately start tracing steps.
- task.requestAddInstructionObserver(this);
- task.requestAddTerminatedObserver(this);
+ this.startTracingTask(task);
}
else
task.requestAddCodeObserver(this, startAddress);
+ return Action.CONTINUE;
}
+ private void startTracingTask(Task task){
+ if (!tasks.containsKey(task)) {
+ tasks.put(task, Long.valueOf(0));
+ // We only need one disassembler since all Tasks share their memory.
+ if (disassembler == null)
+ {
+ if (Disassembler.available())
+ disassembler = new Disassembler(task.getMemory());
+ else
+ disassembler = new DummyDisassembler(task.getMemory());
+ }
+ task.requestAddInstructionObserver(this);
+ task.requestAddTerminatedObserver(this);
+ }
+ }
+
// TaskObserver.Code interface
public Action updateHit(Task task, long address)
{
- task.requestAddInstructionObserver(this);
- task.requestAddTerminatedObserver(this);
+ startTracingTask(task);
task.requestDeleteCodeObserver(this, address);
return Action.BLOCK;
}
@@ -268,7 +263,7 @@ public class fstep implements ProcFollowUtil.NewTaskObserver,
long steps = ((Long) tasks.get(task)).longValue();
steps++;
tasks.put(task, Long.valueOf(steps));
-
+
if (sample == 0 || steps % sample == 0) {
int tid = task.getTid();
long pc = task.getPC();
@@ -300,4 +295,33 @@ public class fstep implements ProcFollowUtil.NewTaskObserver,
{
// Unused
}
+
+ public Action updateForkedOffspring(Task parent, Task offspring) {
+ this.startTracingTask(offspring);
+ offspring.requestUnblock(this);
+ return Action.BLOCK;
+ }
+
+ public Action updateExeced(Task task) {
+ // XXX: skip dynamic linker code again
+ // a la updateAttached ?
+ return Action.CONTINUE;
+ }
+
+ public Action updateClonedOffspring(Task parent, Task offspring) {
+ this.startTracingTask(offspring);
+ offspring.requestUnblock(this);
+ return Action.BLOCK;
+ }
+
+ public void taskAdded(Task task) {/* use updateClonedOffspring instead*/}
+
+ public void existingTask(Task task) {
+ this.startTracingTask(task);
+ }
+
+ public void taskRemoved(Task task) {}
+ public Action updateForkedParent(Task parent, Task offspring) {return Action.CONTINUE;}
+ public Action updateClonedParent(Task task, Task clone) {return Action.CONTINUE;}
+
}
diff --git a/frysk-core/frysk/util/ChangeLog b/frysk-core/frysk/util/ChangeLog
index b013423..9074d17 100644
--- a/frysk-core/frysk/util/ChangeLog
+++ b/frysk-core/frysk/util/ChangeLog
@@ -1,3 +1,7 @@
+2008-03-20 Sami Wagiaalla <swagiaal@redhat.com>
+
+ * ProcRunUtil.java: Reimplemented with rich client notification.
+
2008-03-20 Sami Wagiaalla <swagiaal@redhat.com>
* ProcFollowUtil.java: Renamed ProcRunUtil to ProcFollowUtil
diff --git a/frysk-core/frysk/util/ProcFollowUtil.java b/frysk-core/frysk/util/ProcRunUtil.java
similarity index 57%
copy from frysk-core/frysk/util/ProcFollowUtil.java
copy to frysk-core/frysk/util/ProcRunUtil.java
index f2888df..0163b4b 100644
--- a/frysk-core/frysk/util/ProcFollowUtil.java
+++ b/frysk-core/frysk/util/ProcRunUtil.java
@@ -40,7 +40,6 @@
package frysk.util;
import java.util.HashSet;
-import java.util.Set;
import frysk.proc.Action;
import frysk.proc.Manager;
@@ -50,14 +49,6 @@ import frysk.proc.ProcTasksObserver;
import frysk.proc.Task;
import frysk.proc.TaskAttachedObserverXXX;
import frysk.proc.TaskObserver;
-import frysk.proc.TaskObserver.Cloned;
-import frysk.proc.TaskObserver.Execed;
-import frysk.proc.TaskObserver.Forked;
-import frysk.proc.TaskObserver.Instruction;
-import frysk.proc.TaskObserver.Signaled;
-import frysk.proc.TaskObserver.Syscalls;
-import frysk.proc.TaskObserver.Terminated;
-import frysk.proc.TaskObserver.Terminating;
import gnu.classpath.tools.getopt.OptionGroup;
/**
@@ -66,77 +57,71 @@ import gnu.classpath.tools.getopt.OptionGroup;
*
* Utilities must define a event.ProcEvent to execute.
*/
-public class ProcFollowUtil {
+public class ProcRunUtil {
private final HashSet knownTasks = new HashSet();
ForkedObserver forkedObserver = new ForkedObserver();
-
AttachedObserver attachedObserver = new AttachedObserver();
- private RunningUtilOptions options;
- private TaskObserver[] observers;
-
- private NewTaskObserver newTaskObserver;
+ private RunUtilOptions options;
- public static interface NewTaskObserver{
- void notifyNewTask(Task task);
- }
+ public static interface ProcRunObserver extends
+ TaskAttachedObserverXXX, // this is only notified if the process is newly created by the util
+ TaskObserver.Forked,
+ TaskObserver.Execed,
+ ProcTasksObserver, // this is only notified if the util attaches to an existing process
+ TaskObserver.Cloned,
+ TaskObserver.Terminated
+ {}
- public static class RunningUtilOptions {
+ private final ProcRunObserver procRunObserver;
+
+ public static class RunUtilOptions {
boolean followForks = true;
}
- public static final RunningUtilOptions DEFAULT = new RunningUtilOptions();
+ public static final RunUtilOptions DEFAULT = new RunUtilOptions();
- public ProcFollowUtil(String utilName, String usage, String[] args,
- NewTaskObserver newTaskObserver,
- OptionGroup[] customOptions,
- RunningUtilOptions options) {
- this(utilName, usage, args, new TaskObserver[]{}, customOptions,
- options);
- this.newTaskObserver = newTaskObserver;
- }
-
- public ProcFollowUtil(String utilName, String usage, String[] args,
- TaskObserver[] observers, OptionGroup[] customOptions,
- RunningUtilOptions options) {
+ public ProcRunUtil(String utilName, String usage, String[] args,
+ final ProcRunObserver procRunObserver, OptionGroup[] customOptions,
+ RunUtilOptions options) {
+
+ this.procRunObserver = procRunObserver;
this.options = options;
- this.observers = observers;
-
- //Set up commandline parser
- CommandlineParser parser = new CommandlineParser(utilName,
- customOptions) {
- // @Override
- public void parsePids(Proc[] procs) {
- for (int i = 0; i < procs.length; i++) {
- addObservers(procs[i]);
- }
- }
- // @Override
- public void parseCommand(Proc command) {
- Manager.host.requestCreateAttachedProc(command, attachedObserver);
+
+ CommandlineParser parser = new CommandlineParser(utilName, customOptions) {
+ // @Override
+ public void parsePids(Proc[] procs) {
+ for (int i = 0; i < procs.length; i++) {
+ addObservers(procs[i]);
+ new ProcTasksAction(procs[i], procRunObserver);
}
- };
+ }
+
+ // @Override
+ public void parseCommand(Proc command) {
+ Manager.host.requestCreateAttachedProc(command, attachedObserver);
+ }
+ };
+
parser.parse(args);
+
}
-
+
private void addObservers(Proc proc) {
new ProcTasksAction(proc, tasksObserver);
}
private void addObservers(Task task) {
if (knownTasks.add(task)) {
-
- if(newTaskObserver != null){
- newTaskObserver.notifyNewTask(task);
- }
-
- for (int i = 0; i < observers.length; i++) {
- this.addTaskObserver(observers[i], task);
- }
- if (options.followForks) {
- this.addTaskObserver(forkedObserver, task);
+ task.requestAddClonedObserver(procRunObserver);
+ task.requestAddExecedObserver(procRunObserver);
+ task.requestAddForkedObserver(forkedObserver);
+ task.requestAddTerminatedObserver(procRunObserver);
+
+ if (this.options.followForks) {
+ task.requestAddForkedObserver(forkedObserver);
}
}
}
@@ -162,31 +147,33 @@ public class ProcFollowUtil {
}
class AttachedObserver implements TaskAttachedObserverXXX {
- private Set procs = new HashSet();
-
+
public synchronized Action updateAttached(Task task) {
-
+
+ procRunObserver.updateAttached(task);
Proc proc = task.getProc();
- if (!procs.contains(proc)) {
- procs.add(proc);
- addObservers(proc);
- }
+ addObservers(proc);
return Action.BLOCK;
}
public void addedTo(Object observable) {
+ procRunObserver.addedTo(observable);
}
public void deletedFrom(Object observable) {
+ procRunObserver.deletedFrom(observable);
}
public void addFailed(Object observable, Throwable w) {
+ procRunObserver.addFailed(observable, w);
throw new RuntimeException("Failed to attach to created proc", w);
}
}
- private ProcTasksObserver tasksObserver = new ProcTasksObserver() {
+ ProcTasksObserver tasksObserver = new ProcTasksObserver()
+ {
+
public void existingTask (Task task)
{
addObservers(task);
@@ -219,55 +206,7 @@ public class ProcFollowUtil {
public void deletedFrom (Object observable) {}
};
- //XXX: this is to handle adding observers according to their types
- // since task does not provide overloaded functions for adding
- // observers.
- private void addTaskObserver(TaskObserver observer, Task task){
- boolean handled = false;
-
- if(observer instanceof TaskAttachedObserverXXX){
- task.requestAddAttachedObserver((TaskAttachedObserverXXX) observer);
- handled = true;
- }
- if(observer instanceof TaskObserver.Cloned){
- task.requestAddClonedObserver((Cloned) observer);
- handled = true;
- }
- if(observer instanceof TaskObserver.Forked){
- task.requestAddForkedObserver((Forked) observer);
- handled = true;
- }
- if(observer instanceof TaskObserver.Execed){
- task.requestAddExecedObserver((Execed) observer);
- handled = true;
- }
- if(observer instanceof TaskObserver.Terminating){
- task.requestAddTerminatingObserver((Terminating) observer);
- handled = true;
- }
- if(observer instanceof TaskObserver.Terminated){
- task.requestAddTerminatedObserver((Terminated) observer);
- handled = true;
- }
- if(observer instanceof TaskObserver.Syscalls){
- task.requestAddSyscallsObserver((Syscalls) observer);
- handled = true;
- }
- if(observer instanceof TaskObserver.Signaled){
- task.requestAddSignaledObserver((Signaled) observer);
- handled = true;
- }
- if(observer instanceof TaskObserver.Instruction){
- task.requestAddInstructionObserver((Instruction) observer);
- handled = true;
- }
-
- if(!handled){
- throw new RuntimeException("Observer type not handled");
- }
- }
-
public void start() {
Manager.eventLoop.run();
hooks/post-receive
--
frysk system monitor/debugger
reply other threads:[~2008-03-20 20:25 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20080320202537.3632.qmail@sourceware.org \
--to=swagiaal@sourceware.org \
--cc=frysk-cvs@sourceware.org \
--cc=frysk@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).