I found a solution similar to what Quinn suggested on Google's Project Santa's github. I just ported it to swift. Here it is:
let deadline = DispatchTime(uptimeNanoseconds: cMsg.pointee.deadline) - .seconds(2)
let handlerSemaphore = DispatchSemaphore(value: 0)
handlerSemaphore.signal()
let deadlineSemaphore = DispatchSemaphore(value: 0)
queue.asyncAfter(deadline: deadline) {
// Check if event handler has already responded
if handlerSemaphore.wait(timeout: .now()) == .timedOut {
// Event handler already responded so exit
return
}
// Deadline met, event handler still processing, default to allow
self.allowMessage(cMsg)
deadlineSemaphore.signal()
}
queue.async {
// Process auth event and respond
handleAuthEvent(cMsg)
// Check if deadline was met
if handlerSemaphore.wait(timeout: .now()) == .timedOut {
// Wait for deadline block to allow the message, then free
deadlineSemaphore.wait()
}
self.freeMessage(cMsg)
}
Topic:
Programming Languages
SubTopic:
Swift
Tags: