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: linkBe 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).