public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
From: cagney@sourceware.org
To: frysk-cvs@sourceware.org
Subject: [SCM]  master: Merge signal code into a single function.
Date: Fri, 18 Jan 2008 10:20:00 -0000	[thread overview]
Message-ID: <20080118102045.6392.qmail@sourceware.org> (raw)

The branch, master has been updated
       via  f8dfdde94877f7789016ec62cfe35a8ab1b202b4 (commit)
      from  ec719f9b7195762e4a4dea29e7b14932b2bfcf6a (commit)

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

- Log -----------------------------------------------------------------
commit f8dfdde94877f7789016ec62cfe35a8ab1b202b4
Author: Andrew Cagney <cagney@tortura.yyz.redhat.com>
Date:   Fri Jan 18 00:14:03 2008 -0500

    Merge signal code into a single function.
    
    frysk-core/frysk/proc/live/ChangeLog
    2008-01-18  Andrew Cagney  <cagney@redhat.com>
    
    	* TestProcStopped.java (testStoppedSignal()): New.
    	* LinuxPtraceTaskState.java (transitionToAttached): Merge signal code.
    
    frysk-sys/frysk/sys/ChangeLog
    2008-01-17  Andrew Cagney  <cagney@redhat.com>
    
    	* Signal.java (tkill(int,int)): Make public.
    	(valueOf(int)): Always return a Signal.

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

Summary of changes:
 frysk-core/frysk/proc/live/ChangeLog               |    3 +
 .../frysk/proc/live/LinuxPtraceTaskState.java      |   47 +++++++++++--------
 frysk-core/frysk/proc/live/TestProcStopped.java    |   25 ++++++++++
 frysk-sys/frysk/sys/ChangeLog                      |    5 ++
 frysk-sys/frysk/sys/Signal.java                    |    6 ++-
 5 files changed, 64 insertions(+), 22 deletions(-)

First 500 lines of diff:
diff --git a/frysk-core/frysk/proc/live/ChangeLog b/frysk-core/frysk/proc/live/ChangeLog
index eeaf05f..51bffd4 100644
--- a/frysk-core/frysk/proc/live/ChangeLog
+++ b/frysk-core/frysk/proc/live/ChangeLog
@@ -1,5 +1,8 @@
 2008-01-18  Andrew Cagney  <cagney@redhat.com>
 
+	* TestProcStopped.java (testStoppedSignal()): New.
+	* LinuxPtraceTaskState.java (transitionToAttached): Merge signal code.
+
 	* LinuxPtraceProcState.java: Move attach SIGCONT from here ...
 	* LinuxPtraceTaskState.java: ... to here; wait for SIGCONT.
 	
diff --git a/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java b/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java
index 09985ac..c629cc5 100644
--- a/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java
+++ b/frysk-core/frysk/proc/live/LinuxPtraceTaskState.java
@@ -39,6 +39,7 @@
 
 package frysk.proc.live;
 
+import frysk.sys.SignalSet;
 import frysk.sys.proc.Status;
 import frysk.proc.TaskObserver;
 import frysk.proc.Observer;
@@ -213,35 +214,41 @@ class LinuxPtraceTaskState extends State {
 	    super("attaching");
 	    this.waitForSIGCONT = waitForSIGCONT;
 	}
+	private SignalSet sigset = new SignalSet();
 	private LinuxPtraceTaskState transitionToAttached(LinuxPtraceTask task,
 							  int signal) {
-	    ((LinuxPtraceProc)task.getProc()).performTaskAttachCompleted (task);
-	    return new Attached.WaitForContinueOrUnblock (signal);
-	}
-	LinuxPtraceTaskState handleStoppedEvent(LinuxPtraceTask task) {
-	    logger.log (Level.FINE, "{0} handleStoppedEvent\n", task); 
-	    if (waitForSIGCONT) {
-		logger.log(Level.FINE, "{0} wait for CONT behind STOP\n",
-			   task);
-		// There's a SIGCONT behind this SIGSTOP; wait for
-		// that too.
+	    if (waitForSIGCONT && !Signal.CONT.equals(signal)) {
+		// Save the signal and then re-wait for, hopefully,
+		// the SIGCONT behind it.
+		sigset.add(Signal.valueOf(signal));
+		task.sendContinue(0);
 		return this;
 	    } else {
-		return transitionToAttached(task, 0);
+		if (waitForSIGCONT) {
+		    // Send the signals back
+		    Signal[] sigs = sigset.toArray();
+		    for (int i = 0; i < sigs.length; i++) {
+			logger.log(Level.FINE, "{0} re-sending {1}\n",
+				   new Object[] { this, sigs[i] });
+			sigs[i].tkill(task.getTid());
+		    }
+		    signal = Signal.STOP.intValue();
+		} else if (Signal.STOP.equals(signal)) {
+		    // toss the stop.
+		    signal = 0;
+		}
+		((LinuxPtraceProc)task.getProc()).performTaskAttachCompleted (task);
+		return new Attached.WaitForContinueOrUnblock (signal);
 	    }
 	}
+	LinuxPtraceTaskState handleStoppedEvent(LinuxPtraceTask task) {
+	    logger.log (Level.FINE, "{0} handleStoppedEvent\n", task); 
+	    return transitionToAttached(task, Signal.STOP.intValue());
+	}
 	LinuxPtraceTaskState handleSignaledEvent(LinuxPtraceTask task,
 						 int signal) {
 	    logger.log (Level.FINE, "{0} handleSignaledEvent, signal: {1}\n ", new Object[] {task,new Integer(signal)}); 
-	    if (waitForSIGCONT && Signal.CONT.equals(signal)) {
-		logger.log(Level.FINE, "{0} woken from slumber\n", task);
-		// Its the cont signal sent to this task to wake it up
-		// from it's slumber; turn it back into a SIGSTOP and
-		// continue.
-		return transitionToAttached (task, Signal.STOP.intValue());
-	    } else {
-		return transitionToAttached (task, signal);
-	    }
+	    return transitionToAttached(task, signal);
 	}
 	LinuxPtraceTaskState handleTrappedEvent(LinuxPtraceTask task) {
 	    logger.log (Level.FINE, "{0} handleTrappedEvent\n", task); 
diff --git a/frysk-core/frysk/proc/live/TestProcStopped.java b/frysk-core/frysk/proc/live/TestProcStopped.java
index 16a193b..773cac2 100644
--- a/frysk-core/frysk/proc/live/TestProcStopped.java
+++ b/frysk-core/frysk/proc/live/TestProcStopped.java
@@ -40,7 +40,11 @@
 
 package frysk.proc.live;
 
+import frysk.sys.Signal;
+import frysk.testbed.TaskObserverBase;
+import frysk.proc.TaskObserver;
 import frysk.proc.Manager;
+import frysk.proc.Action;
 import frysk.event.RequestStopEvent;
 import frysk.testbed.TestLib;
 import frysk.testbed.SlaveOffspring;
@@ -156,4 +160,25 @@ public class TestProcStopped extends TestLib {
 	public void taskAddFailed(Object task, Throwable w) {
 	}
     }
+
+    public void testStoppedSignal() {
+	SlaveOffspring ackProc = SlaveOffspring.createDaemon();
+	Task task = ackProc.findTaskUsingRefresh(true);
+	ackProc.assertSendStop();
+	// Make a termination signal pending; if that slips through
+	// the task dies and the test fails.
+	ackProc.signal(Signal.TERM);
+	class Signaled extends TaskObserverBase implements TaskObserver.Signaled {
+	    public void addedTo(Object o) {
+		Signal.CONT.tkill(((Task)o).getTid());
+	    }
+	    public Action updateSignaled(Task task, int signal) {
+		assertTrue("signal", Signal.TERM.equals(signal));
+		Manager.eventLoop.requestStop();
+		return Action.CONTINUE;
+	    }
+	}
+	task.requestAddSignaledObserver(new Signaled());
+	assertRunUntilStop("looking for sigterm");
+    }
 }
diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog
index 453ffb8..53c85c1 100644
--- a/frysk-sys/frysk/sys/ChangeLog
+++ b/frysk-sys/frysk/sys/ChangeLog
@@ -1,3 +1,8 @@
+2008-01-17  Andrew Cagney  <cagney@redhat.com>
+
+	* Signal.java (tkill(int,int)): Make public.
+	(valueOf(int)): Always return a Signal.
+
 2007-12-05  Andrew Cagney  <cagney@redhat.com>
 
 	* SyscallNum.java-sh: Delete.
diff --git a/frysk-sys/frysk/sys/Signal.java b/frysk-sys/frysk/sys/Signal.java
index 0010285..f45e755 100644
--- a/frysk-sys/frysk/sys/Signal.java
+++ b/frysk-sys/frysk/sys/Signal.java
@@ -160,7 +160,7 @@ public class Signal implements Comparable {
     public final void tkill(int lwp) {
 	tkill(lwp, sig);
     }
-    private static native void tkill(int lwp, int signum);
+    public static native void tkill(int lwp, int signum);
 
     /**
      * Momentarialy sets the signal handler for Sig to SIGIGN so that
@@ -172,6 +172,8 @@ public class Signal implements Comparable {
     private static native void drain(int signum);
 
     public static Signal valueOf(int signum) {
+	if (signum < 0)
+	    throw new NullPointerException("invalid signal: " + signum);
 	if (ALRM.equals(signum)) return ALRM;
 	if (BUS.equals(signum)) return BUS;
 	if (CONT.equals(signum)) return CONT;
@@ -193,6 +195,6 @@ public class Signal implements Comparable {
 	if (USR2.equals(signum)) return USR2;
 	if (URG.equals(signum)) return URG;
 	if (WINCH.equals(signum)) return WINCH;
-	throw new NullPointerException("unknown signal: " + signum);
+	return new Signal(signum, "???");
     }
 }


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


                 reply	other threads:[~2008-01-18 10:20 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=20080118102045.6392.qmail@sourceware.org \
    --to=cagney@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).