From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13852 invoked by alias); 1 Mar 2007 16:15:34 -0000 Received: (qmail 13843 invoked by uid 22791); 1 Mar 2007 16:15:33 -0000 X-Spam-Status: No, hits=-2.5 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,TW_FH X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (66.187.233.31) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 01 Mar 2007 16:15:24 +0000 Received: from int-mx1.corp.redhat.com (int-mx1.corp.redhat.com [172.16.52.254]) by mx1.redhat.com (8.13.1/8.13.1) with ESMTP id l21GFIq3013676 for ; Thu, 1 Mar 2007 11:15:21 -0500 Received: from pobox.corp.redhat.com (pobox.corp.redhat.com [10.11.255.20]) by int-mx1.corp.redhat.com (8.13.1/8.13.1) with ESMTP id l21GEmWs021674 for ; Thu, 1 Mar 2007 11:14:48 -0500 Received: from multics.rdu.redhat.com (multics.rdu.redhat.com [172.16.57.153]) by pobox.corp.redhat.com (8.13.1/8.13.1) with ESMTP id l21GEmL6027822 for ; Thu, 1 Mar 2007 11:14:48 -0500 Subject: fhpd From: Stan Cox To: Frysk List Content-Type: multipart/mixed; boundary="=-149d/uXxPJoXDDXh6cq/" Date: Thu, 01 Mar 2007 16:15:00 -0000 Message-Id: <1172765357.27599.17.camel@multics.rdu.redhat.com> Mime-Version: 1.0 X-Mailer: Evolution 2.6.3 (2.6.3-1.fc5.5) X-Virus-Checked: Checked by ClamAV on sourceware.org X-IsSubscribed: yes Mailing-List: contact frysk-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-owner@sourceware.org X-SW-Source: 2007-q1/txt/msg00169.txt.bz2 --=-149d/uXxPJoXDDXh6cq/ Content-Type: text/plain Content-Transfer-Encoding: 7bit Content-length: 236 This is my rather quick attempt at getting 'fhpd ' to work. starts as a child of fhpd but fhpd never regains I/O control. AttachHandler -parse -requestCreateAttachedProc for ProcObserver -new --=-149d/uXxPJoXDDXh6cq/ Content-Disposition: attachment; filename=",cvsdiff" Content-Type: text/plain; name=",cvsdiff"; charset=UTF-8 Content-Transfer-Encoding: 7bit Content-length: 5272 /home/scox/frysk/src /home/scox/frysk ~ Index: frysk-core/frysk/cli/hpd/CLI.java =================================================================== RCS file: /cvs/frysk/frysk-core/frysk/cli/hpd/CLI.java,v retrieving revision 1.45 diff -u -p -r1.45 CLI.java --- frysk-core/frysk/cli/hpd/CLI.java 27 Feb 2007 17:16:43 -0000 1.45 +++ frysk-core/frysk/cli/hpd/CLI.java 1 Mar 2007 15:59:20 -0000 @@ -62,13 +62,19 @@ import javax.naming.NameNotFoundExceptio import frysk.value.InvalidOperatorException; import frysk.value.Variable; +// import frysk.proc.Action; +import frysk.proc.Action; import frysk.proc.Host; import frysk.proc.Manager; import frysk.proc.Proc; import frysk.proc.ProcId; import frysk.proc.Task; +import frysk.proc.TaskObserver; import frysk.rt.RunState; import frysk.rt.StackFrame; +//import frysk.sys.Pid; +import frysk.sys.Signal; +import frysk.sys.Sig; import frysk.rt.LineBreakpoint; @@ -86,6 +92,7 @@ public class CLI int stackLevel = 0; static Object monitor = new Object(); static boolean attached; + static boolean child_created; RunState runState; private RunStateObserver runStateObserver; private ActionpointTable apTable = new ActionpointTable(); @@ -356,11 +363,13 @@ public class CLI } } } - - class AttachHandler implements CommandHandler + + class AttachHandler implements CommandHandler { public void handle(Command cmd) throws ParseException { + String[] args = new String[1]; + refreshSymtab(); // XXX ? ArrayList params = cmd.getParameters(); boolean cli = true; @@ -391,27 +400,38 @@ public class CLI } else if (((String)params.get(idx)).matches("[0-9]+")) pid = Integer.parseInt((String)params.get(idx)); + else args[0] = (String)params.get(idx); } + final ProcObserver procObserver = new ProcObserver(); if (cli) - { - Manager.host.requestFindProc(new ProcId(pid), new Host.FindProc() { - - public void procFound (ProcId procId) - { - - Manager.eventLoop.requestStop(); - } - - public void procNotFound (ProcId procId, Exception e) - { - }}); - Manager.eventLoop.run(); - CLIEventLoop eventLoop = new CLIEventLoop(); - eventLoop.start(); - } + { + if (pid > 0) + { + Manager.host.requestFindProc(new ProcId(pid), new Host.FindProc() + { + public void procFound (ProcId procId) + { + Manager.eventLoop.requestStop(); + } + + public void procNotFound (ProcId procId, Exception e) + { + } + }); + } + else + { + Manager.host.requestCreateAttachedProc(args, procObserver); + child_created = true; + } + Manager.eventLoop.run(); + Manager.eventLoop.start(); + } - proc = Manager.host.getProc (new ProcId (pid)); + proc = Manager.host.getProc(new ProcId(pid)); + //Proc me = Manager.host.getProc(new ProcId(Pid.get())); + //me.getMainTask().requestAddSignaledObserver(procObserver); if (proc == null) { addMessage("The event manager is not running.", Message.TYPE_ERROR); @@ -962,6 +982,8 @@ public class CLI DetachHandler detachHandler = new DetachHandler(); Command command = new Command ("detach"); detachHandler.handle(command); + if (child_created) + Signal.tkill (pid, Sig.TERM); addMessage("Quitting...", Message.TYPE_NORMAL); } } @@ -1232,30 +1254,57 @@ public class CLI } return result; } - - private static class CLIEventLoop extends Thread + + private class ProcObserver + implements TaskObserver.Attached, + TaskObserver.Terminated, + TaskObserver.Signaled { - public void run() + + public void addedTo (Object o) + { + } + + public Action updateAttached (Task taskp) + { + proc = taskp.getProc(); + taskp.requestAddTerminatedObserver(this); + return Action.CONTINUE; + } + + public void addFailed (Object observable, Throwable w) { - try - { - Manager.eventLoop.run(); - } - finally - { - synchronized (monitor) - { - monitor.notifyAll(); - } - } } - public void requestStop() + public void deletedFrom (Object o) + { + } + + public Action updateTerminated(Task task, boolean signal, int exit) { Manager.eventLoop.requestStop(); + return Action.CONTINUE; } - } + public Action updateSignaled (Task task, int signal) + { + System.out.println("From PID: " + task.getProc().getPid() + " TID: " + task.getTid()); + switch (signal) + { + case 2: + System.out.println("SIGINT detected"); + break; + case 3: + System.out.println("SIGQUIT detected"); + break; + case 15: + System.out.println("SIGTERM detected"); + break; + } + return Action.CONTINUE; + } + } + private class RunStateObserver implements Observer { public void update(Observable observable, Object arg) --=-149d/uXxPJoXDDXh6cq/--