Reviewer comments

pull/16407/head
ncteisen 7 years ago
parent 743d40d635
commit ca77fcd7cd
  1. 2
      include/grpcpp/impl/codegen/client_context.h
  2. 36
      include/grpcpp/impl/codegen/metadata_map.h
  3. 1
      include/grpcpp/impl/codegen/server_context.h

@ -202,7 +202,6 @@ class ClientContext {
const std::multimap<grpc::string_ref, grpc::string_ref>& const std::multimap<grpc::string_ref, grpc::string_ref>&
GetServerInitialMetadata() const { GetServerInitialMetadata() const {
GPR_CODEGEN_ASSERT(initial_metadata_received_); GPR_CODEGEN_ASSERT(initial_metadata_received_);
recv_initial_metadata_.FillMap();
return *recv_initial_metadata_.map(); return *recv_initial_metadata_.map();
} }
@ -215,7 +214,6 @@ class ClientContext {
const std::multimap<grpc::string_ref, grpc::string_ref>& const std::multimap<grpc::string_ref, grpc::string_ref>&
GetServerTrailingMetadata() const { GetServerTrailingMetadata() const {
// TODO(yangg) check finished // TODO(yangg) check finished
trailing_metadata_.FillMap();
return *trailing_metadata_.map(); return *trailing_metadata_.map();
} }

@ -19,6 +19,7 @@
#ifndef GRPCPP_IMPL_CODEGEN_METADATA_MAP_H #ifndef GRPCPP_IMPL_CODEGEN_METADATA_MAP_H
#define GRPCPP_IMPL_CODEGEN_METADATA_MAP_H #define GRPCPP_IMPL_CODEGEN_METADATA_MAP_H
#include <grpc/impl/codegen/log.h>
#include <grpc/slice.h> #include <grpc/slice.h>
#include <grpcpp/impl/codegen/slice.h> #include <grpcpp/impl/codegen/slice.h>
@ -37,8 +38,8 @@ class MetadataMap {
} }
grpc::string GetBinaryErrorDetails() { grpc::string GetBinaryErrorDetails() {
// if filled, extract from the multimap for O(log(n)) // if filled_, extract from the multimap for O(log(n))
if (filled) { if (filled_) {
auto iter = map_.find(kBinaryErrorDetailsKey); auto iter = map_.find(kBinaryErrorDetailsKey);
if (iter != map_.end()) { if (iter != map_.end()) {
return grpc::string(iter->second.begin(), iter->second.length()); return grpc::string(iter->second.begin(), iter->second.length());
@ -46,9 +47,12 @@ class MetadataMap {
} }
// if not yet filled, take the O(n) lookup to avoid allocating the // if not yet filled, take the O(n) lookup to avoid allocating the
// multimap until it is requested. // multimap until it is requested.
// TODO(ncteisen): plumb this through core as a first class object, just
// like code and message.
else { else {
for (size_t i = 0; i < arr_.count; i++) { for (size_t i = 0; i < arr_.count; i++) {
if (grpc_slice_str_cmp(arr_.metadata[i].key, kBinaryErrorDetailsKey)) { if (grpc_slice_str_cmp(arr_.metadata[i].key, kBinaryErrorDetailsKey) ==
0) {
return grpc::string(reinterpret_cast<const char*>( return grpc::string(reinterpret_cast<const char*>(
GRPC_SLICE_START_PTR(arr_.metadata[i].value)), GRPC_SLICE_START_PTR(arr_.metadata[i].value)),
GRPC_SLICE_LENGTH(arr_.metadata[i].value)); GRPC_SLICE_LENGTH(arr_.metadata[i].value));
@ -58,9 +62,20 @@ class MetadataMap {
return grpc::string(); return grpc::string();
} }
std::multimap<grpc::string_ref, grpc::string_ref>* map() {
FillMap();
return &map_;
}
grpc_metadata_array* arr() { return &arr_; }
private:
bool filled_ = false;
grpc_metadata_array arr_;
std::multimap<grpc::string_ref, grpc::string_ref> map_;
void FillMap() { void FillMap() {
if (filled) return; if (filled_) return;
filled = true; filled_ = true;
for (size_t i = 0; i < arr_.count; i++) { for (size_t i = 0; i < arr_.count; i++) {
// TODO(yangg) handle duplicates? // TODO(yangg) handle duplicates?
map_.insert(std::pair<grpc::string_ref, grpc::string_ref>( map_.insert(std::pair<grpc::string_ref, grpc::string_ref>(
@ -68,17 +83,6 @@ class MetadataMap {
StringRefFromSlice(&arr_.metadata[i].value))); StringRefFromSlice(&arr_.metadata[i].value)));
} }
} }
std::multimap<grpc::string_ref, grpc::string_ref>* map() { return &map_; }
const std::multimap<grpc::string_ref, grpc::string_ref>* map() const {
return &map_;
}
grpc_metadata_array* arr() { return &arr_; }
private:
bool filled = false;
grpc_metadata_array arr_;
std::multimap<grpc::string_ref, grpc::string_ref> map_;
}; };
} // namespace internal } // namespace internal

@ -169,7 +169,6 @@ class ServerContext {
/// \return A multimap of initial metadata key-value pairs from the server. /// \return A multimap of initial metadata key-value pairs from the server.
const std::multimap<grpc::string_ref, grpc::string_ref>& client_metadata() const std::multimap<grpc::string_ref, grpc::string_ref>& client_metadata()
const { const {
client_metadata_.FillMap();
return *client_metadata_.map(); return *client_metadata_.map();
} }

Loading…
Cancel
Save