aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/transport/chttp2_transport.c
diff options
context:
space:
mode:
authorGravatar Craig Tiller <craig.tiller@gmail.com>2015-06-30 16:24:26 -0700
committerGravatar Craig Tiller <craig.tiller@gmail.com>2015-06-30 16:24:26 -0700
commitcdbdbc027a3676f3674886e6290fd00a4f73f943 (patch)
tree917f6b14b13b21c8731bcf7347c4076afa78faf5 /src/core/transport/chttp2_transport.c
parent079a11bb9b253e91c89e625950ea09879d2d6f8e (diff)
parent3e57357aff574e54aaeeaae98c3e5aac41b50e63 (diff)
Merge github.com:grpc/grpc into tis-but-thy-name
Conflicts: test/core/end2end/tests/request_with_flags.c
Diffstat (limited to 'src/core/transport/chttp2_transport.c')
-rw-r--r--src/core/transport/chttp2_transport.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/src/core/transport/chttp2_transport.c b/src/core/transport/chttp2_transport.c
index d8001d6c32..98cb5203d0 100644
--- a/src/core/transport/chttp2_transport.c
+++ b/src/core/transport/chttp2_transport.c
@@ -51,8 +51,6 @@
#include "src/core/transport/chttp2/timeout_encoding.h"
#include "src/core/transport/transport_impl.h"
-/* #define REFCOUNTING_DEBUG */
-
#define DEFAULT_WINDOW 65535
#define DEFAULT_CONNECTION_WINDOW_TARGET (1024 * 1024)
#define MAX_WINDOW 0x7fffffffu
@@ -408,6 +406,8 @@ static void destroy_stream(grpc_transport *gt, grpc_stream *gs) {
grpc_chttp2_data_parser_destroy(&s->parsing.data_parser);
grpc_chttp2_incoming_metadata_buffer_destroy(&s->parsing.incoming_metadata);
grpc_chttp2_incoming_metadata_buffer_destroy(&s->global.incoming_metadata);
+ grpc_chttp2_incoming_metadata_live_op_buffer_end(
+ &s->global.outstanding_metadata);
UNREF_TRANSPORT(t, "stream");
}
@@ -863,11 +863,22 @@ static void update_global_window(void *args, gpr_uint32 id, void *stream) {
stream_global->outgoing_window += t->parsing.initial_window_update;
}
+static void read_error_locked(grpc_chttp2_transport *t) {
+ t->endpoint_reading = 0;
+ if (!t->writing_active && t->ep) {
+ grpc_endpoint_destroy(t->ep);
+ t->ep = NULL;
+ /* safe as we still have a ref for read */
+ UNREF_TRANSPORT(t, "disconnect");
+ }
+}
+
/* tcp read callback */
static void recv_data(void *tp, gpr_slice *slices, size_t nslices,
grpc_endpoint_cb_status error) {
grpc_chttp2_transport *t = tp;
size_t i;
+ int unref = 0;
switch (error) {
case GRPC_ENDPOINT_CB_SHUTDOWN:
@@ -875,15 +886,9 @@ static void recv_data(void *tp, gpr_slice *slices, size_t nslices,
case GRPC_ENDPOINT_CB_ERROR:
lock(t);
drop_connection(t);
- t->endpoint_reading = 0;
- if (!t->writing_active && t->ep) {
- grpc_endpoint_destroy(t->ep);
- t->ep = NULL;
- UNREF_TRANSPORT(
- t, "disconnect"); /* safe as we still have a ref for read */
- }
+ read_error_locked(t);
unlock(t);
- UNREF_TRANSPORT(t, "recv_data");
+ unref = 1;
for (i = 0; i < nslices; i++) gpr_slice_unref(slices[i]);
break;
case GRPC_ENDPOINT_CB_OK:
@@ -920,15 +925,22 @@ static void recv_data(void *tp, gpr_slice *slices, size_t nslices,
}
if (i == nslices) {
grpc_chttp2_schedule_closure(&t->global, &t->reading_action, 1);
+ } else {
+ read_error_locked(t);
+ unref = 1;
}
unlock(t);
for (; i < nslices; i++) gpr_slice_unref(slices[i]);
break;
}
+ if (unref) {
+ UNREF_TRANSPORT(t, "recv_data");
+ }
}
static void reading_action(void *pt, int iomgr_success_ignored) {
grpc_chttp2_transport *t = pt;
+ gpr_log(GPR_DEBUG, "reading_action");
grpc_endpoint_notify_on_read(t->ep, recv_data, t);
}