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: Use an array for known signals.


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


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