@@ -20,34 +20,34 @@ internal class _StateMachine<Progress, Value, Error>
2020 internal typealias ProgressTupleHandler = Task < Progress , Value , Error > . _ProgressTupleHandler
2121
2222 internal let weakified : Bool
23- internal private ( set ) var state : TaskState
23+ internal let state : _Atomic < TaskState >
2424
25- internal private( set) var progress : Progress ? // NOTE: always nil if `weakified = true`
26- internal private( set) var value : Value ?
27- internal private( set) var errorInfo : ErrorInfo ?
25+ internal let progress : _Atomic < Progress ? > = _Atomic ( nil ) // NOTE: always nil if `weakified = true`
26+ internal let value : _Atomic < Value ? > = _Atomic ( nil )
27+ internal let errorInfo : _Atomic < ErrorInfo ? > = _Atomic ( nil )
28+
29+ internal let configuration = TaskConfiguration ( )
2830
2931 /// wrapper closure for `_initClosure` to invoke only once when started `.Running`,
3032 /// and will be set to `nil` afterward
3133 internal var initResumeClosure : ( Void -> Void ) ?
3234
33- internal private( set) lazy var progressTupleHandlers = _Handlers < ProgressTupleHandler > ( )
34- internal private( set) lazy var completionHandlers = _Handlers < Void -> Void > ( )
35-
36- internal let configuration = TaskConfiguration ( )
35+ private lazy var _progressTupleHandlers = _Handlers < ProgressTupleHandler > ( )
36+ private lazy var _completionHandlers = _Handlers < Void -> Void > ( )
3737
3838 private let _recursiveLock = _RecursiveLock ( )
3939
4040 internal init ( weakified: Bool , paused: Bool )
4141 {
4242 self . weakified = weakified
43- self . state = paused ? . Paused : . Running
43+ self . state = _Atomic ( paused ? . Paused : . Running)
4444 }
4545
4646 internal func addProgressTupleHandler( inout token: _HandlerToken ? , _ progressTupleHandler: ProgressTupleHandler ) -> Bool
4747 {
4848 self . _recursiveLock. lock ( )
49- if self . state == . Running || self . state == . Paused {
50- token = self . progressTupleHandlers . append ( progressTupleHandler)
49+ if self . state. rawValue == . Running || self . state. rawValue == . Paused {
50+ token = self . _progressTupleHandlers . append ( progressTupleHandler)
5151 self . _recursiveLock. unlock ( )
5252 return token != nil
5353 }
@@ -61,7 +61,7 @@ internal class _StateMachine<Progress, Value, Error>
6161 {
6262 self . _recursiveLock. lock ( )
6363 if let handlerToken = handlerToken {
64- let removedHandler = self . progressTupleHandlers . remove ( handlerToken)
64+ let removedHandler = self . _progressTupleHandlers . remove ( handlerToken)
6565 self . _recursiveLock. unlock ( )
6666 return removedHandler != nil
6767 }
@@ -74,8 +74,8 @@ internal class _StateMachine<Progress, Value, Error>
7474 internal func addCompletionHandler( inout token: _HandlerToken ? , _ completionHandler: Void -> Void ) -> Bool
7575 {
7676 self . _recursiveLock. lock ( )
77- if self . state == . Running || self . state == . Paused {
78- token = self . completionHandlers . append ( completionHandler)
77+ if self . state. rawValue == . Running || self . state. rawValue == . Paused {
78+ token = self . _completionHandlers . append ( completionHandler)
7979 self . _recursiveLock. unlock ( )
8080 return token != nil
8181 }
@@ -89,7 +89,7 @@ internal class _StateMachine<Progress, Value, Error>
8989 {
9090 self . _recursiveLock. lock ( )
9191 if let handlerToken = handlerToken {
92- let removedHandler = self . completionHandlers . remove ( handlerToken)
92+ let removedHandler = self . _completionHandlers . remove ( handlerToken)
9393 self . _recursiveLock. unlock ( )
9494 return removedHandler != nil
9595 }
@@ -102,16 +102,16 @@ internal class _StateMachine<Progress, Value, Error>
102102 internal func handleProgress( progress: Progress )
103103 {
104104 self . _recursiveLock. lock ( )
105- if self . state == . Running {
105+ if self . state. rawValue == . Running {
106106
107- let oldProgress = self . progress
107+ let oldProgress = self . progress. rawValue
108108
109109 // NOTE: if `weakified = false`, don't store progressValue for less memory footprint
110110 if !self . weakified {
111- self . progress = progress
111+ self . progress. rawValue = progress
112112 }
113113
114- for handler in self . progressTupleHandlers {
114+ for handler in self . _progressTupleHandlers {
115115 handler ( oldProgress: oldProgress, newProgress: progress)
116116 }
117117 self . _recursiveLock. unlock ( )
@@ -124,9 +124,9 @@ internal class _StateMachine<Progress, Value, Error>
124124 internal func handleFulfill( value: Value )
125125 {
126126 self . _recursiveLock. lock ( )
127- if self . state == . Running {
128- self . state = . Fulfilled
129- self . value = value
127+ if self . state. rawValue == . Running {
128+ self . state. rawValue = . Fulfilled
129+ self . value. rawValue = value
130130 self . _finish ( )
131131 self . _recursiveLock. unlock ( )
132132 }
@@ -138,9 +138,9 @@ internal class _StateMachine<Progress, Value, Error>
138138 internal func handleRejectInfo( errorInfo: ErrorInfo )
139139 {
140140 self . _recursiveLock. lock ( )
141- if self . state == . Running || self . state == . Paused {
142- self . state = errorInfo. isCancelled ? . Cancelled : . Rejected
143- self . errorInfo = errorInfo
141+ if self . state. rawValue == . Running || self . state. rawValue == . Paused {
142+ self . state. rawValue = errorInfo. isCancelled ? . Cancelled : . Rejected
143+ self . errorInfo. rawValue = errorInfo
144144 self . _finish ( )
145145 self . _recursiveLock. unlock ( )
146146 }
@@ -152,9 +152,9 @@ internal class _StateMachine<Progress, Value, Error>
152152 internal func handlePause( ) -> Bool
153153 {
154154 self . _recursiveLock. lock ( )
155- if self . state == . Running {
155+ if self . state. rawValue == . Running {
156156 self . configuration. pause ? ( )
157- self . state = . Paused
157+ self . state. rawValue = . Paused
158158 self . _recursiveLock. unlock ( )
159159 return true
160160 }
@@ -196,9 +196,9 @@ internal class _StateMachine<Progress, Value, Error>
196196 {
197197 if ( self . initResumeClosure != nil ) {
198198
199- let isInitPaused = ( self . state == . Paused)
199+ let isInitPaused = ( self . state. rawValue == . Paused)
200200 if isInitPaused {
201- self . state = . Running // switch `.Paused` => `.Resume` temporarily without invoking `configure.resume()`
201+ self . state. rawValue = . Running // switch `.Paused` => `.Resume` temporarily without invoking `configure.resume()`
202202 }
203203
204204 // NOTE: performing `initResumeClosure` might change `state` to `.Fulfilled` or `.Rejected` **immediately**
@@ -207,17 +207,17 @@ internal class _StateMachine<Progress, Value, Error>
207207
208208 // switch back to `.Paused` if temporary `.Running` has not changed
209209 // so that consecutive `_handleResume()` can perform `configure.resume()`
210- if isInitPaused && self . state == . Running {
211- self . state = . Paused
210+ if isInitPaused && self . state. rawValue == . Running {
211+ self . state. rawValue = . Paused
212212 }
213213 }
214214 }
215215
216216 private func _handleResume( ) -> Bool
217217 {
218- if self . state == . Paused {
218+ if self . state. rawValue == . Paused {
219219 self . configuration. resume ? ( )
220- self . state = . Running
220+ self . state. rawValue = . Running
221221 return true
222222 }
223223 else {
@@ -228,9 +228,9 @@ internal class _StateMachine<Progress, Value, Error>
228228 internal func handleCancel( error: Error ? = nil ) -> Bool
229229 {
230230 self . _recursiveLock. lock ( )
231- if self . state == . Running || self . state == . Paused {
232- self . state = . Cancelled
233- self . errorInfo = ErrorInfo ( error: error, isCancelled: true )
231+ if self . state. rawValue == . Running || self . state. rawValue == . Paused {
232+ self . state. rawValue = . Cancelled
233+ self . errorInfo. rawValue = ErrorInfo ( error: error, isCancelled: true )
234234 self . _finish ( )
235235 self . _recursiveLock. unlock ( )
236236 return true
@@ -243,17 +243,17 @@ internal class _StateMachine<Progress, Value, Error>
243243
244244 private func _finish( )
245245 {
246- for handler in self . completionHandlers {
246+ for handler in self . _completionHandlers {
247247 handler ( )
248248 }
249249
250- self . progressTupleHandlers . removeAll ( )
251- self . completionHandlers . removeAll ( )
250+ self . _progressTupleHandlers . removeAll ( )
251+ self . _completionHandlers . removeAll ( )
252252
253253 self . configuration. finish ( )
254254
255255 self . initResumeClosure = nil
256- self . progress = nil
256+ self . progress. rawValue = nil
257257 }
258258}
259259
0 commit comments