Exemplo n.º 1
0
 public void StartServerStreaming(IReceivedStatusOnClientCallback callback, SliceBufferSafeHandle payload, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags callFlags)
 {
     using (completionQueue.NewScope())
     {
         var ctx = completionQueue.CompletionRegistry.RegisterBatchCompletion(CompletionHandler_IReceivedStatusOnClientCallback, callback);
         Native.grpcsharp_call_start_server_streaming(this, ctx, payload, writeFlags, metadataArray, callFlags).CheckOk();
     }
 }
Exemplo n.º 2
0
 public void StartSendMessage(ISendCompletionCallback callback, SliceBufferSafeHandle payload, WriteFlags writeFlags, bool sendEmptyInitialMetadata)
 {
     using (completionQueue.NewScope())
     {
         var ctx = completionQueue.CompletionRegistry.RegisterBatchCompletion(CompletionHandler_ISendCompletionCallback, callback);
         Native.grpcsharp_call_send_message(this, ctx, payload, writeFlags, sendEmptyInitialMetadata ? 1 : 0).CheckOk();
     }
 }
Exemplo n.º 3
0
 public void StartUnary(IUnaryResponseClientCallback callback, SliceBufferSafeHandle payload, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags callFlags)
 {
     using (completionQueue.NewScope())
     {
         var ctx = completionQueue.CompletionRegistry.RegisterBatchCompletion(CompletionHandler_IUnaryResponseClientCallback, callback);
         Native.grpcsharp_call_start_unary(this, ctx, payload, writeFlags, metadataArray, callFlags)
         .CheckOk();
     }
 }
Exemplo n.º 4
0
        public void StartSendStatusFromServer(ISendStatusFromServerCompletionCallback callback, Status status, MetadataArraySafeHandle metadataArray, bool sendEmptyInitialMetadata,
                                              SliceBufferSafeHandle optionalPayload, WriteFlags writeFlags)
        {
            using (completionQueue.NewScope())
            {
                var ctx = completionQueue.CompletionRegistry.RegisterBatchCompletion(CompletionHandler_ISendStatusFromServerCompletionCallback, callback);

                const int MaxStackAllocBytes = 256;
                int       maxBytes           = MarshalUtils.GetMaxByteCountUTF8(status.Detail);
                if (maxBytes > MaxStackAllocBytes)
                {
                    // pay the extra to get the *actual* size; this could mean that
                    // it ends up fitting on the stack after all, but even if not
                    // it will mean that we ask for a *much* smaller buffer
                    maxBytes = MarshalUtils.GetByteCountUTF8(status.Detail);
                }

                unsafe
                {
                    if (maxBytes <= MaxStackAllocBytes)
                    {   // for small status, we can encode on the stack without touching arrays
                        // note: if init-locals is disabled, it would be more efficient
                        // to just stackalloc[MaxStackAllocBytes]; but by default, since we
                        // expect this to be small and it needs to wipe, just use maxBytes
                        byte *ptr         = stackalloc byte[maxBytes];
                        int   statusBytes = MarshalUtils.GetBytesUTF8(status.Detail, ptr, maxBytes);
                        Native.grpcsharp_call_send_status_from_server(this, ctx, status.StatusCode, new IntPtr(ptr), new UIntPtr((ulong)statusBytes), metadataArray, sendEmptyInitialMetadata ? 1 : 0,
                                                                      optionalPayload, writeFlags).CheckOk();
                    }
                    else
                    {   // for larger status (rare), rent a buffer from the pool and
                        // use that for encoding
                        var statusBuffer = ArrayPool <byte> .Shared.Rent(maxBytes);

                        try
                        {
                            fixed(byte *ptr = statusBuffer)
                            {
                                int statusBytes = MarshalUtils.GetBytesUTF8(status.Detail, ptr, maxBytes);

                                Native.grpcsharp_call_send_status_from_server(this, ctx, status.StatusCode, new IntPtr(ptr), new UIntPtr((ulong)statusBytes), metadataArray, sendEmptyInitialMetadata ? 1 : 0,
                                                                              optionalPayload, writeFlags).CheckOk();
                            }
                        }
                        finally
                        {
                            ArrayPool <byte> .Shared.Return(statusBuffer);
                        }
                    }
                }
            }
        }
Exemplo n.º 5
0
 public void StartUnary(BatchContextSafeHandle ctx, SliceBufferSafeHandle payload, WriteFlags writeFlags, MetadataArraySafeHandle metadataArray, CallFlags callFlags)
 {
     Native.grpcsharp_call_start_unary(this, ctx, payload, writeFlags, metadataArray, callFlags)
     .CheckOk();
 }