diff options
author | Muxi Yan <mxyan@google.com> | 2018-12-21 13:39:21 -0800 |
---|---|---|
committer | Muxi Yan <mxyan@google.com> | 2019-01-07 10:27:20 -0800 |
commit | 5e10a3b037bcd20ab17428ccb765ba9464eb3644 (patch) | |
tree | 187a4a277055a8d969cabb77d605477599895731 /src/objective-c/RxLibrary/GRXBufferedPipe.m | |
parent | 4ff3543465e0a8d26a5bdf934f1dc09d0703970b (diff) |
Make gRPC ObjC thread safety right
Diffstat (limited to 'src/objective-c/RxLibrary/GRXBufferedPipe.m')
-rw-r--r-- | src/objective-c/RxLibrary/GRXBufferedPipe.m | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/src/objective-c/RxLibrary/GRXBufferedPipe.m b/src/objective-c/RxLibrary/GRXBufferedPipe.m index 546d46cba3..d0064a5cfa 100644 --- a/src/objective-c/RxLibrary/GRXBufferedPipe.m +++ b/src/objective-c/RxLibrary/GRXBufferedPipe.m @@ -51,16 +51,22 @@ // We need a copy, so that it doesn't mutate before it's written at the other end of the pipe. value = [value copy]; } - __weak GRXBufferedPipe *weakSelf = self; dispatch_async(_writeQueue, ^(void) { - [weakSelf.writeable writeValue:value]; + @synchronized (self) { + if (self->_state == GRXWriterStateFinished) { + return; + } + [self.writeable writeValue:value]; + } }); } - (void)writesFinishedWithError:(NSError *)errorOrNil { - __weak GRXBufferedPipe *weakSelf = self; dispatch_async(_writeQueue, ^{ - [weakSelf finishWithError:errorOrNil]; + if (self->_state == GRXWriterStateFinished) { + return; + } + [self finishWithError:errorOrNil]; }); } @@ -100,14 +106,15 @@ } - (void)startWithWriteable:(id<GRXWriteable>)writeable { - self.writeable = writeable; - _state = GRXWriterStateStarted; + @synchronized (self) { + self.writeable = writeable; + _state = GRXWriterStateStarted; + } dispatch_resume(_writeQueue); } - (void)finishWithError:(NSError *)errorOrNil { [self.writeable writesFinishedWithError:errorOrNil]; - self.state = GRXWriterStateFinished; } - (void)dealloc { |