Skip to content

Commit cb7e1f1

Browse files
committed
Improve _Atomic.
1 parent 5bd2dfe commit cb7e1f1

File tree

2 files changed

+56
-38
lines changed

2 files changed

+56
-38
lines changed

SwiftTask/_Atomic.swift

Lines changed: 46 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -13,49 +13,42 @@ internal final class _Atomic<T>
1313
private var _spinlock = OS_SPINLOCK_INIT
1414
private var _rawValue: T
1515

16-
internal var rawValue: T
17-
{
18-
get {
19-
self._lock()
20-
let rawValue = self._rawValue
21-
self._unlock()
22-
23-
return rawValue
24-
}
25-
26-
set(newValue) {
27-
self._lock()
28-
self._rawValue = newValue
29-
self._unlock()
30-
}
31-
}
32-
3316
internal init(_ rawValue: T)
3417
{
3518
self._rawValue = rawValue
3619
}
3720

38-
internal func update(f: T -> T) -> T
21+
internal func withRawValue<U>(@noescape f: T -> U) -> U
3922
{
4023
self._lock()
41-
let oldValue = self._rawValue
42-
self._rawValue = f(oldValue)
43-
self._unlock()
24+
defer { self._unlock() }
4425

45-
return oldValue
26+
return f(self._rawValue)
27+
}
28+
29+
internal func update(@noescape f: T -> T) -> T
30+
{
31+
return self.updateIf { f($0) }!
4632
}
4733

48-
internal func tryUpdate(f: T -> (T, Bool)) -> (T, Bool)
34+
internal func updateIf(@noescape f: T -> T?) -> T?
35+
{
36+
return self.modify { value in f(value).map { ($0, value) } }
37+
}
38+
39+
internal func modify<U>(@noescape f: T -> (T, U)?) -> U?
4940
{
5041
self._lock()
42+
defer { self._unlock() }
43+
5144
let oldValue = self._rawValue
52-
let (newValue, shouldUpdate) = f(oldValue)
53-
if shouldUpdate {
45+
if let (newValue, retValue) = f(oldValue) {
5446
self._rawValue = newValue
47+
return retValue
48+
}
49+
else {
50+
return nil
5551
}
56-
self._unlock()
57-
58-
return (oldValue, shouldUpdate)
5952
}
6053

6154
private func _lock()
@@ -69,6 +62,31 @@ internal final class _Atomic<T>
6962
}
7063
}
7164

65+
extension _Atomic: RawRepresentable
66+
{
67+
internal convenience init(rawValue: T)
68+
{
69+
self.init(rawValue)
70+
}
71+
72+
internal var rawValue: T
73+
{
74+
get {
75+
self._lock()
76+
defer { self._unlock() }
77+
78+
return self._rawValue
79+
}
80+
81+
set(newValue) {
82+
self._lock()
83+
defer { self._unlock() }
84+
85+
self._rawValue = newValue
86+
}
87+
}
88+
}
89+
7290
extension _Atomic: CustomStringConvertible
7391
{
7492
internal var description: String

SwiftTask/_StateMachine.swift

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,8 @@ internal class _StateMachine<Progress, Value, Error>
124124
self._lock.lock()
125125
defer { self._lock.unlock() }
126126

127-
let (_, updated) = self.state.tryUpdate { $0 == .Running ? (.Fulfilled, true) : ($0, false) }
128-
if updated {
127+
let newState = self.state.updateIf { $0 == TaskState.Running ? .Fulfilled : nil }
128+
if let _ = newState {
129129
self.value.rawValue = value
130130
self._finish()
131131
}
@@ -137,8 +137,8 @@ internal class _StateMachine<Progress, Value, Error>
137137
defer { self._lock.unlock() }
138138

139139
let toState = errorInfo.isCancelled ? TaskState.Cancelled : .Rejected
140-
let (_, updated) = self.state.tryUpdate { $0 == .Running || $0 == .Paused ? (toState, true) : ($0, false) }
141-
if updated {
140+
let newState = self.state.updateIf { $0 == TaskState.Running || $0 == .Paused ? toState : nil }
141+
if let _ = newState {
142142
self.errorInfo.rawValue = errorInfo
143143
self._finish()
144144
}
@@ -149,8 +149,8 @@ internal class _StateMachine<Progress, Value, Error>
149149
self._lock.lock()
150150
defer { self._lock.unlock() }
151151

152-
let (_, updated) = self.state.tryUpdate { $0 == .Running ? (.Paused, true) : ($0, false) }
153-
if updated {
152+
let newState = self.state.updateIf { $0 == TaskState.Running ? .Paused : nil }
153+
if let _ = newState {
154154
self.configuration.pause?()
155155
return true
156156
}
@@ -193,8 +193,8 @@ internal class _StateMachine<Progress, Value, Error>
193193

194194
private func _handleResume() -> Bool
195195
{
196-
let (_, updated) = self.state.tryUpdate { $0 == .Paused ? (.Running, true) : ($0, false) }
197-
if updated {
196+
let newState = self.state.updateIf { $0 == TaskState.Paused ? .Running : nil }
197+
if let _ = newState {
198198
self.configuration.resume?()
199199
return true
200200
}
@@ -208,8 +208,8 @@ internal class _StateMachine<Progress, Value, Error>
208208
self._lock.lock()
209209
defer { self._lock.unlock() }
210210

211-
let (_, updated) = self.state.tryUpdate { $0 == .Running || $0 == .Paused ? (.Cancelled, true) : ($0, false) }
212-
if updated {
211+
let newState = self.state.updateIf { $0 == TaskState.Running || $0 == .Paused ? .Cancelled : nil }
212+
if let _ = newState {
213213
self.errorInfo.rawValue = ErrorInfo(error: error, isCancelled: true)
214214
self._finish()
215215
return true

0 commit comments

Comments
 (0)