Skip to content

Commit 7258a8d

Browse files
committed
Make _MultiHandle timeout timer non-repeatable
CURL documentation (https://curl.se/libcurl/c/CURLMOPT_TIMERFUNCTION.html) explicitly says that the timer should be one-time. We basically have to follow CURL requests for setting, resetting and disarming such timers. Current logic eventually leaves a 1ms repeating timer forever, because CURL assumes it fires once, and may not ask us to remove it explicitly. Also, being used as request timeout trigger, this timer also has no sense to be repeated.
1 parent 1b514e4 commit 7258a8d

File tree

1 file changed

+6
-7
lines changed

1 file changed

+6
-7
lines changed

Sources/FoundationNetworking/URLSession/libcurl/MultiHandle.swift

+6-7
Original file line numberDiff line numberDiff line change
@@ -359,7 +359,7 @@ class _TimeoutSource {
359359
let delay = UInt64(max(1, milliseconds - 1))
360360
let start = DispatchTime.now() + DispatchTimeInterval.milliseconds(Int(delay))
361361

362-
rawSource.schedule(deadline: start, repeating: .milliseconds(Int(delay)), leeway: (milliseconds == 1) ? .microseconds(Int(1)) : .milliseconds(Int(1)))
362+
rawSource.schedule(deadline: start, repeating: .never, leeway: (milliseconds == 1) ? .microseconds(Int(1)) : .milliseconds(Int(1)))
363363
rawSource.setEventHandler(handler: handler)
364364
rawSource.resume()
365365
}
@@ -384,13 +384,12 @@ fileprivate extension URLSession._MultiHandle {
384384
timeoutSource = nil
385385
queue.async { self.timeoutTimerFired() }
386386
case .milliseconds(let milliseconds):
387-
if (timeoutSource == nil) || timeoutSource!.milliseconds != milliseconds {
388-
//TODO: Could simply change the existing timer by using DispatchSourceTimer again.
389-
let block = DispatchWorkItem { [weak self] in
390-
self?.timeoutTimerFired()
391-
}
392-
timeoutSource = _TimeoutSource(queue: queue, milliseconds: milliseconds, handler: block)
387+
//TODO: Could simply change the existing timer by using DispatchSourceTimer again.
388+
let block = DispatchWorkItem { [weak self] in
389+
self?.timeoutTimerFired()
393390
}
391+
// Note: Previous timer instance would cancel internal Dispatch timer in deinit
392+
timeoutSource = _TimeoutSource(queue: queue, milliseconds: milliseconds, handler: block)
394393
}
395394
}
396395
enum _Timeout {

0 commit comments

Comments
 (0)