address interview feedback

pull/18327/head
Jan Tattermusch 6 years ago
parent 1ef8bd0944
commit fa33d47da5
  1. 18
      src/csharp/Grpc.Core/Internal/NativeCallbackDispatcher.cs

@ -24,6 +24,7 @@ using System.Runtime.InteropServices;
using System.Threading; using System.Threading;
using System.Collections.Generic; using System.Collections.Generic;
using Grpc.Core.Logging; using Grpc.Core.Logging;
using Grpc.Core.Utils;
namespace Grpc.Core.Internal namespace Grpc.Core.Internal
{ {
@ -34,21 +35,15 @@ namespace Grpc.Core.Internal
internal class NativeCallbackDispatcher internal class NativeCallbackDispatcher
{ {
static readonly ILogger Logger = GrpcEnvironment.Logger.ForType<NativeCallbackDispatcher>(); static readonly ILogger Logger = GrpcEnvironment.Logger.ForType<NativeCallbackDispatcher>();
static readonly object staticLock = new object();
static NativeCallbackDispatcherCallback dispatcherCallback; static NativeCallbackDispatcherCallback dispatcherCallback;
public static void Init(NativeMethods native) public static void Init(NativeMethods native)
{ {
lock (staticLock) GrpcPreconditions.CheckState(dispatcherCallback == null);
{
if (dispatcherCallback == null)
{
dispatcherCallback = new NativeCallbackDispatcherCallback(HandleDispatcherCallback); dispatcherCallback = new NativeCallbackDispatcherCallback(HandleDispatcherCallback);
native.grpcsharp_native_callback_dispatcher_init(dispatcherCallback); native.grpcsharp_native_callback_dispatcher_init(dispatcherCallback);
} }
}
}
public static NativeCallbackRegistration RegisterCallback(UniversalNativeCallback callback) public static NativeCallbackRegistration RegisterCallback(UniversalNativeCallback callback)
{ {
@ -56,18 +51,13 @@ namespace Grpc.Core.Internal
return new NativeCallbackRegistration(gcHandle); return new NativeCallbackRegistration(gcHandle);
} }
private static UniversalNativeCallback GetCallback(IntPtr tag)
{
var gcHandle = GCHandle.FromIntPtr(tag);
return (UniversalNativeCallback) gcHandle.Target;
}
[MonoPInvokeCallback(typeof(NativeCallbackDispatcherCallback))] [MonoPInvokeCallback(typeof(NativeCallbackDispatcherCallback))]
private static int HandleDispatcherCallback(IntPtr tag, IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr arg4, IntPtr arg5) private static int HandleDispatcherCallback(IntPtr tag, IntPtr arg0, IntPtr arg1, IntPtr arg2, IntPtr arg3, IntPtr arg4, IntPtr arg5)
{ {
try try
{ {
var callback = GetCallback(tag); var gcHandle = GCHandle.FromIntPtr(tag);
var callback = (UniversalNativeCallback) gcHandle.Target;
return callback(arg0, arg1, arg2, arg3, arg4, arg5); return callback(arg0, arg1, arg2, arg3, arg4, arg5);
} }
catch (Exception e) catch (Exception e)

Loading…
Cancel
Save