aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/surface/server.c
diff options
context:
space:
mode:
authorGravatar Craig Tiller <craig.tiller@gmail.com>2015-06-29 22:42:33 -0700
committerGravatar Craig Tiller <craig.tiller@gmail.com>2015-06-29 22:42:33 -0700
commit49924e0e62d29499874e93f5dcf5976edcf610f4 (patch)
treee0ed5306462b9e38a5887b4389da3f20eb2b1ecb /src/core/surface/server.c
parentff3ae687e1e85d4fb29024c20a17595dce05e51f (diff)
Better handling of cancellation, uri parse errors, and disconnection
Diffstat (limited to 'src/core/surface/server.c')
-rw-r--r--src/core/surface/server.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/core/surface/server.c b/src/core/surface/server.c
index 383c3d921d..703eeaf2bd 100644
--- a/src/core/surface/server.c
+++ b/src/core/surface/server.c
@@ -204,7 +204,9 @@ struct call_data {
typedef struct {
grpc_channel **channels;
+ grpc_channel **disconnects;
size_t num_channels;
+ size_t num_disconnects;
} channel_broadcaster;
#define SERVER_FROM_CALL_ELEM(elem) \
@@ -223,18 +225,28 @@ static void maybe_finish_shutdown(grpc_server *server);
static void channel_broadcaster_init(grpc_server *s, channel_broadcaster *cb) {
channel_data *c;
size_t count = 0;
+ size_t dc_count = 0;
for (c = s->root_channel_data.next; c != &s->root_channel_data;
c = c->next) {
count ++;
+ if (c->num_calls == 0) {
+ dc_count ++;
+ }
}
cb->num_channels = count;
+ cb->num_disconnects = dc_count;
cb->channels = gpr_malloc(sizeof(*cb->channels) * cb->num_channels);
+ cb->disconnects = gpr_malloc(sizeof(*cb->channels) * cb->num_disconnects);
count = 0;
+ dc_count = 0;
for (c = s->root_channel_data.next; c != &s->root_channel_data;
c = c->next) {
- cb->channels[count] = c->channel;
+ cb->channels[count++] = c->channel;
GRPC_CHANNEL_INTERNAL_REF(c->channel, "broadcast");
- count ++;
+ if (c->num_calls == 0) {
+ cb->disconnects[dc_count++] = c->channel;
+ GRPC_CHANNEL_INTERNAL_REF(c->channel, "broadcast-disconnect");
+ }
}
}
@@ -274,10 +286,15 @@ static void channel_broadcaster_shutdown(channel_broadcaster *cb, int send_goawa
size_t i;
for (i = 0; i < cb->num_channels; i++) {
- send_shutdown(cb->channels[i], send_goaway, send_disconnect);
+ send_shutdown(cb->channels[i], 1, 0);
GRPC_CHANNEL_INTERNAL_UNREF(cb->channels[i], "broadcast");
}
+ for (i = 0; i < cb->num_disconnects; i++) {
+ send_shutdown(cb->disconnects[i], 0, 1);
+ GRPC_CHANNEL_INTERNAL_UNREF(cb->channels[i], "broadcast-disconnect");
+ }
gpr_free(cb->channels);
+ gpr_free(cb->disconnects);
}
/* call list */