aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/objective-c/RxLibrary/GRXConcurrentWriteable.m
diff options
context:
space:
mode:
Diffstat (limited to 'src/objective-c/RxLibrary/GRXConcurrentWriteable.m')
-rw-r--r--src/objective-c/RxLibrary/GRXConcurrentWriteable.m18
1 files changed, 13 insertions, 5 deletions
diff --git a/src/objective-c/RxLibrary/GRXConcurrentWriteable.m b/src/objective-c/RxLibrary/GRXConcurrentWriteable.m
index 229d592f48..d9d0e8c31e 100644
--- a/src/objective-c/RxLibrary/GRXConcurrentWriteable.m
+++ b/src/objective-c/RxLibrary/GRXConcurrentWriteable.m
@@ -63,8 +63,10 @@
- (void)enqueueSuccessfulCompletion {
dispatch_async(_writeableQueue, ^{
- if (self->_alreadyFinished) {
- return;
+ @synchronized (self) {
+ if (self->_alreadyFinished) {
+ return;
+ }
}
[self.writeable writesFinishedWithError:nil];
// Skip any possible message to the wrapped writeable enqueued after this one.
@@ -74,10 +76,14 @@
- (void)cancelWithError:(NSError *)error {
NSAssert(error != nil, @"For a successful completion, use enqueueSuccessfulCompletion.");
- dispatch_async(_writeableQueue, ^{
+ @synchronized (self) {
if (self->_alreadyFinished) {
return;
}
+ }
+ dispatch_async(_writeableQueue, ^{
+ // If enqueueSuccessfulCompletion is already issued, self.writeable is nil and the following
+ // line is no-op.
[self.writeable writesFinishedWithError:error];
self.writeable = nil;
});
@@ -85,8 +91,10 @@
- (void)cancelSilently {
dispatch_async(_writeableQueue, ^{
- if (self->_alreadyFinished) {
- return;
+ @synchronized (self) {
+ if (self->_alreadyFinished) {
+ return;
+ }
}
self.writeable = nil;
});