RFR 9: 8087286 Need a way to handle control-C and possibly some other signals

Gerard Ziemski gerard.ziemski at oracle.com
Mon Feb 1 20:17:33 UTC 2016


> On Feb 1, 2016, at 1:25 PM, Roger Riggs <Roger.Riggs at Oracle.com> wrote:
> 
> Hi Gerard,
> 
> On 2/1/2016 1:58 PM, Gerard Ziemski wrote:
>> hi Roger,
>> 
>> I love that we are adding this Signal object. I have several questions, but please do not take them as criticism, I’m just seeking clarification and providing feedback:
>> 
>> 
>> #1 Re: "Consumers for signals that are unknown or reserved by the Java implementation can not be registered.”
>> 
>> - Why don't we want to allow unknown signals? This will make us have to update our implementation if we want to support new or platform specific signals in the future. 
>> 
>> 
> The statement was aimed primarily at the Java Signal API; there is quite a bit of detail
> oriented code in the VM to initialize and handle signals. Most of it is agnostic to the signal number
> and would just pass it through.  If a signal is not supported by the OS (think SIGHUP on Windows)
> that should bubble up as being not available.  The 'cannot be registered' might be re-worded to say
> it throws an exception, as the method javadoc does.
> 
> The set of signals is a pretty slow moving target so updating implementations should not be a big issue.

Right, but you don’t actually answer why we don’t allow unknown (to us at the moment) signals. Why have a limit in place, unless there is a good reason?


>> #2 Re: "java.util.Signal.raise()”
>> 
>> - That API raises the signal in the current process, but what about sending a signal to another process for interprocess communication?
>> 
> I left that for a separate issue but would be a straight-forward addition to java.lang.ProcessHandle/Process.

The proposed Signal “feels” incomplete to me without this, though I understand that it meets the original goal. I would love to see at the very least a followup enhancement filed to address this.


>> 
>> 
>> #3 Re: "Signal.of("SIGINT”)”
>> 
>> - Is this a factory method that returns the same object if called more than once?
>> 
> Maybe, maybe not, why would it matter.  
> The real state is encapsulate is in the SignalImpl instances which are singletons per signal.
> I was trying to keep the Signal object stateless to allow it to be a value-type and lighter weight
> some day.

If it doesn’t matter, the why not just use constructor “Signal signal = new Signal(“SIGINT”)” ?


>> 
>> 
>> #4 Re: "public boolean unregister(Consumer<Signal> consumer)”
>> 
>> - Why is this API returning a value? Wouldn’t having a Signal API like “public Consumer<Signal> getConsumer()” be more flexible?
>> 
> 
> The return value reports whether it unregistered the specific consumer.  If it was not
> the concurrently registered the caller might want to know it was currently registered.
> I expect the return would mostly be ignored. 
> 
> The getConsumer()/unregister consumer pair would be vulnerable to race conditions
> and require some external locking to get predictable behavior.  

Isn’t it also true for register/unregister?

> 
>> 
>> 
>> #5 Re: "public void registerDefault(Consumer<Signal> consumer)”
>> 
>> - Do we really need this API? Can’t the same be achieved with the plain vanilla “public void register(Consumer<Signal> consumer)” I guess I don’t really see what makes this API special.
>> 
> The java runtime currently registers termination handler to cleanly shutdown if someone types control-c.
> It is useful to be able to remove the application provided signal handler and be able to restore the
> system defaults.
> This API could be hidden as a pure implementation detail.  So unregistering the signal handler
> would always restore the appropriate system ones.

I was hoping that behavior is all that’s needed.


> 
> Thanks for the review and comments, Roger

Thanks for all the work!


> 
>> 
>> 
>> cheers
>> 
>> 
>>> On Feb 1, 2016, at 10:02 AM, Roger Riggs <roger.riggs at oracle.com>
>>>  wrote:
>>> 
>>> Please review an API addition to handle signals such as SIGINT, SIGHUP, and SIGTERM.
>>> This JEP 260 motivated alternative to sun.misc.Signal supports the use case for
>>> interactive applications that need to handle Control-C and other signals.
>>> 
>>> The new java.util.Signal class provides a settable primary signal handler and a default
>>> signal handler.  The primary signal handler can be unregistered and handling is restored
>>> to the default signal handler.  System initialization registers default signal handlers
>>> to terminate on SIGINT, SIGHUP, and SIGTERM.  Use of the Signal API requires
>>> a permission if a SecurityManager is set.
>>> 
>>> The sun.misc.Signal implementation is modified to be layered on a common
>>> thread and dispatch mechanism. The VM handling of native signals is not affected.
>>> The command option to reduce signal use by the runtime with -Xrs is unmodified.
>>> 
>>> The changes to hotspot are minimal to rename the hardcoded callback to the Java
>>> Signal dispatcher.
>>> 
>>> Please review and comment on the API and implementation.
>>> 
>>> javadoc:
>>>  
>>> http://cr.openjdk.java.net/~rriggs/signal-doc/
>>> 
>>> 
>>> Webrev:
>>> jdk:  
>>> http://cr.openjdk.java.net/~rriggs/webrev-signal-8087286/
>>> 
>>> hotspot: 
>>> http://cr.openjdk.java.net/~rriggs/webrev-hs-signal-8087286/
>>> 
>>> 
>>> Issue:
>>>   
>>> https://bugs.openjdk.java.net/browse/JDK-8087286
>>> 
>>> 
>>> JEP 260:
>>>  
>>> https://bugs.openjdk.java.net/browse/JDK-8132928
>>> 
>>> 
>>> Thanks, Roger
>>> 
>>> 
>>> 
> 



More information about the hotspot-runtime-dev mailing list