Hi Peter,
I'll take a deeper look tomorrow, I spent some time today updating my
prototype with the suggestions.
And there is more to iterate over tomorrow.
Updated webrev:
http://cr.openjdk.java.net/~rriggs/webrev-signal-8087286/
...
On 2/2/2016 3:58 PM, Peter Levart wrote:
On 02/02/2016 05:45 PM, Roger Riggs wrote:
Hi Peter,
On 2/2/2016 11:14 AM, Peter Levart wrote:
Hi Roger,
On 02/02/2016 04:16 PM, Roger Riggs wrote:
Hi Peter,
On 2/2/2016 6:44 AM, Peter Levart wrote:
...
Also if this is to become public API, There's a chance users would
want to add a handler to the chain of existing handlers or
override them. So what about an API that allows
registering/unregistering a default (non-native) handler and other
handlers above it in a uniform way, like:
The problem with chaining, as in the current API, is that there is
no way to know what the next
handler in the chain will do. If it is the default one for INT,
TERM, HUP, it will call Shutdown and exit.
So without extra information and cooperation chaining is risky.
If the handler knows something about the other actors in the
environment, it can coordinate with them directly.
For the use cases that have been raised for existing use of
sun.misc.Signal, they are simple interactive
environments that want to give the appearance of being able to
interrupt using control-c.
I've been aiming for the simplest API that would support the
current use cases.
I noticed that sun.misc.Signal[Handler] is a critical API according
to JEP 260, so it can't be removed in JDK9 yet. I wanted to see if
sun.misc.Signal[Handler] could be modified to use java.util.Signal
directly while making java.util.Signal support chaining and
restoring of previous handler on deregister. Here's what it looks
like in code:
http://cr.openjdk.java.net/~plevart/jdk9-dev/Signal/webrev.01/
But if chaining is not desired, then at least restoring of previous
handler could be implemented in a uniform way and for arbitrary
registration depth (no need for register/registerDefault distinction).
A stack based model can work but still needs backup handlers for when
all the specified handlers to unregistered.
I'm ok with submerging registerDefault into the implementation used
only by the system Termination class.
I don't think the use cases call for a stack and it makes the API
more complex for register/unregister.
I'd rather see a good simple j.u.Signal API that meets the
requirements without considering how to
support the legacy s.m.Signal, if it needs a bit of cruft to support
it for a while that's ok.
Someday we will want to rip out all that code and have a simple API.
Here's another attempt that removes the possibility to chain handlers,
but keeps a stack of previous handlers so that unregistration returns
to exactly the same state as before registration. j.l.System can
therefore use plain register() method for the default handlers and
nesting registrations/unregistrations are possible:
http://cr.openjdk.java.net/~plevart/jdk9-dev/Signal/webrev.02/
The API is practically the same as your's with the exception of the
specification of unregister() which documents the restoration of
previous state and does not mention any "default" handlers.
The implementation is much simpler now (counting the lines of
NativeSignal interface + j.u.Singnal class vs. your SignalImpl +
j.u.Signal results in 392 vs. 513)
It looks interesting, though a different style implementation.
And I'd rather use mundane synchronization primitives that keep the code
easier to read, even if a bit less optimized.
Thanks, Roger
What do you think?
Regards, Peter