Skip to content

Commit

Permalink
Fix intermittent crash when resolving lots of connections
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Sanders committed Oct 20, 2016
1 parent 730dd1d commit 02397c2
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 9 deletions.
8 changes: 5 additions & 3 deletions Sources/HostResolver.swift
Expand Up @@ -77,10 +77,10 @@ final class HostResolver {
self.host = CFHostCreateWithName(nil, self.url.absoluteString!).takeRetainedValue()
var ctx = CFHostClientContext(
version: 0,
info: UnsafeMutablePointer(Unmanaged.passUnretained(self).toOpaque()),
info: UnsafeMutablePointer(Unmanaged.passRetained(self).toOpaque()),
retain: nil,
release: nil,
copyDescription: defaultCopyDescription
copyDescription: nil
)

if let host = self.host {
Expand Down Expand Up @@ -123,8 +123,10 @@ final class HostResolver {
private var resolved: Bool = false
private let hostCallback: CFHostClientCallBack = { host, infoType, error, info in
guard info != nil else { return }
let client = Unmanaged<HostResolver>.fromOpaque(COpaquePointer(info)).takeUnretainedValue()
let retainedClient = Unmanaged<HostResolver>.fromOpaque(COpaquePointer(info))
let client = retainedClient.takeUnretainedValue()
client.connect(host)
retainedClient.release()
}
}

Expand Down
9 changes: 5 additions & 4 deletions Sources/NTPConnection.swift
Expand Up @@ -76,10 +76,10 @@ final class NTPConnection {

var ctx = CFSocketContext(
version: 0,
info: UnsafeMutablePointer(Unmanaged.passUnretained(self).toOpaque()),
info: UnsafeMutablePointer(Unmanaged.passRetained(self).toOpaque()),
retain: nil,
release: nil,
copyDescription: defaultCopyDescription
copyDescription: nil
)

self.attempts += 1
Expand Down Expand Up @@ -134,14 +134,15 @@ final class NTPConnection {

private let dataCallback: CFSocketCallBack = { socket, type, address, data, info in
guard info != nil else { return }
let client = Unmanaged<NTPConnection>.fromOpaque(COpaquePointer(info))
.takeUnretainedValue()
let retainedClient = Unmanaged<NTPConnection>.fromOpaque(COpaquePointer(info))
let client = retainedClient.takeUnretainedValue()
guard let socket = socket where CFSocketIsValid(socket) else { return }

// Can't use switch here as these aren't defined as an enum.
if type == .DataCallBack {
let data = Unmanaged<CFData>.fromOpaque(COpaquePointer(data)).takeUnretainedValue()
client.handleResponse(data)
retainedClient.release()
} else if type == .WriteCallBack {
client.debugLog("Buffer \(client.address) writable - requesting time")
client.requestTime()
Expand Down
2 changes: 0 additions & 2 deletions Sources/NTPExtensions.swift
Expand Up @@ -288,8 +288,6 @@ func withFatalErrno<X: SignedIntegerType>(@noescape block: () -> X) -> X {
// swiftlint:enable force_try
}

let defaultCopyDescription = unsafeBitCast(0, CFAllocatorCopyDescriptionCallBack.self)

// Number of seconds between Jan 1, 1900 and Jan 1, 1970
// 70 years plus 17 leap days
private let secondsFrom1900To1970: Int64 = ((365 * 70) + 17) * 24 * 60 * 60
Expand Down

0 comments on commit 02397c2

Please sign in to comment.