From e19ed416bbd9e9c74f643a7e52871faf6e8b7719 Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Mon, 25 Apr 2022 17:15:12 -0400 Subject: [PATCH 1/3] saftey against handler implementtations --- .../ClientParameterHandler.swift | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift index fe420ef..d621115 100644 --- a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift +++ b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift @@ -88,19 +88,31 @@ complete = true } } + + guard self.parameterHandlerList.count > 0 else { + completionHandler(nil) + return + } // Setup timeout. self.parametersWorkQueue.asyncAfter(deadline: .now() + .seconds(Int(timeout)), execute: timeoutWorkItem) + self.group.enter() + // Setup the parameter execution. for (index, parameterHandler) in self.parameterHandlerList.enumerated() { - self.group.enter() + let parameterType = parameterHandler.clientParameterModel.type parameterHandler.fetchClientParameters(requestParameters: requestParameters, timingOutIn: timeout) { (receivedParameter) in // Queue the results for merge. self.parametersWorkQueue.async { + if (returnedList[index] != nil) { + MVMCoreLoggingHandler.shared()?.addError(toLog: MVMCoreErrorObject(title: nil, message: "Client parameter \(parameterType) has already executed. The completion handler should only be called once!", code: ErrorCode.default.rawValue, domain: ErrorDomainNative, location: String(describing: ClientParameterHandler.self))!) + } returnedList[index] = receivedParameter - self.group.leave() // Leaving is only done after setup (barriered). + if (returnedList.allSatisfy { $0 != nil }) { + self.group.leave() // Leaving is only done after setup (barriered). + } } } } From c21858c48cc727a0458aca7c7e4d34abcee4c502 Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Mon, 25 Apr 2022 18:32:11 -0400 Subject: [PATCH 2/3] further safety --- .../ActionType/Client Parameters/ClientParameterHandler.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift index d621115..a1544e0 100644 --- a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift +++ b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift @@ -106,11 +106,12 @@ timingOutIn: timeout) { (receivedParameter) in // Queue the results for merge. self.parametersWorkQueue.async { + let previouslySatisfied = returnedList.allSatisfy { $0 != nil } if (returnedList[index] != nil) { MVMCoreLoggingHandler.shared()?.addError(toLog: MVMCoreErrorObject(title: nil, message: "Client parameter \(parameterType) has already executed. The completion handler should only be called once!", code: ErrorCode.default.rawValue, domain: ErrorDomainNative, location: String(describing: ClientParameterHandler.self))!) } returnedList[index] = receivedParameter - if (returnedList.allSatisfy { $0 != nil }) { + if (!previouslySatisfied && returnedList.allSatisfy { $0 != nil }) { self.group.leave() // Leaving is only done after setup (barriered). } } From a05da2695bd5f396fa7b50d0eaa074e52b55b050 Mon Sep 17 00:00:00 2001 From: Kyle Matthew Hedden Date: Thu, 28 Apr 2022 09:44:46 -0400 Subject: [PATCH 3/3] Simplify change. --- .../Client Parameters/ClientParameterHandler.swift | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift index a1544e0..2d59771 100644 --- a/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift +++ b/MVMCore/MVMCore/Models/ActionType/Client Parameters/ClientParameterHandler.swift @@ -89,29 +89,21 @@ } } - guard self.parameterHandlerList.count > 0 else { - completionHandler(nil) - return - } - // Setup timeout. self.parametersWorkQueue.asyncAfter(deadline: .now() + .seconds(Int(timeout)), execute: timeoutWorkItem) - - self.group.enter() // Setup the parameter execution. for (index, parameterHandler) in self.parameterHandlerList.enumerated() { let parameterType = parameterHandler.clientParameterModel.type + self.group.enter() parameterHandler.fetchClientParameters(requestParameters: requestParameters, timingOutIn: timeout) { (receivedParameter) in // Queue the results for merge. self.parametersWorkQueue.async { - let previouslySatisfied = returnedList.allSatisfy { $0 != nil } if (returnedList[index] != nil) { MVMCoreLoggingHandler.shared()?.addError(toLog: MVMCoreErrorObject(title: nil, message: "Client parameter \(parameterType) has already executed. The completion handler should only be called once!", code: ErrorCode.default.rawValue, domain: ErrorDomainNative, location: String(describing: ClientParameterHandler.self))!) - } - returnedList[index] = receivedParameter - if (!previouslySatisfied && returnedList.allSatisfy { $0 != nil }) { + } else { + returnedList[index] = receivedParameter self.group.leave() // Leaving is only done after setup (barriered). } }