Skip to content

Commit 610463d

Browse files
Make DNSSD queries cancellable
Resolves #32
1 parent 08c07ff commit 610463d

File tree

1 file changed

+28
-1
lines changed

1 file changed

+28
-1
lines changed

Sources/AsyncDNSResolver/dnssd/DNSResolver_dnssd.swift

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,10 @@ struct DNSSD {
141141
let serviceRefPtr = UnsafeMutablePointer<DNSServiceRef?>.allocate(capacity: 1)
142142
defer { serviceRefPtr.deallocate() }
143143

144+
continuation.onTermination = { _ in
145+
DNSServiceRefDeallocate(serviceRefPtr.pointee)
146+
}
147+
144148
// Run the query
145149
let _code = DNSServiceQueryRecord(
146150
serviceRefPtr,
@@ -158,9 +162,32 @@ struct DNSSD {
158162
return continuation.finish(throwing: AsyncDNSResolver.Error(dnssdCode: _code))
159163
}
160164

165+
let serviceSockFD = DNSServiceRefSockFD(serviceRefPtr.pointee)
166+
guard serviceSockFD != -1 else {
167+
return continuation.finish(throwing: AsyncDNSResolver.Error(code: .internalError))
168+
}
169+
170+
var pollFDs = [pollfd(fd: serviceSockFD, events: Int16(POLLIN), revents: 0)]
171+
while true {
172+
guard !Task.isCancelled else {
173+
return continuation.finish(throwing: CancellationError())
174+
}
175+
176+
let result = poll(&pollFDs, 1, 0)
177+
guard result != -1 else {
178+
return continuation.finish(throwing: AsyncDNSResolver.Error(code: .internalError))
179+
}
180+
181+
if result == 0 {
182+
continue
183+
}
184+
if result == 1 {
185+
break
186+
}
187+
}
188+
161189
// Read reply from the socket (blocking) then call reply handler
162190
DNSServiceProcessResult(serviceRefPtr.pointee)
163-
DNSServiceRefDeallocate(serviceRefPtr.pointee)
164191

165192
// Streaming done
166193
continuation.finish()

0 commit comments

Comments
 (0)