aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Craig Tiller <craig.tiller@gmail.com>2015-05-26 16:39:13 -0700
committerGravatar Craig Tiller <craig.tiller@gmail.com>2015-05-26 16:39:13 -0700
commitafa2d6342fc7c608141f058a7d4bb0778ae24f53 (patch)
tree0b9c3bb1f5a6eb8cbf79851aa9bfe87bea156903
parentee945e8325ff7d67be6990b6193e19f865ec7b30 (diff)
Fix C core tests
-rw-r--r--src/core/surface/server.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/src/core/surface/server.c b/src/core/surface/server.c
index 69f531fe1d..37ceca43ba 100644
--- a/src/core/surface/server.c
+++ b/src/core/surface/server.c
@@ -902,6 +902,47 @@ void grpc_server_listener_destroy_done(void *s) {
gpr_mu_unlock(&server->mu);
}
+void grpc_server_cancel_all_calls(grpc_server *server) {
+ call_data *calld;
+ grpc_call **calls;
+ size_t call_count;
+ size_t call_capacity;
+ int is_first = 1;
+ size_t i;
+
+ gpr_mu_lock(&server->mu);
+
+ GPR_ASSERT(server->shutdown);
+
+ if (!server->lists[ALL_CALLS]) {
+ gpr_mu_unlock(&server->mu);
+ return;
+ }
+
+ call_capacity = 8;
+ call_count = 0;
+ calls = gpr_malloc(sizeof(grpc_call *) * call_capacity);
+
+ for (calld = server->lists[ALL_CALLS]; calld != server->lists[ALL_CALLS] || is_first; calld = calld->links[ALL_CALLS].next) {
+ if (call_count == call_capacity) {
+ call_capacity *= 2;
+ calls = gpr_realloc(calls, sizeof(grpc_call *) * call_capacity);
+ }
+ calls[call_count++] = calld->call;
+ GRPC_CALL_INTERNAL_REF(calld->call, "cancel_all");
+ is_first = 0;
+ }
+
+ gpr_mu_unlock(&server->mu);
+
+ for (i = 0; i < call_count; i++) {
+ grpc_call_cancel_with_status(calls[i], GRPC_STATUS_UNAVAILABLE, "Unavailable");
+ GRPC_CALL_INTERNAL_UNREF(calls[i], "cancel_all", 1);
+ }
+
+ gpr_free(calls);
+}
+
void grpc_server_destroy(grpc_server *server) {
channel_data *c;
listener *l;