Merge pull request #15649 from markdroth/avoid_peer_string_alloc

Avoid allocating the peer string returned from the transport.
pull/14879/head
Mark D. Roth 7 years ago committed by GitHub
commit 0cdf00839b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 12
      src/core/ext/transport/chttp2/transport/chttp2_transport.cc
  2. 1
      src/core/lib/surface/call.cc
  3. 12
      src/core/lib/transport/transport.h

@ -1451,10 +1451,8 @@ static void perform_stream_op_locked(void* stream_op,
} }
} }
if (op_payload->send_initial_metadata.peer_string != nullptr) { if (op_payload->send_initial_metadata.peer_string != nullptr) {
char* old_peer_string = (char*)gpr_atm_full_xchg( gpr_atm_rel_store(op_payload->send_initial_metadata.peer_string,
op_payload->send_initial_metadata.peer_string, (gpr_atm)t->peer_string);
(gpr_atm)gpr_strdup(t->peer_string));
gpr_free(old_peer_string);
} }
} }
@ -1569,10 +1567,8 @@ static void perform_stream_op_locked(void* stream_op,
s->trailing_metadata_available = s->trailing_metadata_available =
op_payload->recv_initial_metadata.trailing_metadata_available; op_payload->recv_initial_metadata.trailing_metadata_available;
if (op_payload->recv_initial_metadata.peer_string != nullptr) { if (op_payload->recv_initial_metadata.peer_string != nullptr) {
char* old_peer_string = (char*)gpr_atm_full_xchg( gpr_atm_rel_store(op_payload->recv_initial_metadata.peer_string,
op_payload->recv_initial_metadata.peer_string, (gpr_atm)t->peer_string);
(gpr_atm)gpr_strdup(t->peer_string));
gpr_free(old_peer_string);
} }
grpc_chttp2_maybe_complete_recv_initial_metadata(t, s); grpc_chttp2_maybe_complete_recv_initial_metadata(t, s);
} }

@ -516,7 +516,6 @@ static void release_call(void* call, grpc_error* error) {
grpc_call* c = static_cast<grpc_call*>(call); grpc_call* c = static_cast<grpc_call*>(call);
grpc_channel* channel = c->channel; grpc_channel* channel = c->channel;
grpc_call_combiner_destroy(&c->call_combiner); grpc_call_combiner_destroy(&c->call_combiner);
gpr_free((char*)c->peer_string);
grpc_channel_update_call_size_estimate(channel, gpr_arena_destroy(c->arena)); grpc_channel_update_call_size_estimate(channel, gpr_arena_destroy(c->arena));
GRPC_CHANNEL_INTERNAL_UNREF(channel, "call"); GRPC_CHANNEL_INTERNAL_UNREF(channel, "call");
} }

@ -168,13 +168,11 @@ struct grpc_transport_stream_op_batch_payload {
/** Iff send_initial_metadata != NULL, flags associated with /** Iff send_initial_metadata != NULL, flags associated with
send_initial_metadata: a bitfield of GRPC_INITIAL_METADATA_xxx */ send_initial_metadata: a bitfield of GRPC_INITIAL_METADATA_xxx */
uint32_t send_initial_metadata_flags; uint32_t send_initial_metadata_flags;
// If non-NULL, will be set by the transport to the peer string // If non-NULL, will be set by the transport to the peer string (a char*).
// (a char*, which the caller takes ownership of). // The transport retains ownership of the string.
// Note: This pointer may be used by the transport after the // Note: This pointer may be used by the transport after the
// send_initial_metadata op is completed. It must remain valid // send_initial_metadata op is completed. It must remain valid
// until the call is destroyed. // until the call is destroyed.
// Note: When a transport sets this, it must free the previous
// value, if any.
gpr_atm* peer_string; gpr_atm* peer_string;
} send_initial_metadata; } send_initial_metadata;
@ -202,13 +200,11 @@ struct grpc_transport_stream_op_batch_payload {
// immediately available. This may be a signal that we received a // immediately available. This may be a signal that we received a
// Trailers-Only response. // Trailers-Only response.
bool* trailing_metadata_available; bool* trailing_metadata_available;
// If non-NULL, will be set by the transport to the peer string // If non-NULL, will be set by the transport to the peer string (a char*).
// (a char*, which the caller takes ownership of). // The transport retains ownership of the string.
// Note: This pointer may be used by the transport after the // Note: This pointer may be used by the transport after the
// recv_initial_metadata op is completed. It must remain valid // recv_initial_metadata op is completed. It must remain valid
// until the call is destroyed. // until the call is destroyed.
// Note: When a transport sets this, it must free the previous
// value, if any.
gpr_atm* peer_string; gpr_atm* peer_string;
} recv_initial_metadata; } recv_initial_metadata;

Loading…
Cancel
Save