This is the mail archive of the frysk-cvs@sources.redhat.com mailing list for the frysk project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[SCM] master: Merge signal code into a single function.


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]