|
|
|
@ -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(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|