| 
					
				 | 
			
			
				@@ -32,6 +32,21 @@ namespace Grpc.Core.Internal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         public static readonly CallSafeHandle NullInstance = new CallSafeHandle(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         static readonly NativeMethods Native = NativeMethods.Get(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // Completion handlers are pre-allocated to avoid unneccessary delegate allocations. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // The "state" field is used to store the actual callback to invoke. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static readonly BatchCompletionDelegate CompletionHandler_IUnaryResponseClientCallback = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (success, context, state) => ((IUnaryResponseClientCallback)state).OnUnaryResponseClient(success, context.GetReceivedStatusOnClient(), context.GetReceivedMessage(), context.GetReceivedInitialMetadata()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static readonly BatchCompletionDelegate CompletionHandler_IReceivedStatusOnClientCallback = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (success, context, state) => ((IReceivedStatusOnClientCallback)state).OnReceivedStatusOnClient(success, context.GetReceivedStatusOnClient()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static readonly BatchCompletionDelegate CompletionHandler_IReceivedMessageCallback = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (success, context, state) => ((IReceivedMessageCallback)state).OnReceivedMessage(success, context.GetReceivedMessage()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static readonly BatchCompletionDelegate CompletionHandler_IReceivedResponseHeadersCallback = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (success, context, state) => ((IReceivedResponseHeadersCallback)state).OnReceivedResponseHeaders(success, context.GetReceivedInitialMetadata()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static readonly BatchCompletionDelegate CompletionHandler_ISendCompletionCallback = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (success, context, state) => ((ISendCompletionCallback)state).OnSendCompletion(success); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        static readonly BatchCompletionDelegate CompletionHandler_IReceivedCloseOnServerCallback = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            (success, context, state) => ((IReceivedCloseOnServerCallback)state).OnReceivedCloseOnServerHandler(success, context.GetReceivedCloseOnServerCancelled()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         const uint GRPC_WRITE_BUFFER_HINT = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         CompletionQueueSafeHandle completionQueue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -49,12 +64,12 @@ namespace Grpc.Core.Internal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             Native.grpcsharp_call_set_credentials(this, credentials).CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public void StartUnary(UnaryResponseClientHandler callback, byte[] payload, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags callFlags) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void StartUnary(IUnaryResponseClientCallback callback, byte[] payload, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags callFlags) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             using (completionQueue.NewScope()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var ctx = BatchContextSafeHandle.Create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient(), context.GetReceivedMessage(), context.GetReceivedInitialMetadata())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, CompletionHandler_IUnaryResponseClientCallback, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Native.grpcsharp_call_start_unary(this, ctx, payload, new UIntPtr((ulong)payload.Length), writeFlags, metadataArray, callFlags) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     .CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -71,101 +86,101 @@ namespace Grpc.Core.Internal 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             using (completionQueue.NewScope()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var ctx = BatchContextSafeHandle.Create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient(), context.GetReceivedMessage(), context.GetReceivedInitialMetadata())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, CompletionHandler_IUnaryResponseClientCallback, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Native.grpcsharp_call_start_client_streaming(this, ctx, metadataArray, callFlags).CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public void StartServerStreaming(ReceivedStatusOnClientHandler callback, byte[] payload, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags callFlags) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void StartServerStreaming(IReceivedStatusOnClientCallback callback, byte[] payload, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags callFlags) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             using (completionQueue.NewScope()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var ctx = BatchContextSafeHandle.Create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, CompletionHandler_IReceivedStatusOnClientCallback, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Native.grpcsharp_call_start_server_streaming(this, ctx, payload, new UIntPtr((ulong)payload.Length), writeFlags, metadataArray, callFlags).CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public void StartDuplexStreaming(ReceivedStatusOnClientHandler callback, MetadataArraySafeHandle metadataArray, CallFlags callFlags) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void StartDuplexStreaming(IReceivedStatusOnClientCallback callback, MetadataArraySafeHandle metadataArray, CallFlags callFlags) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             using (completionQueue.NewScope()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var ctx = BatchContextSafeHandle.Create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedStatusOnClient())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, CompletionHandler_IReceivedStatusOnClientCallback, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Native.grpcsharp_call_start_duplex_streaming(this, ctx, metadataArray, callFlags).CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public void StartSendMessage(SendCompletionHandler callback, byte[] payload, WriteFlags writeFlags, bool sendEmptyInitialMetadata) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void StartSendMessage(ISendCompletionCallback callback, byte[] payload, WriteFlags writeFlags, bool sendEmptyInitialMetadata) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             using (completionQueue.NewScope()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var ctx = BatchContextSafeHandle.Create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, CompletionHandler_ISendCompletionCallback, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Native.grpcsharp_call_send_message(this, ctx, payload, new UIntPtr((ulong)payload.Length), writeFlags, sendEmptyInitialMetadata ? 1 : 0).CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public void StartSendCloseFromClient(SendCompletionHandler callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void StartSendCloseFromClient(ISendCompletionCallback callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             using (completionQueue.NewScope()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var ctx = BatchContextSafeHandle.Create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, CompletionHandler_ISendCompletionCallback, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Native.grpcsharp_call_send_close_from_client(this, ctx).CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public void StartSendStatusFromServer(SendCompletionHandler callback, Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void StartSendStatusFromServer(ISendCompletionCallback callback, Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             byte[] optionalPayload, WriteFlags writeFlags) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             using (completionQueue.NewScope()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var ctx = BatchContextSafeHandle.Create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var optionalPayloadLength = optionalPayload != null ? new UIntPtr((ulong)optionalPayload.Length) : UIntPtr.Zero; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, CompletionHandler_ISendCompletionCallback, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var statusDetailBytes = MarshalUtils.GetBytesUTF8(status.Detail); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Native.grpcsharp_call_send_status_from_server(this, ctx, status.StatusCode, statusDetailBytes, new UIntPtr((ulong)statusDetailBytes.Length), metadataArray, sendEmptyInitialMetadata ? 1 : 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                     optionalPayload, optionalPayloadLength, writeFlags).CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public void StartReceiveMessage(ReceivedMessageHandler callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void StartReceiveMessage(IReceivedMessageCallback callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             using (completionQueue.NewScope()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var ctx = BatchContextSafeHandle.Create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedMessage())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, CompletionHandler_IReceivedMessageCallback, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Native.grpcsharp_call_recv_message(this, ctx).CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public void StartReceiveInitialMetadata(ReceivedResponseHeadersHandler callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void StartReceiveInitialMetadata(IReceivedResponseHeadersCallback callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             using (completionQueue.NewScope()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var ctx = BatchContextSafeHandle.Create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedInitialMetadata())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, CompletionHandler_IReceivedResponseHeadersCallback, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Native.grpcsharp_call_recv_initial_metadata(this, ctx).CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public void StartServerSide(ReceivedCloseOnServerHandler callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void StartServerSide(IReceivedCloseOnServerCallback callback) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             using (completionQueue.NewScope()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var ctx = BatchContextSafeHandle.Create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success, context.GetReceivedCloseOnServerCancelled())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, CompletionHandler_IReceivedCloseOnServerCallback, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Native.grpcsharp_call_start_serverside(this, ctx).CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        public void StartSendInitialMetadata(SendCompletionHandler callback, MetadataArraySafeHandle metadataArray) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void StartSendInitialMetadata(ISendCompletionCallback callback, MetadataArraySafeHandle metadataArray) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             using (completionQueue.NewScope()) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 var ctx = BatchContextSafeHandle.Create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, (success, context) => callback(success)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                completionQueue.CompletionRegistry.RegisterBatchCompletion(ctx, CompletionHandler_ISendCompletionCallback, callback); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Native.grpcsharp_call_send_initial_metadata(this, ctx, metadataArray).CheckOk(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 |