diff --git a/jdk/src/java.base/share/classes/jdk/internal/misc/Signal.java b/jdk/src/java.base/share/classes/jdk/internal/misc/Signal.java index 92adbbe295e..0002fdcde93 100644 --- a/jdk/src/java.base/share/classes/jdk/internal/misc/Signal.java +++ b/jdk/src/java.base/share/classes/jdk/internal/misc/Signal.java @@ -279,6 +279,11 @@ public final class Signal { public void handle(Signal sig) { throw new UnsupportedOperationException("invoking native signal handle not supported"); } + + public String toString() { + return this == SIG_DFL ? "SIG_DFL" : + (this == SIG_IGN ? "SIG_IGN" : super.toString()); + } } } diff --git a/jdk/test/sun/misc/SunMiscSignalTest.java b/jdk/test/sun/misc/SunMiscSignalTest.java index 4179b000b85..3dbab4f6cc0 100644 --- a/jdk/test/sun/misc/SunMiscSignalTest.java +++ b/jdk/test/sun/misc/SunMiscSignalTest.java @@ -180,6 +180,12 @@ public class SunMiscSignalTest { return newArray; } + // Return true if the signal is one of the shutdown signals known to the VM + private static boolean isShutdownSignal(Signal signal) { + String name = signal.getName(); + return name.equals("INT") || name.equals("HUP") || name.equals("TERM"); + } + /** * Quick verification of supported signals using sun.misc.Signal. * @@ -201,14 +207,24 @@ public class SunMiscSignalTest { Assert.assertEquals(signal.toString(), "SIG" + name, "toString() mismatch, "); try { - SignalHandler old = Signal.handle(signal, h); + orig = Signal.handle(signal, h); + printf("oldHandler: %s%n", orig); Assert.assertEquals(CanRegister.YES, register, "Unexpected handle succeeded " + name); try { Signal.raise(signal); Assert.assertEquals(CanRaise.YES, raise, "Unexpected raise success for " + name); Invoked inv = h.semaphore().tryAcquire(Utils.adjustTimeout(100L), TimeUnit.MILLISECONDS) ? Invoked.YES : Invoked.NO; - Assert.assertEquals(inv, invoked, "handler not invoked;"); + if (!isShutdownSignal(signal)) { + // Normal case + Assert.assertEquals(inv, invoked, "handler not invoked;"); + } else { + if (orig == SignalHandler.SIG_IGN) { + Assert.assertEquals(inv, Invoked.NO, "handler should not be invoked"); + } else { + Assert.assertEquals(inv, invoked, "handler not invoked;"); + } + } } catch (IllegalArgumentException uoe3) { Assert.assertNotEquals(CanRaise.YES, raise, "raise failed for " + name + ": " + uoe3.getMessage()); @@ -270,14 +286,22 @@ public class SunMiscSignalTest { } // Test expected exception when raising a signal when no handler defined - @Test(expectedExceptions = IllegalArgumentException.class) + @Test static void testRaiseNoConsumer() { Signal signal = new Signal("INT"); SignalHandler orig = null; try { - Signal.handle(signal, SignalHandler.SIG_DFL); + orig = Signal.handle(signal, SignalHandler.SIG_DFL); + printf("oldHandler: %s%n", orig); + if (orig == SignalHandler.SIG_IGN) { + // SIG_IGN for TERM means it cannot be handled + return; + } Signal.raise(signal); - } finally { + Assert.fail("Should have thrown IllegalArgumentException"); + } catch (IllegalArgumentException iae) { + printf("IAE message: %s%n", iae.getMessage()); + } finally { // Restore original signal handler if (orig != null && signal != null) { Signal.handle(signal, orig); @@ -296,7 +320,13 @@ public class SunMiscSignalTest { } Handler handler = new Handler(); Signal signal = new Signal("INT"); - Signal.handle(signal, handler); + SignalHandler orig = Signal.handle(signal, handler); + printf("oldHandler: %s%n", orig); + if (orig == SignalHandler.SIG_IGN) { + // SIG_IGN for INT means it cannot be handled + return; + } + Signal.raise(signal); boolean handled = handler.semaphore() .tryAcquire(Utils.adjustTimeout(100L), TimeUnit.MILLISECONDS); @@ -332,6 +362,10 @@ public class SunMiscSignalTest { Handler h1 = new Handler(); Handler h2 = new Handler(); SignalHandler orig = Signal.handle(signal, h1); + if (orig == SignalHandler.SIG_IGN) { + // SIG_IGN for TERM means it cannot be handled + return; + } try { SignalHandler prev = Signal.handle(signal, h2);