diff options
author | 2015-02-11 20:34:33 -0800 | |
---|---|---|
committer | 2015-02-11 20:34:33 -0800 | |
commit | 504bd331aba5817c2753c4f447f40cc83fa4d907 (patch) | |
tree | a109bb943793a758f505041508c2d06864856f10 /src/cpp/common | |
parent | 4dd70173bdf0754a039ddf634080e2fbf29d86e7 (diff) |
Make sure we get a close before stopping the server
Diffstat (limited to 'src/cpp/common')
-rw-r--r-- | src/cpp/common/call.cc | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/cpp/common/call.cc b/src/cpp/common/call.cc index 6b1d99f739..d90ef0311e 100644 --- a/src/cpp/common/call.cc +++ b/src/cpp/common/call.cc @@ -78,6 +78,8 @@ void CallOpBuffer::Reset(void* next_return_tag) { send_status_ = nullptr; trailing_metadata_count_ = 0; trailing_metadata_ = nullptr; + + recv_closed_ = nullptr; } namespace { @@ -134,6 +136,10 @@ void CallOpBuffer::AddClientSendClose() { client_send_close_ = true; } +void CallOpBuffer::AddServerRecvClose(bool* cancelled) { + recv_closed_ = cancelled; +} + void CallOpBuffer::AddClientRecvStatus( std::multimap<grpc::string, grpc::string>* metadata, Status *status) { recv_trailing_metadata_ = metadata; @@ -205,6 +211,11 @@ void CallOpBuffer::FillOps(grpc_op *ops, size_t *nops) { send_status_->details().c_str(); (*nops)++; } + if (recv_closed_) { + ops[*nops].op = GRPC_OP_RECV_CLOSE_ON_SERVER; + ops[*nops].data.recv_close_on_server.cancelled = &cancelled_buf_; + (*nops)++; + } } void CallOpBuffer::FinalizeResult(void **tag, bool *status) { @@ -241,6 +252,9 @@ void CallOpBuffer::FinalizeResult(void **tag, bool *status) { status_details_ ? grpc::string(status_details_) : grpc::string()); } + if (recv_closed_) { + *recv_closed_ = cancelled_buf_ != 0; + } } Call::Call(grpc_call* call, CallHook *call_hook, CompletionQueue* cq) |