public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: rmoseley@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Add ability to use HPD notation to kill command.
Date: Wed, 02 Apr 2008 18:54:00 -0000	[thread overview]
Message-ID: <20080402185457.3969.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  4460603b1eb3abdcf12478a5e01334a9cf7a8545 (commit)
      from  62c8e09795b7c1ad390022855df0188114dac3c9 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 4460603b1eb3abdcf12478a5e01334a9cf7a8545
Author: Rick Moseley <rmoseley@localhost.localdomain>
Date:   Wed Apr 2 13:53:57 2008 -0500

    Add ability to use HPD notation to kill command.
    
    * KillCommand.java: Add ability to use HPD notation.
    * TestKillCommand.java: Add test for above change.

-----------------------------------------------------------------------

Summary of changes:
 frysk-core/frysk/hpd/ChangeLog            |    5 +
 frysk-core/frysk/hpd/KillCommand.java     |  115 ++++++++++++++++++++++-------
 frysk-core/frysk/hpd/TestKillCommand.java |   23 ++++++
 3 files changed, 117 insertions(+), 26 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/hpd/ChangeLog b/frysk-core/frysk/hpd/ChangeLog
index 3cbe139..7c14beb 100644
--- a/frysk-core/frysk/hpd/ChangeLog
+++ b/frysk-core/frysk/hpd/ChangeLog
@@ -1,3 +1,8 @@
+2008-04-02  Rick Moseley  <rmoseley@redhat.com>
+
+	* KillCommand.java: Add ability to use HPD notation.
+	* TestKillCommand.java: Add test for above change.
+
 2008-04-01  Andrew Cagney  <cagney@redhat.com>
 
 	* StackCommands.java: Update to match PrintStackOptions.
diff --git a/frysk-core/frysk/hpd/KillCommand.java b/frysk-core/frysk/hpd/KillCommand.java
index c667bb6..7a90ede 100644
--- a/frysk-core/frysk/hpd/KillCommand.java
+++ b/frysk-core/frysk/hpd/KillCommand.java
@@ -58,6 +58,8 @@ public class KillCommand extends ParameterizedCommand {
     	"killed and then reloaded and are then ready to be run again.";
     
     Map saveProcs = new HashMap();
+    
+    PTSet userSet;
 
     KillCommand() {
 	super("kill the current targetset or kill a specific PID", "kill", full);
@@ -65,34 +67,29 @@ public class KillCommand extends ParameterizedCommand {
 
     public void interpret(CLI cli, Input cmd, Object options) {
 	
-	if (cmd.size() > 2)
-	    throw new InvalidCommandException("Too many parameters");
+	userSet = cli.targetset;
 	    
 	switch (cmd.size()) {
 	
-	case 0:
+	default:
+	    throw new InvalidCommandException("Too many parameters");
 	
-	    killProc(-1, cli);
-	    cli.outWriter.flush();
+	case 0:
+	    // See if user specified an HPD notation on the command line
+	    if (cmd.getFullCommand().startsWith("[")) {
+		userSet = cli.getCommandPTSet(cmd);
+		killProc(-1, cli, cmd);
+	    }
+	    // If no HPD notation, kill all currently running procs
+	    else killRunningProcs(cli, cmd);
+	    break;
 	    
-	    synchronized (cli) {
-		// Clear the running procs set
-		cli.runningProcs.clear();
+	   /* synchronized (cli) {
 		// Clear the stepping engine structures
 		cli.steppingEngine.clear();
 		// Add back in the stepping observer for cli
 		cli.steppingEngine.addObserver(cli.steppingObserver);
-	    }
-	    // Now loop through and re-load all of the killed procs
-	    Iterator bar = saveProcs.keySet().iterator();
-	    while (bar.hasNext()) {
-		Integer procId = (Integer) bar.next();
-		String cmdline = (String) saveProcs.get(procId);
-		cli.taskID = procId.intValue();
-		cli.execCommand("load " + cmdline + "\n");
-	    }
-	    cli.taskID = -1;
-	    break;
+	    } */
 	
 	// This is the case where a PID was entered
 	case 1:
@@ -103,14 +100,26 @@ public class KillCommand extends ParameterizedCommand {
 		cli.addMessage("PID entered is not an integer", Message.TYPE_ERROR);
 		return;
 	    }
-	    if (!killProc(pid, cli))
+	    if (!killProc(pid, cli, cmd))
 		cli.addMessage("PID " + pid + " could not be found", Message.TYPE_ERROR);
 	}
+	
+	// Now loop through and re-load all of the killed procs
+	Iterator bar = saveProcs.keySet().iterator();
+	while (bar.hasNext()) {
+	    Integer procId = (Integer) bar.next();
+	    String cmdline = (String) saveProcs.get(procId);
+	    cli.taskID = procId.intValue();
+	    cli.execCommand("load " + cmdline + "\n");
+	}
+	saveProcs.clear();
+	cli.taskID = -1;
     }
 	
     /**
-     * killProc will kill all Procs or just the Proc specified by the PID
-     * passed to it.
+     * killProc will kill all Procs in the current target set or, if a PID
+     *     was passed as a parameter, kill just the Proc specified by the PID
+     *     passed to it.
      * 
      * @param pid
      *                is an int containing the PID that should be killed, if
@@ -118,11 +127,15 @@ public class KillCommand extends ParameterizedCommand {
      *                kill the process of the specified PID.
      * @param cli
      *                is the current command line interface object
+     * @param cmd
+     * 		      is the current Input object
+     * @return 	      
+     * 		      true if proc(s) were killed, false if none were
      */
 	
-    boolean killProc(int pid, CLI cli) {
-	int procPID = 0;
-	Iterator foo = cli.targetset.getTaskData();
+    boolean killProc(int pid, CLI cli, Input cmd) {
+	int procPID = -1;
+	Iterator foo = userSet.getTaskData();
 	while (foo.hasNext()) {
 	    TaskData taskData = (TaskData) foo.next();
 	    Task task = taskData.getTask();
@@ -132,7 +145,6 @@ public class KillCommand extends ParameterizedCommand {
 		cli.addMessage("Killing process " + proc.getPid()
 			+ " that was created from " + proc.getExeFile().getSysRootedPath(),
 			Message.TYPE_NORMAL);
-		cli.outWriter.flush();
 		// Save the procs we are killing so we can re-load them later
 		saveProcs.put(new Integer(taskData.getParentID()), proc
 			.getExeFile().getSysRootedPath());
@@ -148,6 +160,57 @@ public class KillCommand extends ParameterizedCommand {
 	    return false;
 	return true;
     }
+    
+    /**
+     * killRunningProcs is called when the kill command is issued with no
+     *     parameters and no HPD notation in front of it.  This implies that
+     *     all of the processes currently running are to be killed and
+     *     reloaded.
+     *     
+     * @param cli
+     * 			is the current command line interface object
+     * @param cmd
+     * 			is the current command object
+     * @return
+     * 			true if indeed procs were killed, false if not
+     */
+    
+    boolean killRunningProcs(CLI cli, Input cmd) {
+	int tempId = -1;
+	int procId = 0;
+	boolean returnProc = false;
+    	Iterator foo = cli.runningProcs.iterator();
+    	if (!foo.hasNext()) {
+    	    cli.addMessage("No processes to kill", Message.TYPE_ERROR);
+    	    return false;
+    	}
+	while (foo.hasNext()) {
+	    Proc proc = (Proc) foo.next();
+	    Iterator bar = cli.targetset.getTaskData();
+	    while (bar.hasNext()) {
+		TaskData taskData = (TaskData) bar.next();
+		Proc taskProc = taskData.getTask().getProc();
+		procId = taskProc.getPid();
+		if (taskProc == proc && tempId != procId) {
+		    saveProcs.put(new Integer(taskData.getParentID()), proc
+				.getExeFile().getSysRootedPath());
+		    cli.addMessage("Killing process " + proc.getPid()
+			+ " that was created from " + proc.getExeFile().getSysRootedPath(),
+			Message.TYPE_NORMAL);
+		    proc.requestKill();
+		    tempId = procId;
+		    returnProc = true;
+		}
+	    }
+	}
+	if (returnProc) {
+	    synchronized (cli) {
+		// Clear the running procs set
+		cli.runningProcs.clear();
+	    }
+	}
+	return returnProc;
+    }
 
     int completer(CLI cli, Input input, int cursor, List completions) {
 	return CompletionFactory.completeFileName(cli, input, cursor,
diff --git a/frysk-core/frysk/hpd/TestKillCommand.java b/frysk-core/frysk/hpd/TestKillCommand.java
index 13ccecd..b6a9adb 100644
--- a/frysk-core/frysk/hpd/TestKillCommand.java
+++ b/frysk-core/frysk/hpd/TestKillCommand.java
@@ -195,6 +195,9 @@ java.lang.NullPointerException
 	e.close();
     }
     
+    /**
+     * Test entering a non-integer as a PID
+     */
     public void testKillError() {
 	SlaveOffspring newProc = SlaveOffspring.createDaemon();
 	int pid = newProc.getPid().intValue();
@@ -206,9 +209,29 @@ java.lang.NullPointerException
 	e.close();
     }
     
+    /**
+     * Test entering too many parameters
+     */
     public void testKillErrorTwo() {
 	e = new HpdTestbed();
 	e.sendCommandExpectPrompt("kill a b c", "Too many parameters.*");
     }
     
+    /**
+     * Test kill using HPD notation ([1.0] kill)
+     */
+    public void testKillHpd() {
+	e = new HpdTestbed();
+	e.sendCommandExpectPrompt("load " + Config.getPkgLibFile("funit-hello").getPath(),
+		"Loaded executable file.*");
+	e.sendCommandExpectPrompt("load " + Config.getPkgLibFile("funit-threads-looper").getPath(),
+	"Loaded executable file.*");
+	e.sendCommandExpectPrompt("run", "Attached to process.*");
+	try { Thread.sleep(500); } catch (Exception e) { }
+	e.sendCommandExpectPrompt("[1.0] kill", "Creating.*Killing process ([0-9]+).*funit-threads-looper.*" +
+		"\\[1\\.0\\] Loaded executable.*funit-threads-looper.*");
+	e.send("quit\n");
+	e.expect("Quitting\\.\\.\\..*");
+	e.close();
+    }
 }


hooks/post-receive
--
frysk system monitor/debugger


                 reply	other threads:[~2008-04-02 18:54 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=20080402185457.3969.qmail@sourceware.org \
    --to=rmoseley@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).