diff options
Diffstat (limited to 'include/grpc++/impl/codegen/call.h')
-rw-r--r-- | include/grpc++/impl/codegen/call.h | 74 |
1 files changed, 57 insertions, 17 deletions
diff --git a/include/grpc++/impl/codegen/call.h b/include/grpc++/impl/codegen/call.h index 5e450b0d24..ec950b8ea6 100644 --- a/include/grpc++/impl/codegen/call.h +++ b/include/grpc++/impl/codegen/call.h @@ -41,12 +41,14 @@ #include <grpc/impl/codegen/alloc.h> #include <grpc/impl/codegen/grpc_types.h> -#include <grpc++/impl/codegen/client_context.h> #include <grpc++/impl/codegen/call_hook.h> +#include <grpc++/impl/codegen/client_context.h> #include <grpc++/impl/codegen/completion_queue_tag.h> -#include <grpc++/impl/codegen/serialization_traits.h> #include <grpc++/impl/codegen/config.h> +#include <grpc++/impl/codegen/core_codegen_interface.h> +#include <grpc++/impl/codegen/serialization_traits.h> #include <grpc++/impl/codegen/status.h> +#include <grpc++/impl/codegen/string_ref.h> struct grpc_byte_buffer; @@ -56,12 +58,39 @@ class ByteBuffer; class Call; class CallHook; class CompletionQueue; +extern CoreCodegenInterface* g_core_codegen_interface; -void FillMetadataMap( +inline void FillMetadataMap( grpc_metadata_array* arr, - std::multimap<grpc::string_ref, grpc::string_ref>* metadata); -grpc_metadata* FillMetadataArray( - const std::multimap<grpc::string, grpc::string>& metadata); + std::multimap<grpc::string_ref, grpc::string_ref>* metadata) { + for (size_t i = 0; i < arr->count; i++) { + // TODO(yangg) handle duplicates? + metadata->insert(std::pair<grpc::string_ref, grpc::string_ref>( + arr->metadata[i].key, grpc::string_ref(arr->metadata[i].value, + arr->metadata[i].value_length))); + } + g_core_codegen_interface->grpc_metadata_array_destroy(arr); + g_core_codegen_interface->grpc_metadata_array_init(arr); +} + +// TODO(yangg) if the map is changed before we send, the pointers will be a +// mess. Make sure it does not happen. +inline grpc_metadata* FillMetadataArray( + const std::multimap<grpc::string, grpc::string>& metadata) { + if (metadata.empty()) { + return nullptr; + } + grpc_metadata* metadata_array = + (grpc_metadata*)(g_core_codegen_interface->gpr_malloc( + metadata.size() * sizeof(grpc_metadata))); + size_t i = 0; + for (auto iter = metadata.cbegin(); iter != metadata.cend(); ++iter, ++i) { + metadata_array[i].key = iter->first.c_str(); + metadata_array[i].value = iter->second.c_str(); + metadata_array[i].value_length = iter->second.size(); + } + return metadata_array; +} /// Per-message write options. class WriteOptions { @@ -170,7 +199,7 @@ class CallOpSendInitialMetadata { } void FinishOp(bool* status, int max_message_size) { if (!send_) return; - gpr_free(initial_metadata_); + g_core_codegen_interface->gpr_free(initial_metadata_); send_ = false; } @@ -204,7 +233,7 @@ class CallOpSendMessage { write_options_.Clear(); } void FinishOp(bool* status, int max_message_size) { - if (own_buf_) grpc_byte_buffer_destroy(send_buf_); + if (own_buf_) g_core_codegen_interface->grpc_byte_buffer_destroy(send_buf_); send_buf_ = nullptr; } @@ -254,7 +283,7 @@ class CallOpRecvMessage { max_message_size).ok(); } else { got_message = false; - grpc_byte_buffer_destroy(recv_buf_); + g_core_codegen_interface->grpc_byte_buffer_destroy(recv_buf_); } } else { got_message = false; @@ -321,7 +350,7 @@ class CallOpGenericRecvMessage { *status = deserialize_->Deserialize(recv_buf_, max_message_size).ok(); } else { got_message = false; - grpc_byte_buffer_destroy(recv_buf_); + g_core_codegen_interface->grpc_byte_buffer_destroy(recv_buf_); } } else { got_message = false; @@ -386,7 +415,7 @@ class CallOpServerSendStatus { void FinishOp(bool* status, int max_message_size) { if (!send_status_available_) return; - gpr_free(trailing_metadata_); + g_core_codegen_interface->gpr_free(trailing_metadata_); send_status_available_ = false; } @@ -462,7 +491,7 @@ class CallOpClientRecvStatus { *recv_status_ = Status( static_cast<StatusCode>(status_code_), status_details_ ? grpc::string(status_details_) : grpc::string()); - gpr_free(status_details_); + g_core_codegen_interface->gpr_free(status_details_); recv_status_ = nullptr; } @@ -576,11 +605,22 @@ class SneakyCallOpSet : public CallOpSet<Op1, Op2, Op3, Op4, Op5, Op6> { class Call GRPC_FINAL { public: /* call is owned by the caller */ - Call(grpc_call* call, CallHook* call_hook_, CompletionQueue* cq); - Call(grpc_call* call, CallHook* call_hook_, CompletionQueue* cq, - int max_message_size); - - void PerformOps(CallOpSetInterface* ops); + Call(grpc_call* call, CallHook* call_hook, CompletionQueue* cq) + : call_hook_(call_hook), cq_(cq), call_(call), max_message_size_(-1) {} + + Call(grpc_call* call, CallHook* call_hook, CompletionQueue* cq, + int max_message_size) + : call_hook_(call_hook), + cq_(cq), + call_(call), + max_message_size_(max_message_size) {} + + void PerformOps(CallOpSetInterface* ops) { + if (max_message_size_ > 0) { + ops->set_max_message_size(max_message_size_); + } + call_hook_->PerformOpsOnCall(ops, this); + } grpc_call* call() { return call_; } CompletionQueue* cq() { return cq_; } |