Skip to content

Commit 8932598

Browse files
authored
Allow VirtualTimeScheduler to run on any thread (ReactiveX#2610)
* Allow VirtualTimeScheduler to run on any thread as long as critical methods are all called on the same thread. * Move thread assignment to init method.
1 parent 7570d44 commit 8932598

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

RxSwift/Schedulers/VirtualTimeScheduler.swift

+14-10
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
2424

2525
private var nextId = 0
2626

27+
private let thread: Thread
28+
2729
/// - returns: Current time.
2830
public var now: RxTime {
2931
self.converter.convertFromVirtualTime(self.clock)
@@ -41,6 +43,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
4143
self.currentClock = initialClock
4244
self.running = false
4345
self.converter = converter
46+
self.thread = Thread.current
4447
self.schedulerQueue = PriorityQueue(hasHigherPriority: {
4548
switch converter.compareVirtualTime($0.time, $1.time) {
4649
case .lessThan:
@@ -106,8 +109,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
106109
- returns: The disposable object used to cancel the scheduled action (best effort).
107110
*/
108111
public func scheduleAbsoluteVirtual<StateType>(_ state: StateType, time: VirtualTime, action: @escaping (StateType) -> Disposable) -> Disposable {
109-
MainScheduler.ensureExecutingOnScheduler()
110-
112+
ensusreRunningOnCorrectThread()
111113
let compositeDisposable = CompositeDisposable()
112114

113115
let item = VirtualSchedulerItem(action: {
@@ -130,12 +132,11 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
130132

131133
/// Starts the virtual time scheduler.
132134
public func start() {
133-
MainScheduler.ensureExecutingOnScheduler()
134-
135135
if self.running {
136136
return
137137
}
138138

139+
ensusreRunningOnCorrectThread()
139140
self.running = true
140141
repeat {
141142
guard let next = self.findNext() else {
@@ -170,12 +171,11 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
170171
///
171172
/// - parameter virtualTime: Absolute time to advance the scheduler's clock to.
172173
public func advanceTo(_ virtualTime: VirtualTime) {
173-
MainScheduler.ensureExecutingOnScheduler()
174-
175174
if self.running {
176175
fatalError("Scheduler is already running")
177176
}
178177

178+
ensusreRunningOnCorrectThread()
179179
self.running = true
180180
repeat {
181181
guard let next = self.findNext() else {
@@ -199,8 +199,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
199199

200200
/// Advances the scheduler's clock by the specified relative time.
201201
public func sleep(_ virtualInterval: VirtualTimeInterval) {
202-
MainScheduler.ensureExecutingOnScheduler()
203-
202+
ensusreRunningOnCorrectThread()
204203
let sleepTo = self.converter.offsetVirtualTime(self.clock, offset: virtualInterval)
205204
if self.converter.compareVirtualTime(sleepTo, self.clock).lessThen {
206205
fatalError("Can't sleep to past.")
@@ -211,8 +210,7 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
211210

212211
/// Stops the virtual time scheduler.
213212
public func stop() {
214-
MainScheduler.ensureExecutingOnScheduler()
215-
213+
ensusreRunningOnCorrectThread()
216214
self.running = false
217215
}
218216

@@ -221,6 +219,12 @@ open class VirtualTimeScheduler<Converter: VirtualTimeConverterType>
221219
_ = Resources.decrementTotal()
222220
}
223221
#endif
222+
223+
private func ensusreRunningOnCorrectThread() {
224+
guard Thread.current == thread else {
225+
rxFatalError("Executing on the wrong thread. Please ensure all work on the same thread.")
226+
}
227+
}
224228
}
225229

226230
// MARK: description

0 commit comments

Comments
 (0)