From a38661a02501b27eca6f0835f7dd50979324f8a7 Mon Sep 17 00:00:00 2001 From: Yasuhiro Inami Date: Sun, 5 Jun 2016 19:08:10 +0900 Subject: [PATCH] Fix redundant recursive calls in `Task.all` --- SwiftTask/SwiftTask.swift | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/SwiftTask/SwiftTask.swift b/SwiftTask/SwiftTask.swift index e69c25e..7fec21b 100644 --- a/SwiftTask/SwiftTask.swift +++ b/SwiftTask/SwiftTask.swift @@ -699,6 +699,7 @@ extension Task var completedCount = 0 let totalCount = tasks.count let lock = _RecursiveLock() + let cancelled = _Atomic(false) for task in tasks { task.success { (value: Value) -> Void in @@ -721,20 +722,27 @@ extension Task lock.unlock() }.failure { (errorInfo: ErrorInfo) -> Void in - - lock.lock() - _reject(errorInfo) - - for task in tasks { - task.cancel() + + let changed = cancelled.updateIf { $0 == false ? true : nil } + if changed != nil { + lock.lock() + _reject(errorInfo) + + for task in tasks { + task.cancel() + } + lock.unlock() } - lock.unlock() } } configure.pause = { self.pauseAll(tasks); return } configure.resume = { self.resumeAll(tasks); return } - configure.cancel = { self.cancelAll(tasks); return } + configure.cancel = { + if !cancelled.rawValue { + self.cancelAll(tasks); + } + } }.name("Task.all") }