Call list progress
diff --git a/src/core/channel/http_server_filter.c b/src/core/channel/http_server_filter.c
index 7a9f17d..201adf4 100644
--- a/src/core/channel/http_server_filter.c
+++ b/src/core/channel/http_server_filter.c
@@ -74,8 +74,14 @@
grpc_mdctx *mdctx;
} channel_data;
+typedef struct {
+ grpc_call_element *elem;
+ grpc_call_list *call_list;
+} server_filter_args;
+
static grpc_mdelem *server_filter(void *user_data, grpc_mdelem *md) {
- grpc_call_element *elem = user_data;
+ server_filter_args *a = user_data;
+ grpc_call_element *elem = a->elem;
channel_data *channeld = elem->channel_data;
call_data *calld = elem->call_data;
@@ -118,7 +124,7 @@
/* swallow it and error everything out. */
/* TODO(klempner): We ought to generate more descriptive error messages
on the wire here. */
- grpc_call_element_send_cancel(elem);
+ grpc_call_element_send_cancel(elem, a->call_list);
return NULL;
} else if (md->key == channeld->path_key) {
if (calld->seen_path) {
@@ -144,7 +150,8 @@
}
}
-static void hs_on_recv(void *user_data, int success) {
+static void hs_on_recv(void *user_data, int success,
+ grpc_call_list *call_list) {
grpc_call_element *elem = user_data;
call_data *calld = elem->call_data;
if (success) {
@@ -153,9 +160,12 @@
grpc_stream_op *ops = calld->recv_ops->ops;
for (i = 0; i < nops; i++) {
grpc_stream_op *op = &ops[i];
+ server_filter_args a;
if (op->type != GRPC_OP_METADATA) continue;
calld->got_initial_metadata = 1;
- grpc_metadata_batch_filter(&op->data.metadata, server_filter, elem);
+ a.elem = elem;
+ a.call_list = call_list;
+ grpc_metadata_batch_filter(&op->data.metadata, server_filter, &a);
/* Have we seen the required http2 transport headers?
(:method, :scheme, content-type, with :path and :authority covered
at the channel level right now) */
@@ -180,11 +190,11 @@
}
/* Error this call out */
success = 0;
- grpc_call_element_send_cancel(elem);
+ grpc_call_element_send_cancel(elem, call_list);
}
}
}
- calld->on_done_recv->cb(calld->on_done_recv->cb_arg, success);
+ calld->on_done_recv->cb(calld->on_done_recv->cb_arg, success, call_list);
}
static void hs_mutate_op(grpc_call_element *elem,
@@ -218,10 +228,11 @@
}
static void hs_start_transport_op(grpc_call_element *elem,
- grpc_transport_stream_op *op) {
+ grpc_transport_stream_op *op,
+ grpc_call_list *call_list) {
GRPC_CALL_LOG_OP(GPR_INFO, elem, op);
hs_mutate_op(elem, op);
- grpc_call_next_op(elem, op);
+ grpc_call_next_op(elem, op, call_list);
}
/* Constructor for call_data */
@@ -237,12 +248,14 @@
}
/* Destructor for call_data */
-static void destroy_call_elem(grpc_call_element *elem) {}
+static void destroy_call_elem(grpc_call_element *elem,
+ grpc_call_list *call_list) {}
/* Constructor for channel_data */
static void init_channel_elem(grpc_channel_element *elem, grpc_channel *master,
const grpc_channel_args *args, grpc_mdctx *mdctx,
- int is_first, int is_last) {
+ int is_first, int is_last,
+ grpc_call_list *call_list) {
/* grab pointers to our data from the channel element */
channel_data *channeld = elem->channel_data;
@@ -271,7 +284,8 @@
}
/* Destructor for channel data */
-static void destroy_channel_elem(grpc_channel_element *elem) {
+static void destroy_channel_elem(grpc_channel_element *elem,
+ grpc_call_list *call_list) {
/* grab pointers to our data from the channel element */
channel_data *channeld = elem->channel_data;