From f9f90054a9cd82fcb99592355d5713a6f7d164b4 Mon Sep 17 00:00:00 2001 From: jcarroll-mediafly Date: Tue, 19 Jul 2016 23:31:22 -0500 Subject: [PATCH] Thread safety on group cancel Prevents internal queue marking the entire groupOperation as finished before cancel flag is set --- PSOperations/GroupOperation.swift | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/PSOperations/GroupOperation.swift b/PSOperations/GroupOperation.swift index bc38362..61ccad0 100644 --- a/PSOperations/GroupOperation.swift +++ b/PSOperations/GroupOperation.swift @@ -44,10 +44,14 @@ open class GroupOperation: Operation { } } + private let cancelLock = NSLock() + override open func cancel() { - internalQueue.cancelAllOperations() - internalQueue.isSuspended = false - super.cancel() + cancelLock.withCriticalScope { + internalQueue.cancelAllOperations() + internalQueue.isSuspended = false + super.cancel() + } } override open func execute() { @@ -104,7 +108,9 @@ extension GroupOperation: OperationQueueDelegate { if operation === finishingOperation { internalQueue.isSuspended = true - finish(aggregatedErrors) + cancelLock.withCriticalScope { + finish(aggregatedErrors) + } } else if operation !== startingOperation { operationDidFinish(operation, withErrors: errors)