diff options
author | 2016-02-11 18:16:11 -0800 | |
---|---|---|
committer | 2016-02-11 18:16:11 -0800 | |
commit | 3f19f427714c08d1fce449cf8904fa1494602285 (patch) | |
tree | f80a1816796fb93aaca615ffe3b3403500635113 /include | |
parent | cf36536a30786ce0ed3ad87a56f5f691d530a7b3 (diff) | |
parent | c0473cc8235ab94f38a9d9891e2352e76960fb96 (diff) |
Merge pull request #5052 from ctiller/compress
Fix race condition in transport API
Diffstat (limited to 'include')
-rw-r--r-- | include/grpc++/impl/codegen/sync_stream.h | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/include/grpc++/impl/codegen/sync_stream.h b/include/grpc++/impl/codegen/sync_stream.h index 33d25e837c..9ae48bd23d 100644 --- a/include/grpc++/impl/codegen/sync_stream.h +++ b/include/grpc++/impl/codegen/sync_stream.h @@ -193,6 +193,15 @@ class ClientWriter : public ClientWriterInterface<W> { cq_.Pluck(&ops); } + void WaitForInitialMetadata() { + GPR_ASSERT(!context_->initial_metadata_received_); + + CallOpSet<CallOpRecvInitialMetadata> ops; + ops.RecvInitialMetadata(context_); + call_.PerformOps(&ops); + cq_.Pluck(&ops); // status ignored + } + using WriterInterface<W>::Write; bool Write(const W& msg, const WriteOptions& options) GRPC_OVERRIDE { CallOpSet<CallOpSendMessage> ops; @@ -213,6 +222,9 @@ class ClientWriter : public ClientWriterInterface<W> { /// Read the final response and wait for the final status. Status Finish() GRPC_OVERRIDE { Status status; + if (!context_->initial_metadata_received_) { + finish_ops_.RecvInitialMetadata(context_); + } finish_ops_.ClientRecvStatus(context_, &status); call_.PerformOps(&finish_ops_); GPR_ASSERT(cq_.Pluck(&finish_ops_)); @@ -221,7 +233,8 @@ class ClientWriter : public ClientWriterInterface<W> { private: ClientContext* context_; - CallOpSet<CallOpGenericRecvMessage, CallOpClientRecvStatus> finish_ops_; + CallOpSet<CallOpRecvInitialMetadata, CallOpGenericRecvMessage, + CallOpClientRecvStatus> finish_ops_; CompletionQueue cq_; Call call_; }; @@ -292,7 +305,10 @@ class ClientReaderWriter GRPC_FINAL : public ClientReaderWriterInterface<W, R> { } Status Finish() GRPC_OVERRIDE { - CallOpSet<CallOpClientRecvStatus> ops; + CallOpSet<CallOpRecvInitialMetadata, CallOpClientRecvStatus> ops; + if (!context_->initial_metadata_received_) { + ops.RecvInitialMetadata(context_); + } Status status; ops.ClientRecvStatus(context_, &status); call_.PerformOps(&ops); |