Refactor Signal for graalvm

The graalvm issues warnings about the objects defined in
Signal.register, so I made them top level private classes instead.
This commit is contained in:
Ethan Atkins 2020-06-21 16:58:23 -07:00
parent 7b05ef5918
commit 52d19d8f0c
1 changed files with 14 additions and 11 deletions

View File

@ -7,6 +7,8 @@
package sbt.internal.util package sbt.internal.util
import sun.misc.{ Signal, SignalHandler }
object Signals { object Signals {
val CONT = "CONT" val CONT = "CONT"
val INT = "INT" val INT = "INT"
@ -36,24 +38,14 @@ object Signals {
def register(handler: () => Unit, signal: String = INT): Registration = def register(handler: () => Unit, signal: String = INT): Registration =
// TODO - Maybe we can just ignore things if not is-supported. // TODO - Maybe we can just ignore things if not is-supported.
if (supported(signal)) { if (supported(signal)) {
import sun.misc.{ Signal, SignalHandler }
val intSignal = new Signal(signal) val intSignal = new Signal(signal)
val newHandler = new SignalHandler { val newHandler = new SignalHandler {
def handle(sig: Signal): Unit = { handler() } def handle(sig: Signal): Unit = { handler() }
} }
val oldHandler = Signal.handle(intSignal, newHandler) val oldHandler = Signal.handle(intSignal, newHandler)
object unregisterNewHandler extends Registration { new UnregisterNewHandler(intSignal, oldHandler)
override def remove(): Unit = {
Signal.handle(intSignal, oldHandler)
()
}
}
unregisterNewHandler
} else { } else {
// TODO - Maybe we should just throw an exception if we don't support signals... // TODO - Maybe we should just throw an exception if we don't support signals...
object NullUnregisterNewHandler extends Registration {
override def remove(): Unit = ()
}
NullUnregisterNewHandler NullUnregisterNewHandler
} }
@ -64,6 +56,17 @@ object Signals {
} catch { case _: LinkageError => false } } catch { case _: LinkageError => false }
} }
private class UnregisterNewHandler(intSignal: Signal, oldHandler: SignalHandler)
extends Signals.Registration {
override def remove(): Unit = {
Signal.handle(intSignal, oldHandler)
()
}
}
private object NullUnregisterNewHandler extends Signals.Registration {
override def remove(): Unit = ()
}
// Must only be referenced using a // Must only be referenced using a
// try { } catch { case _: LinkageError => ... } // try { } catch { case _: LinkageError => ... }
// block to // block to