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