Skip to content
This repository was archived by the owner on Dec 15, 2024. It is now read-only.

Commit ee3b33f

Browse files
committed
Fixed Linux support for Thread
1 parent b940854 commit ee3b33f

1 file changed

Lines changed: 42 additions & 16 deletions

File tree

Sources/SwiftFoundation/Thread.swift

Lines changed: 42 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,28 @@ public final class Thread {
2828
let pointer = UnsafeMutablePointer<Void>(OpaquePointer(bitPattern: holder))
2929

3030
#if os(Linux)
31+
3132
var internalThread: pthread_t = 0
32-
#elseif os(OSX) || os(iOS) || os(watchOS) || os(tvOS)
33-
var internalThread: pthread_t? = nil
34-
#endif
35-
36-
guard pthread_create(&internalThread, nil, ThreadPrivateMain, pointer) == 0
37-
else { throw POSIXError.fromErrno! }
38-
39-
#if os(Linux)
33+
34+
guard pthread_create(&internalThread, nil, ThreadPrivateMainLinux, pointer) == 0
35+
else { throw POSIXError.fromErrno! }
36+
4037
self.internalThread = internalThread
38+
39+
pthread_detach(internalThread)
40+
4141
#elseif os(OSX) || os(iOS) || os(watchOS) || os(tvOS)
42+
43+
var internalThread: pthread_t? = nil
44+
45+
guard pthread_create(&internalThread, nil, ThreadPrivateMainDarwin, pointer) == 0
46+
else { throw POSIXError.fromErrno! }
47+
4248
self.internalThread = internalThread!
49+
50+
pthread_detach(internalThread!)
51+
4352
#endif
44-
45-
pthread_detach(internalThread!)
4653
}
4754

4855
// MARK: - Class Methods
@@ -73,16 +80,35 @@ public final class Thread {
7380

7481
// MARK: - Private
7582

76-
private func ThreadPrivateMain(arg: UnsafeMutablePointer<Void>) -> UnsafeMutablePointer<Void>? {
83+
#if os(Linux) || XcodeLinux
7784

78-
let unmanaged = Unmanaged<Thread.Closure>.fromOpaque(OpaquePointer(arg))
85+
private func ThreadPrivateMainLinux(arg: UnsafeMutablePointer<Void>?) -> UnsafeMutablePointer<Void>? {
86+
87+
let unmanaged = Unmanaged<Thread.Closure>.fromOpaque(OpaquePointer(arg!))
88+
89+
unmanaged.takeUnretainedValue().closure()
90+
91+
unmanaged.release()
92+
93+
return nil
94+
}
7995

80-
unmanaged.takeUnretainedValue().closure()
96+
#endif
97+
98+
#if os(OSX) || os(iOS) || os(watchOS) || os(tvOS)
8199

82-
unmanaged.release()
100+
private func ThreadPrivateMainDarwin(arg: UnsafeMutablePointer<Void>) -> UnsafeMutablePointer<Void>? {
101+
102+
let unmanaged = Unmanaged<Thread.Closure>.fromOpaque(OpaquePointer(arg))
103+
104+
unmanaged.takeUnretainedValue().closure()
105+
106+
unmanaged.release()
107+
108+
return nil
109+
}
83110

84-
return nil
85-
}
111+
#endif
86112

87113
private extension Thread {
88114

0 commit comments

Comments
 (0)