aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/transport
diff options
context:
space:
mode:
authorGravatar Craig Tiller <craig.tiller@gmail.com>2015-02-04 17:28:12 -0800
committerGravatar Craig Tiller <craig.tiller@gmail.com>2015-02-04 17:28:12 -0800
commit98ffd178d2c7b1bb43eb7c77489c35a822cca307 (patch)
tree8ea49ba0341e783eab973a9bda338b919d941d63 /src/core/transport
parent82a45834ec75771deebcdfa24ea15c7d76a05943 (diff)
parent5ea99bb81cf34ed721e915bfabd9b974e361e382 (diff)
Merge pull request #398 from nicolasnoble/http2-read-first
Let the http2 transport issue a read request before pumping bytes into it.
Diffstat (limited to 'src/core/transport')
-rw-r--r--src/core/transport/chttp2_transport.c17
1 files changed, 11 insertions, 6 deletions
diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c
index f560417617..e4be21ba2d 100644
--- a/src/core/transport/chttp2_transport.c
+++ b/src/core/transport/chttp2_transport.c
@@ -328,6 +328,9 @@ static void maybe_start_some_streams(transport *t);
static void become_skip_parser(transport *t);
+static void recv_data(void *tp, gpr_slice *slices, size_t nslices,
+ grpc_endpoint_cb_status error);
+
/*
* CONSTRUCTION/DESTRUCTION/REFCOUNTING
*/
@@ -382,8 +385,8 @@ static void ref_transport(transport *t) { gpr_ref(&t->refs); }
static void init_transport(transport *t, grpc_transport_setup_callback setup,
void *arg, const grpc_channel_args *channel_args,
- grpc_endpoint *ep, grpc_mdctx *mdctx,
- int is_client) {
+ grpc_endpoint *ep, gpr_slice *slices, size_t nslices,
+ grpc_mdctx *mdctx, int is_client) {
size_t i;
int j;
grpc_transport_setup_result sr;
@@ -422,6 +425,7 @@ static void init_transport(transport *t, grpc_transport_setup_callback setup,
gpr_slice_buffer_init(&t->outbuf);
gpr_slice_buffer_init(&t->qbuf);
grpc_sopb_init(&t->nuke_later_sopb);
+ grpc_chttp2_hpack_parser_init(&t->hpack_parser, t->metadata_context);
if (is_client) {
gpr_slice_buffer_add(&t->qbuf,
gpr_slice_from_copied_string(CLIENT_CONNECT_STRING));
@@ -476,12 +480,14 @@ static void init_transport(transport *t, grpc_transport_setup_callback setup,
ref_transport(t);
gpr_mu_unlock(&t->mu);
+ ref_transport(t);
+ recv_data(t, slices, nslices, GRPC_ENDPOINT_CB_OK);
+
sr = setup(arg, &t->base, t->metadata_context);
lock(t);
t->cb = sr.callbacks;
t->cb_user_data = sr.user_data;
- grpc_chttp2_hpack_parser_init(&t->hpack_parser, t->metadata_context);
t->calling_back = 0;
gpr_cv_broadcast(&t->cv);
unlock(t);
@@ -1769,7 +1775,6 @@ void grpc_create_chttp2_transport(grpc_transport_setup_callback setup,
size_t nslices, grpc_mdctx *mdctx,
int is_client) {
transport *t = gpr_malloc(sizeof(transport));
- init_transport(t, setup, arg, channel_args, ep, mdctx, is_client);
- ref_transport(t);
- recv_data(t, slices, nslices, GRPC_ENDPOINT_CB_OK);
+ init_transport(t, setup, arg, channel_args, ep, slices, nslices, mdctx,
+ is_client);
}