Skip to content

Commit cb92f51

Browse files
committed
Fix the trivially fixed concurrency warnings and errors
1 parent 919e0ff commit cb92f51

File tree

12 files changed

+124
-75
lines changed

12 files changed

+124
-75
lines changed

Package.resolved

Lines changed: 57 additions & 31 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Package.swift

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,27 @@ let package = Package(
1818
dependencies: [
1919
.package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.0.0"),
2020
.package(url: "https://github.com/apple/swift-log.git", from: "1.4.2"),
21+
.package(url: "https://github.com/Frizlab/GlobalConfModule.git", from: "0.4.0"),
2122
.package(url: "https://github.com/xcode-actions/clt-logger.git", from: "1.0.0-beta.4"),
2223
],
2324
targets: [
2425
.target(name: "SignalHandling", dependencies: [
25-
.product(name: "Logging", package: "swift-log"),
26+
.product(name: "Logging", package: "swift-log"),
27+
.product(name: "GlobalConfModule", package: "GlobalConfModule"),
2628
], swiftSettings: swiftSettings),
2729

2830
.executableTarget(name: "signal-handling-tests-helper", dependencies: [
29-
.product(name: "ArgumentParser", package: "swift-argument-parser"),
30-
.product(name: "CLTLogger", package: "clt-logger"),
31-
.product(name: "Logging", package: "swift-log"),
31+
.product(name: "ArgumentParser", package: "swift-argument-parser"),
32+
.product(name: "CLTLogger", package: "clt-logger"),
33+
.product(name: "GlobalConfModule", package: "GlobalConfModule"),
34+
.product(name: "Logging", package: "swift-log"),
3235
.target(name: "SignalHandling"),
3336
], swiftSettings: swiftSettings),
3437
.testTarget(name: "SignalHandlingTests", dependencies: [
3538
.target(name: "signal-handling-tests-helper"),
36-
.product(name: "CLTLogger", package: "clt-logger"),
37-
.product(name: "Logging", package: "swift-log"),
39+
.product(name: "CLTLogger", package: "clt-logger"),
40+
.product(name: "GlobalConfModule", package: "GlobalConfModule"),
41+
.product(name: "Logging", package: "swift-log"),
3842
], swiftSettings: swiftSettings),
3943
]
4044
)
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import Foundation
2+
3+
import GlobalConfModule
4+
import Logging
5+
6+
7+
8+
public extension ConfKeys {
9+
/* SignalHandling conf namespace declaration. */
10+
struct SignalHandling {}
11+
var signalHandling: SignalHandling {SignalHandling()}
12+
}
13+
14+
15+
extension ConfKeys.SignalHandling {
16+
17+
#declareConfKey("logger", Logging.Logger?.self, defaultValue: .init(label: "com.xcode-actions.signal-handling"))
18+
19+
}
20+
21+
22+
extension Conf {
23+
24+
#declareConfAccessor(\.signalHandling.logger, Logging.Logger?.self)
25+
26+
}

Sources/SignalHandling/CStructsInSwift/Sigaction.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,11 @@ import SystemPackage
55
import System
66
#endif
77

8+
import GlobalConfModule
89

910

10-
public struct Sigaction : Equatable, RawRepresentable {
11+
12+
public struct Sigaction : Equatable, RawRepresentable, Sendable {
1113

1214
public static let ignoreAction = Sigaction(handler: .ignoreHandler)
1315
public static let defaultAction = Sigaction(handler: .defaultHandler)
@@ -66,7 +68,7 @@ public struct Sigaction : Equatable, RawRepresentable {
6668
#endif
6769

6870
if !isValid {
69-
SignalHandlingConfig.logger?.warning("Initialized an invalid Sigaction.")
71+
Conf.logger?.warning("Initialized an invalid Sigaction.")
7072
}
7173
}
7274

@@ -80,7 +82,7 @@ public struct Sigaction : Equatable, RawRepresentable {
8082

8183
public var rawValue: sigaction {
8284
if !isValid {
83-
SignalHandlingConfig.logger?.warning("Getting sigaction from an invalid Sigaction.")
85+
Conf.logger?.warning("Getting sigaction from an invalid Sigaction.")
8486
}
8587

8688
var ret = sigaction()

Sources/SignalHandling/CStructsInSwift/SigactionFlag.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import Foundation
33

44

55
/** Flag list is from `sigaction(2)` on macOS. */
6-
public struct SigactionFlags : OptionSet {
6+
public struct SigactionFlags : OptionSet, Sendable {
77

88
/**
99
If this bit is set when installing a catching function for the `SIGCHLD` signal,

Sources/SignalHandling/CStructsInSwift/SigactionHandler.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import Foundation
66
A `sigaction` handler.
77

88
Two `SigactionHandler`s are equal iif their cases are equal and the handler they contain point to the same address (if applicable). */
9-
public enum SigactionHandler : Equatable {
9+
public enum SigactionHandler : Equatable, Sendable {
1010

1111
/* The ignore and default handlers are special cases represented respectively by the `SIG_IGN` and `SIG_DFL` values in C.
1212
* We choose the represent them using a special case in the enum.

Sources/SignalHandling/CStructsInSwift/Signal.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import Foundation
44

55
/* Could be an enum?
66
* I’d say no to be able to represent signals we don’t know are a part of the system. */
7-
public struct Signal : RawRepresentable, Hashable, Codable, CaseIterable, CustomStringConvertible {
7+
public struct Signal : RawRepresentable, Hashable, Codable, CaseIterable, CustomStringConvertible, Sendable {
88

99
/* Signal 0 is not considered.
1010
* Because it does not exist.

Sources/SignalHandling/DelayedSigaction/SigactionDelayer_Block.swift

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import SystemPackage
55
import System
66
#endif
77

8+
import GlobalConfModule
9+
810

911

1012
/**
@@ -121,7 +123,7 @@ public enum SigactionDelayer_Block {
121123
for (signal, UnsigactionID) in ret {
122124
do {try unregisterDelayedSigactionOnQueue(UnsigactionID)}
123125
catch {
124-
SignalHandlingConfig.logger?.error(
126+
Conf.logger?.error(
125127
"Cannot unregister delayed sigaction for in recovery handler of registerDelayedSigactions. The signal will stay blocked, probably forever.",
126128
metadata: ["signal": "\(signal)", "error": "\(error)"]
127129
)
@@ -257,7 +259,7 @@ public enum SigactionDelayer_Block {
257259
signalProcessingQueue.async{
258260
do {try currentSigaction.install(on: signal)}
259261
catch {
260-
SignalHandlingConfig.logger?.error(
262+
Conf.logger?.error(
261263
"Cannot set original sigaction back for signal after signal source activation. You might never be called in the sigaction handler and get an infinite loop of signal calls once this signal has been sent once.",
262264
metadata: ["signal": "\(signal)", "error": "\(error)"]
263265
)
@@ -281,15 +283,15 @@ public enum SigactionDelayer_Block {
281283
guard var blockedSignal = blockedSignals[signal] else {
282284
/* We trust our source not to have an internal logic error.
283285
* If the delayed sigaction is not found, it is because the callee called unregister twice on the same delayed sigaction. */
284-
SignalHandlingConfig.logger?.error("Delayed sigaction unregistered more than once.", metadata: ["signal": "\(signal)"])
286+
Conf.logger?.error("Delayed sigaction unregistered more than once.", metadata: ["signal": "\(signal)"])
285287
return
286288
}
287289
assert(!blockedSignal.handlers.isEmpty, "INTERNAL ERROR: handlers should never be empty because when it is, the whole delayed signal should be removed.")
288290

289291
guard blockedSignal.handlers.removeValue(forKey: delayedSigaction) != nil else {
290292
/* Same here.
291293
* If the delayed sigaction was not in the handlers, it can only be because the callee called unregister twice with the object. */
292-
SignalHandlingConfig.logger?.error("Delayed sigaction unregistered more than once.", metadata: ["signal": "\(signal)"])
294+
Conf.logger?.error("Delayed sigaction unregistered more than once.", metadata: ["signal": "\(signal)"])
293295
return
294296
}
295297

@@ -312,11 +314,11 @@ public enum SigactionDelayer_Block {
312314

313315
/** Must always be called on the `signalProcessingQueue`. */
314316
private static func processSignalsOnQueue(signal: Signal, count: UInt) {
315-
SignalHandlingConfig.logger?.debug("Processing signals, called from libdispatch.", metadata: ["signal": "\(signal)", "count": "\(count)"])
317+
Conf.logger?.debug("Processing signals, called from libdispatch.", metadata: ["signal": "\(signal)", "count": "\(count)"])
316318

317319
/* Get the delayed signal for the given signal. */
318320
guard let blockedSignal = blockedSignals[signal] else {
319-
SignalHandlingConfig.logger?.error("INTERNAL ERROR: nil delayed signal.", metadata: ["signal": "\(signal)"])
321+
Conf.logger?.error("INTERNAL ERROR: nil delayed signal.", metadata: ["signal": "\(signal)"])
320322
return
321323
}
322324

@@ -335,7 +337,7 @@ public enum SigactionDelayer_Block {
335337
/* All the handlers have responded, we now know whether to allow or drop the signal. */
336338
do {try executeOnThread(runOriginalHandlerFinal ? .suspend(for: signal) : .drop(signal))}
337339
catch {
338-
SignalHandlingConfig.logger?.error(
340+
Conf.logger?.error(
339341
"Error while \(runOriginalHandlerFinal ? "suspending thread" : "dropping signal in thread").",
340342
metadata: ["signal": "\(signal)", "error": "\(error)"]
341343
)

Sources/SignalHandling/DelayedSigaction/SigactionDelayer_Unsig.swift

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import SystemPackage
55
import System
66
#endif
77

8+
import GlobalConfModule
89
import Logging
910

1011

@@ -53,7 +54,7 @@ public enum SigactionDelayer_Unsig {
5354
} catch {
5455
for (signal, UnsigactionID) in ret {
5556
do {try unregisterDelayedSigactionOnQueue(UnsigactionID)}
56-
catch {SignalHandlingConfig.logger?.error(
57+
catch {Conf.logger?.error(
5758
"Cannot unregister delayed sigaction for in recovery handler of registerDelayedSigactions. The signal will stay blocked, probably forever.",
5859
metadata: ["signal": "\(signal)", "error": "\(error)"]
5960
)}
@@ -120,7 +121,7 @@ public enum SigactionDelayer_Unsig {
120121

121122
func logLogsAndThrowError() throws {
122123
for (log, metadata) in errorLogs {
123-
SignalHandlingConfig.logger?.error(log, metadata: metadata)
124+
Conf.logger?.error(log, metadata: metadata)
124125
}
125126
if let e = error {
126127
throw e
@@ -204,7 +205,7 @@ public enum SigactionDelayer_Unsig {
204205
* We update our original sigaction to the new sigaction.
205206
* Clients should not do that though. */
206207
unsigactionedSignal.originalSigaction = oldSigaction
207-
SignalHandlingConfig.logger?.warning("sigaction handler modified for an unsigactioned signal; the sigaction has been reset to ignore.", metadata: ["signal": "\(signal)"])
208+
Conf.logger?.warning("sigaction handler modified for an unsigactioned signal; the sigaction has been reset to ignore.", metadata: ["signal": "\(signal)"])
208209
}
209210
} else {
210211
let dispatchSourceSignal = DispatchSource.makeSignalSource(signal: signal.rawValue, queue: signalProcessingQueue)
@@ -228,15 +229,15 @@ public enum SigactionDelayer_Unsig {
228229
guard var unsigactionedSignal = unsigactionedSignals[id.signal] else {
229230
/* We trust our source not to have an internal logic error.
230231
* If the unsigactioned signal is not found, it is because the callee called release twice on the same unsigaction ID. */
231-
SignalHandlingConfig.logger?.error("Overrelease of unsigation.", metadata: ["signal": "\(id.signal)"])
232+
Conf.logger?.error("Overrelease of unsigation.", metadata: ["signal": "\(id.signal)"])
232233
return
233234
}
234235
assert(!unsigactionedSignal.handlers.isEmpty, "INTERNAL ERROR: unsigactionInfo should never be empty because when it is, the whole unsigactioned signal should be removed.")
235236

236237
guard unsigactionedSignal.handlers.removeValue(forKey: id) != nil else {
237238
/* Same here.
238239
* If the unsigaction ID was not in the unsigactionInfo, it can only be because the callee called release twice on the same ID. */
239-
SignalHandlingConfig.logger?.error("Overrelease of unsigation for signal", metadata: ["signal": "\(id.signal)"])
240+
Conf.logger?.error("Overrelease of unsigation for signal.", metadata: ["signal": "\(id.signal)"])
240241
return
241242
}
242243

@@ -259,14 +260,14 @@ public enum SigactionDelayer_Unsig {
259260

260261
/** Must always be called on the `signalProcessingQueue`. */
261262
private static func processSignalsOnQueue(signal: Signal, count: UInt) {
262-
SignalHandlingConfig.logger?.debug("Processing signals, called from libdispatch.", metadata: ["signal": "\(signal)", "count": "\(count)"])
263+
Conf.logger?.debug("Processing signals, called from libdispatch.", metadata: ["signal": "\(signal)", "count": "\(count)"])
263264

264265
/* Get the original sigaction for the given signal. */
265266
guard let unsigactionedSignal = unsigactionedSignals[signal] else {
266-
SignalHandlingConfig.logger?.error("INTERNAL ERROR: nil unsigactioned signal.", metadata: ["signal": "\(signal)"])
267+
Conf.logger?.error("INTERNAL ERROR: nil unsigactioned signal.", metadata: ["signal": "\(signal)"])
267268
return
268269
}
269-
SignalHandlingConfig.logger?.trace("", metadata: ["signal": "\(signal)", "original-sigaction": "\(unsigactionedSignal.originalSigaction)"])
270+
Conf.logger?.trace("", metadata: ["signal": "\(signal)", "original-sigaction": "\(unsigactionedSignal.originalSigaction)"])
270271

271272
for _ in 0..<count {
272273
let group = DispatchGroup()
@@ -280,11 +281,11 @@ public enum SigactionDelayer_Unsig {
280281
}
281282
group.wait()
282283
if runOriginalHandlerFinal {
283-
SignalHandlingConfig.logger?.trace("Resending signal.", metadata: ["signal": "\(signal)"])
284+
Conf.logger?.trace("Resending signal.", metadata: ["signal": "\(signal)"])
284285
do {try executeOnThread(.send(signal, with: unsigactionedSignal.originalSigaction))}
285-
catch {SignalHandlingConfig.logger?.error("Error while resending signal in thread.", metadata: ["signal": "\(signal)", "error": "\(error)"])}
286+
catch {Conf.logger?.error("Error while resending signal in thread.", metadata: ["signal": "\(signal)", "error": "\(error)"])}
286287
} else {
287-
SignalHandlingConfig.logger?.trace("Signal resend skipped.", metadata: ["signal": "\(signal)"])
288+
Conf.logger?.trace("Signal resend skipped.", metadata: ["signal": "\(signal)"])
288289
}
289290
}
290291
}

0 commit comments

Comments
 (0)