From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 6432 invoked by alias); 18 Jan 2008 10:20:46 -0000 Received: (qmail 6407 invoked by uid 367); 18 Jan 2008 10:20:46 -0000 Date: Fri, 18 Jan 2008 10:20:00 -0000 Message-ID: <20080118102045.6392.qmail@sourceware.org> From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Merge signal code into a single function. X-Git-Refname: refs/heads/master X-Git-Reftype: branch X-Git-Oldrev: ec719f9b7195762e4a4dea29e7b14932b2bfcf6a X-Git-Newrev: f8dfdde94877f7789016ec62cfe35a8ab1b202b4 Mailing-List: contact frysk-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Post: List-Help: , Sender: frysk-cvs-owner@sourceware.org Reply-To: frysk@sourceware.org X-SW-Source: 2008-q1/txt/msg00093.txt.bz2 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 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 * TestProcStopped.java (testStoppedSignal()): New. * LinuxPtraceTaskState.java (transitionToAttached): Merge signal code. frysk-sys/frysk/sys/ChangeLog 2008-01-17 Andrew Cagney * 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 + * 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 + + * Signal.java (tkill(int,int)): Make public. + (valueOf(int)): Always return a Signal. + 2007-12-05 Andrew Cagney * 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