public inbox for frysk-cvs@sourceware.org help / color / mirror / Atom feed
From: cagney@sourceware.org To: frysk-cvs@sourceware.org Subject: [SCM] master: Use an array for known signals. Date: Tue, 22 Jan 2008 03:08:00 -0000 [thread overview] Message-ID: <20080122030852.3729.qmail@sourceware.org> (raw) The branch, master has been updated via 137e1fd0edb8b159a08f9d62d681181eacc80a9b (commit) from 01e4144f085eb072e2210b4a5cb6a0e8c8d12fd6 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit 137e1fd0edb8b159a08f9d62d681181eacc80a9b Author: Andrew Cagney <cagney@redhat.com> Date: Mon Jan 21 22:08:25 2008 -0500 Use an array for known signals. frysk-sys/frysk/sys/ChangeLog 2008-01-21 Andrew Cagney <cagney@redhat.com> * cni/Signal.cxx-sh (frysk): Update. * Signal.java-sh (signals): Use an array. (nsig(), rtMin(), rtMax()): New. * TestSignal.java (testUnknown()): New. ----------------------------------------------------------------------- Summary of changes: frysk-sys/frysk/sys/ChangeLog | 7 +++ frysk-sys/frysk/sys/Signal.java-sh | 78 +++++++++++++++++++++----------- frysk-sys/frysk/sys/TestSignal.java | 16 +++++-- frysk-sys/frysk/sys/cni/Signal.cxx-sh | 15 ++++++ 4 files changed, 84 insertions(+), 32 deletions(-) First 500 lines of diff: diff --git a/frysk-sys/frysk/sys/ChangeLog b/frysk-sys/frysk/sys/ChangeLog index 8275d0a..ea84c2d 100644 --- a/frysk-sys/frysk/sys/ChangeLog +++ b/frysk-sys/frysk/sys/ChangeLog @@ -1,5 +1,12 @@ 2008-01-21 Andrew Cagney <cagney@redhat.com> + * cni/Signal.cxx-sh (frysk): Update. + * Signal.java-sh (signals): Use an array for known signals. + (unknownSignals): New. + (rtSignals): New. + (nsig(), rtMin(), rtMax()): New. + * TestSignal.java (testUnknown()): New. + * TestSignal.java: New file. * cni/Signal.cxx: Replace this with ... * cni/Signal.cxx-sh (frysk): ... this. New file. diff --git a/frysk-sys/frysk/sys/Signal.java-sh b/frysk-sys/frysk/sys/Signal.java-sh index b1f337a..0f433a9 100644 --- a/frysk-sys/frysk/sys/Signal.java-sh +++ b/frysk-sys/frysk/sys/Signal.java-sh @@ -41,6 +41,7 @@ cat <<EOF EOF cat <<EOF + package frysk.sys; import java.util.Map; @@ -142,50 +143,68 @@ public class Signal implements Comparable { private static native void drain(int signum); /** + * Given an integer, return the corresponding signal. + * If the signal is unknown, make one up. + */ + public static Signal valueOf(int signum) { + if (signum < 0) { + throw new NullPointerException("invalid signal: " + signum); + } else if (signum < signals.length) { + Signal signal = signals[signum]; + if (signal == null) + throw new NullPointerException("invalid signal: " + signum); + else + return signal; + } else if (signum >= rtMin() && signum <= rtMax()) { + return rtSignals[signum - rtMin()]; + } else { + // Fudge up a signal; beter than throwing an exception. + synchronized (unknownSignals) { + scratchSignal.signum = signum; + Signal signal = (Signal)unknownSignals.get(scratchSignal); + if (signal != null) + return signal; + signal = new Signal(signum, "SIG" + signum); + unknownSignals.put(signal, signal); + return signal; + } + } + } + /** * A scratch value for searching the signal table. */ private static class ScratchSignal extends Signal { ScratchSignal() { - super(0, "<scratch signal>"); - } + super(0, "<scratch signal>"); + } int signum; public int hashCode() { - return signum; + return signum; } } + private static final Map unknownSignals = new WeakHashMap(); private static final ScratchSignal scratchSignal = new ScratchSignal(); + /** - * A map for looking up known signals; weak so that scratch + * Tables for looking up known signals; weak so that scratch * signals do not accumulate. */ - private static final Map signals = new WeakHashMap(); - /** - * Given an integer, return (or create) the corresponding signal. - */ - public static Signal valueOf(int signum) { - if (signum < 0) - throw new NullPointerException("invalid signal: " + signum); - synchronized (scratchSignal) { - scratchSignal.signum = signum; - Signal signal = (Signal)signals.get(scratchSignal); - if (signal == null) - return signalFactory(signum, "SIG" + signum); - else - return signal; - } - } - + private static native int nsig(); + private static native int rtMin(); + private static native int rtMax(); + private static final Signal[] signals = new Signal[nsig()]; + private static final Signal[] rtSignals = new Signal[rtMax()-rtMin()+1]; /** * Create a signal, also enter the signal into the signals table * for later retrieval. */ private static Signal signalFactory(int sig, String name) { - if (sig >= 0) { - Signal signal = new Signal(sig, name); - signals.put(signal, signal); - return signal; - } else - return null; // Return a known value? + if (sig < 0) + return null; + Signal signal = new Signal(sig, name); + if (signals[sig] == null) + signals[sig] = signal; + return signal; } public static final Signal NONE = signalFactory(0, "SIGNONE"); @@ -202,5 +221,10 @@ do done cat <<EOF + static { + for (int sig = rtMin(); sig <= rtMax(); sig++) { + rtSignals[sig - rtMin()] = new Signal(sig, "SIGRT" + sig); + } + } } EOF diff --git a/frysk-sys/frysk/sys/TestSignal.java b/frysk-sys/frysk/sys/TestSignal.java index c0fc79c..5bc137f 100644 --- a/frysk-sys/frysk/sys/TestSignal.java +++ b/frysk-sys/frysk/sys/TestSignal.java @@ -48,21 +48,27 @@ import frysk.junit.TestCase; public class TestSignal extends TestCase { - private void check(int val, Signal sig) { - assertEquals("value", val, sig.intValue()); + private void check(int val, Signal sig, String name) { + assertEquals("intValue", val, sig.intValue()); + assertEquals("toPrint", name, sig.toPrint()); assertSame("identity", sig, Signal.valueOf(val)); } public void testNone() { - check(0, Signal.NONE); + check(0, Signal.NONE, "SIGNONE"); } public void testKill() { - check(9, Signal.KILL); + check(9, Signal.KILL, "SIGKILL"); } public void testTerm() { - check(15, Signal.TERM); + check(15, Signal.TERM, "SIGTERM"); } + public void testUnknown() { + // Something large, that will create an unknown signal. + final int sig = 100000000; + check(sig, Signal.valueOf(sig), "SIG" + sig); + } } diff --git a/frysk-sys/frysk/sys/cni/Signal.cxx-sh b/frysk-sys/frysk/sys/cni/Signal.cxx-sh index 3b44859..4f1a900 100644 --- a/frysk-sys/frysk/sys/cni/Signal.cxx-sh +++ b/frysk-sys/frysk/sys/cni/Signal.cxx-sh @@ -89,6 +89,21 @@ frysk::sys::Signal::drain (jint signum) { // sigismember (&set, signum) ? "YES" : "NO"); } +jint +frysk::sys::Signal::nsig() { + return NSIG; +} + +jint +frysk::sys::Signal::rtMin() { + return SIGRTMIN; +} + +jint +frysk::sys::Signal::rtMax() { + return SIGRTMAX; +} + EOF for sig in \ hooks/post-receive -- frysk system monitor/debugger
reply other threads:[~2008-01-22 3:08 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=20080122030852.3729.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).