You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I have been writing unit tests for #2654 and found a bug in ConnectableObservableAdapter:
Multicast operator produces a ConnectableObservableAdapter
when you subscribe to it via Observable interface, it evaluates lazySubject computed property to instantiate a Subject without synchronization
this can cause the makeSubject to be called more than once if you perform several calls to subscribe concurrently
and if it's going to return different instances of Subject, this means that some of the concurrent subscriptions will actually be looking at the wrong instance of Subject, which will be overwritten during the data race.
This setup will naturally occur if:
you are doing flatMap into a connectable observable concurrently
if you use refCount operator, subscribing concurrently
share(replay: 2+, scope: .whileConnected) because it's implemented via multicast + refCount
Uh oh!
There was an error while loading. Please reload this page.
I have been writing unit tests for #2654 and found a bug in
ConnectableObservableAdapter
:ConnectableObservableAdapter
Observable
interface, it evaluateslazySubject
computed property to instantiate aSubject
without synchronizationmakeSubject
to be called more than once if you perform several calls tosubscribe
concurrentlySubject
, this means that some of the concurrent subscriptions will actually be looking at the wrong instance ofSubject
, which will be overwritten during the data race.This setup will naturally occur if:
flatMap
into aconnectable
observable concurrentlyrefCount
operator, subscribing concurrentlyshare(replay: 2+, scope: .whileConnected)
because it's implemented viamulticast
+refCount
You can see the code that reproduces this issue here: https://github.com/isaac-weisberg/RxSwiftDeadlock/tree/connect-unsafe
I am going to provide a fix for this issue inside #2654 since it's required to make all the tests run successfully.
The text was updated successfully, but these errors were encountered: