Просмотр исходного кода

Move _all_ completion queue shutdown operations into the Swift layer, to better enforce that the queue does not accept any new operations once it has been shut down.

Daniel Alm 7 лет назад
Родитель
Сommit
2577eae9db

+ 0 - 2
Sources/CgRPC/shim/channel.c

@@ -69,8 +69,6 @@ cgrpc_channel *cgrpc_channel_create_secure(const char *address,
 void cgrpc_channel_destroy(cgrpc_channel *c) {
   grpc_channel_destroy(c->channel);
   c->channel = NULL;
-
-  grpc_completion_queue_shutdown(c->completion_queue);
   free(c);
 }
 

+ 0 - 1
Sources/CgRPC/shim/handler.c

@@ -32,7 +32,6 @@ cgrpc_handler *cgrpc_handler_create_with_server(cgrpc_server *server) {
 }
 
 void cgrpc_handler_destroy(cgrpc_handler *h) {
-  grpc_completion_queue_shutdown(h->completion_queue);
   grpc_metadata_array_destroy(&(h->request_metadata_recv));
   grpc_call_details_destroy(&(h->call_details));
   if (h->server_call) {

+ 0 - 2
Sources/CgRPC/shim/server.c

@@ -75,8 +75,6 @@ void cgrpc_server_destroy(cgrpc_server *server) {
   }
   grpc_server_destroy(server->server);
   server->server = NULL;
-
-  grpc_completion_queue_shutdown(server->completion_queue);
 }
 
 void cgrpc_server_start(cgrpc_server *server) {

+ 1 - 1
Sources/SwiftGRPC/Core/Channel.swift

@@ -66,8 +66,8 @@ public class Channel {
   }
 
   deinit {
-    completionQueue.shutdown()
     cgrpc_channel_destroy(underlyingChannel)
+    completionQueue.shutdown()
   }
 
   /// Constructs a Call object to make a gRPC API call

+ 8 - 2
Sources/SwiftGRPC/Core/CompletionQueue.swift

@@ -162,9 +162,15 @@ class CompletionQueue {
 
   /// Shuts down a completion queue
   func shutdown() {
+    var needsShutdown = false
     operationGroupsMutex.synchronize {
-      hasBeenShutdown = true
+      if !hasBeenShutdown {
+        needsShutdown = true
+        hasBeenShutdown = true
+      }
+    }
+    if needsShutdown {
+      cgrpc_completion_queue_shutdown(underlyingCompletionQueue)
     }
-    cgrpc_completion_queue_shutdown(underlyingCompletionQueue)
   }
 }

+ 3 - 0
Sources/SwiftGRPC/Core/Handler.swift

@@ -70,6 +70,9 @@ public class Handler {
   }
 
   deinit {
+    // Technically unnecessary, because the handler only gets released once the completion queue has already been
+    // shut down, but it doesn't hurt to keep this here.
+    completionQueue.shutdown()
     cgrpc_handler_destroy(self.underlyingHandler)
   }
 

+ 1 - 0
Sources/SwiftGRPC/Core/Server.swift

@@ -58,6 +58,7 @@ public class Server {
 
   deinit {
     cgrpc_server_destroy(underlyingServer)
+    completionQueue.shutdown()
   }
 
   /// Run the server