Skip to content

Commit ac8ba89

Browse files
authored
Add support for HUP, USR1, USR2 signals (#86)
Motivation: Adding support for capturing HUP too in addition to USR1/USR2. Modifications: * Added HUP signal, added descriptive strings for new signals. * Optionally allow to let signal handler run multiple times, useful for USR signals Result: HUP and USR signals available.
1 parent 91c9f1e commit ac8ba89

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

Sources/Lifecycle/Lifecycle.swift

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ public struct ServiceLifecycle {
158158
let signalSource = ServiceLifecycle.trap(signal: signal, handler: { signal in
159159
self.log("intercepted signal: \(signal)")
160160
self.shutdown()
161-
})
161+
}, cancelAfterTrap: true)
162162
self.underlying.shutdownGroup.notify(queue: .global()) {
163163
signalSource.cancel()
164164
}
@@ -176,12 +176,16 @@ extension ServiceLifecycle {
176176
/// - parameters:
177177
/// - signal: The signal to trap.
178178
/// - handler: closure to invoke when the signal is captured.
179+
/// - on: DispatchQueue to run the signal handler on (default global dispatch queue)
180+
/// - cancelAfterTrap: Defaults to false, which means the signal handler can be run multiple times. If true, the DispatchSignalSource will be cancelled after being trapped once.
179181
/// - returns: a `DispatchSourceSignal` for the given trap. The source must be cancelled by the caller.
180-
public static func trap(signal sig: Signal, handler: @escaping (Signal) -> Void, on queue: DispatchQueue = .global()) -> DispatchSourceSignal {
182+
public static func trap(signal sig: Signal, handler: @escaping (Signal) -> Void, on queue: DispatchQueue = .global(), cancelAfterTrap: Bool = false) -> DispatchSourceSignal {
181183
let signalSource = DispatchSource.makeSignalSource(signal: sig.rawValue, queue: queue)
182184
signal(sig.rawValue, SIG_IGN)
183185
signalSource.setEventHandler(handler: {
184-
signalSource.cancel()
186+
if cancelAfterTrap {
187+
signalSource.cancel()
188+
}
185189
handler(sig)
186190
})
187191
signalSource.resume()
@@ -194,6 +198,10 @@ extension ServiceLifecycle {
194198

195199
public static let TERM = Signal(rawValue: SIGTERM)
196200
public static let INT = Signal(rawValue: SIGINT)
201+
public static let USR1 = Signal(rawValue: SIGUSR1)
202+
public static let USR2 = Signal(rawValue: SIGUSR2)
203+
public static let HUP = Signal(rawValue: SIGHUP)
204+
197205
// for testing
198206
internal static let ALRM = Signal(rawValue: SIGALRM)
199207

@@ -203,6 +211,9 @@ extension ServiceLifecycle {
203211
case Signal.TERM: result += "TERM, "
204212
case Signal.INT: result += "INT, "
205213
case Signal.ALRM: result += "ALRM, "
214+
case Signal.USR1: result += "USR1, "
215+
case Signal.USR2: result += "USR2, "
216+
case Signal.HUP: result += "HUP, "
206217
default: () // ok to ignore
207218
}
208219
result += "rawValue: \(self.rawValue))"

0 commit comments

Comments
 (0)