@@ -46,62 +46,64 @@ internal class _StateMachine<Progress, Value, Error>
4646 internal func addProgressTupleHandler( inout token: _HandlerToken ? , _ progressTupleHandler: ProgressTupleHandler ) -> Bool
4747 {
4848 self . _lock. lock ( )
49+ defer { self . _lock. unlock ( ) }
50+
4951 if self . state. rawValue == . Running || self . state. rawValue == . Paused {
5052 token = self . _progressTupleHandlers. append ( progressTupleHandler)
51- self . _lock. unlock ( )
5253 return token != nil
5354 }
5455 else {
55- self . _lock. unlock ( )
5656 return false
5757 }
5858 }
5959
6060 internal func removeProgressTupleHandler( handlerToken: _HandlerToken ? ) -> Bool
6161 {
6262 self . _lock. lock ( )
63+ defer { self . _lock. unlock ( ) }
64+
6365 if let handlerToken = handlerToken {
6466 let removedHandler = self . _progressTupleHandlers. remove ( handlerToken)
65- self . _lock. unlock ( )
6667 return removedHandler != nil
6768 }
6869 else {
69- self . _lock. unlock ( )
7070 return false
7171 }
7272 }
7373
7474 internal func addCompletionHandler( inout token: _HandlerToken ? , _ completionHandler: Void -> Void ) -> Bool
7575 {
7676 self . _lock. lock ( )
77+ defer { self . _lock. unlock ( ) }
78+
7779 if self . state. rawValue == . Running || self . state. rawValue == . Paused {
7880 token = self . _completionHandlers. append ( completionHandler)
79- self . _lock. unlock ( )
8081 return token != nil
8182 }
8283 else {
83- self . _lock. unlock ( )
8484 return false
8585 }
8686 }
8787
8888 internal func removeCompletionHandler( handlerToken: _HandlerToken ? ) -> Bool
8989 {
9090 self . _lock. lock ( )
91+ defer { self . _lock. unlock ( ) }
92+
9193 if let handlerToken = handlerToken {
9294 let removedHandler = self . _completionHandlers. remove ( handlerToken)
93- self . _lock. unlock ( )
9495 return removedHandler != nil
9596 }
9697 else {
97- self . _lock. unlock ( )
9898 return false
9999 }
100100 }
101101
102102 internal func handleProgress( progress: Progress )
103103 {
104104 self . _lock. lock ( )
105+ defer { self . _lock. unlock ( ) }
106+
105107 if self . state. rawValue == . Running {
106108
107109 let oldProgress = self . progress. rawValue
@@ -114,60 +116,53 @@ internal class _StateMachine<Progress, Value, Error>
114116 for handler in self . _progressTupleHandlers {
115117 handler ( oldProgress: oldProgress, newProgress: progress)
116118 }
117- self . _lock. unlock ( )
118- }
119- else {
120- self . _lock. unlock ( )
121119 }
122120 }
123121
124122 internal func handleFulfill( value: Value )
125123 {
126124 self . _lock. lock ( )
125+ defer { self . _lock. unlock ( ) }
126+
127127 let ( _, updated) = self . state. tryUpdate { $0 == . Running ? ( . Fulfilled, true ) : ( $0, false ) }
128128 if updated {
129129 self . value. rawValue = value
130130 self . _finish ( )
131- self . _lock. unlock ( )
132- }
133- else {
134- self . _lock. unlock ( )
135131 }
136132 }
137133
138134 internal func handleRejectInfo( errorInfo: ErrorInfo )
139135 {
140136 self . _lock. lock ( )
137+ defer { self . _lock. unlock ( ) }
138+
141139 let toState = errorInfo. isCancelled ? TaskState . Cancelled : . Rejected
142140 let ( _, updated) = self . state. tryUpdate { $0 == . Running || $0 == . Paused ? ( toState, true ) : ( $0, false ) }
143141 if updated {
144142 self . errorInfo. rawValue = errorInfo
145143 self . _finish ( )
146- self . _lock. unlock ( )
147- }
148- else {
149- self . _lock. unlock ( )
150144 }
151145 }
152146
153147 internal func handlePause( ) -> Bool
154148 {
155149 self . _lock. lock ( )
150+ defer { self . _lock. unlock ( ) }
151+
156152 let ( _, updated) = self . state. tryUpdate { $0 == . Running ? ( . Paused, true ) : ( $0, false ) }
157153 if updated {
158154 self . configuration. pause ? ( )
159- self . _lock. unlock ( )
160155 return true
161156 }
162157 else {
163- self . _lock. unlock ( )
164158 return false
165159 }
166160 }
167161
168162 internal func handleResume( ) -> Bool
169163 {
170164 self . _lock. lock ( )
165+
171166 if let initResumeClosure = self . initResumeClosure. update ( { _ in nil } ) {
172167
173168 self . state. rawValue = . Running
@@ -211,15 +206,15 @@ internal class _StateMachine<Progress, Value, Error>
211206 internal func handleCancel( error: Error ? = nil ) -> Bool
212207 {
213208 self . _lock. lock ( )
209+ defer { self . _lock. unlock ( ) }
210+
214211 let ( _, updated) = self . state. tryUpdate { $0 == . Running || $0 == . Paused ? ( . Cancelled, true ) : ( $0, false ) }
215212 if updated {
216213 self . errorInfo. rawValue = ErrorInfo ( error: error, isCancelled: true )
217214 self . _finish ( )
218- self . _lock. unlock ( )
219215 return true
220216 }
221217 else {
222- self . _lock. unlock ( )
223218 return false
224219 }
225220 }
0 commit comments