Skip to content
Snippets Groups Projects
Commit c3555ce6 authored by Nicolas Noble's avatar Nicolas Noble
Browse files

Merge pull request #705 from ctiller/fd_shutdown

Fix a double-close in the server code.
parents 8883e94e d75fe665
No related branches found
No related tags found
No related merge requests found
...@@ -291,7 +291,7 @@ static void orphan_channel(channel_data *chand) { ...@@ -291,7 +291,7 @@ static void orphan_channel(channel_data *chand) {
static void finish_destroy_channel(void *cd, int success) { static void finish_destroy_channel(void *cd, int success) {
channel_data *chand = cd; channel_data *chand = cd;
grpc_server *server = chand->server; grpc_server *server = chand->server;
grpc_channel_destroy(chand->channel); grpc_channel_internal_unref(chand->channel);
server_unref(server); server_unref(server);
} }
......
...@@ -191,6 +191,7 @@ struct transport { ...@@ -191,6 +191,7 @@ struct transport {
gpr_uint8 writing; gpr_uint8 writing;
gpr_uint8 calling_back; gpr_uint8 calling_back;
gpr_uint8 destroying; gpr_uint8 destroying;
gpr_uint8 closed;
error_state error_state; error_state error_state;
/* stream indexing */ /* stream indexing */
...@@ -416,6 +417,7 @@ static void init_transport(transport *t, grpc_transport_setup_callback setup, ...@@ -416,6 +417,7 @@ static void init_transport(transport *t, grpc_transport_setup_callback setup,
t->next_stream_id = is_client ? 1 : 2; t->next_stream_id = is_client ? 1 : 2;
t->last_incoming_stream_id = 0; t->last_incoming_stream_id = 0;
t->destroying = 0; t->destroying = 0;
t->closed = 0;
t->is_client = is_client; t->is_client = is_client;
t->outgoing_window = DEFAULT_WINDOW; t->outgoing_window = DEFAULT_WINDOW;
t->incoming_window = DEFAULT_WINDOW; t->incoming_window = DEFAULT_WINDOW;
...@@ -521,6 +523,8 @@ static void destroy_transport(grpc_transport *gt) { ...@@ -521,6 +523,8 @@ static void destroy_transport(grpc_transport *gt) {
static void close_transport(grpc_transport *gt) { static void close_transport(grpc_transport *gt) {
transport *t = (transport *)gt; transport *t = (transport *)gt;
gpr_mu_lock(&t->mu); gpr_mu_lock(&t->mu);
GPR_ASSERT(!t->closed);
t->closed = 1;
if (t->ep) { if (t->ep) {
grpc_endpoint_shutdown(t->ep); grpc_endpoint_shutdown(t->ep);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment