From 7a3ac62d9cdd1392b06a4bb94c57a4828ec0b32e Mon Sep 17 00:00:00 2001
From: Jan Tattermusch <jtattermusch@google.com>
Date: Thu, 23 Jul 2015 18:40:48 -0700
Subject: [PATCH] explicitly convert deadline for server handlers to realtime

---
 src/csharp/Grpc.Core/Internal/ServerCallHandler.cs |  4 +++-
 src/csharp/Grpc.Core/Internal/Timespec.cs          | 11 +++++++++++
 src/csharp/ext/grpc_csharp_ext.c                   |  4 ++++
 3 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs b/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs
index 9bbcb17266..93e1c0b294 100644
--- a/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs
+++ b/src/csharp/Grpc.Core/Internal/ServerCallHandler.cs
@@ -297,8 +297,10 @@ namespace Grpc.Core.Internal
 
         public static ServerCallContext NewContext(ServerRpcNew newRpc, CancellationToken cancellationToken)
         {
+            DateTime realtimeDeadline = newRpc.Deadline.ToClockType(GPRClockType.Realtime).ToDateTime();
+
             return new ServerCallContext(
-                newRpc.Method, newRpc.Host, newRpc.Deadline.ToDateTime(),
+                newRpc.Method, newRpc.Host, realtimeDeadline,
                 newRpc.RequestMetadata, cancellationToken);
         }
     }
diff --git a/src/csharp/Grpc.Core/Internal/Timespec.cs b/src/csharp/Grpc.Core/Internal/Timespec.cs
index 0e58e2048d..e83d21f4a4 100644
--- a/src/csharp/Grpc.Core/Internal/Timespec.cs
+++ b/src/csharp/Grpc.Core/Internal/Timespec.cs
@@ -57,6 +57,9 @@ namespace Grpc.Core.Internal
         [DllImport("grpc_csharp_ext.dll")]
         static extern Timespec gprsharp_inf_past(GPRClockType clockType);
 
+        [DllImport("grpc_csharp_ext.dll")]
+        static extern Timespec gprsharp_convert_clock_type(Timespec t, GPRClockType targetClock);
+
         [DllImport("grpc_csharp_ext.dll")]
         static extern int gprsharp_sizeof_timespec();
 
@@ -131,6 +134,14 @@ namespace Grpc.Core.Internal
                 return tv_nsec;
             }
         }
+
+        /// <summary>
+        /// Converts the timespec to desired clock type.
+        /// </summary>
+        public Timespec ToClockType(GPRClockType targetClock)
+        {
+            return gprsharp_convert_clock_type(this, targetClock);
+        }
             
         /// <summary>
         /// Converts Timespec to DateTime.
diff --git a/src/csharp/ext/grpc_csharp_ext.c b/src/csharp/ext/grpc_csharp_ext.c
index 1cc44ebda7..7e30a84a62 100644
--- a/src/csharp/ext/grpc_csharp_ext.c
+++ b/src/csharp/ext/grpc_csharp_ext.c
@@ -445,6 +445,10 @@ GPR_EXPORT gpr_timespec GPR_CALLTYPE gprsharp_inf_past(gpr_clock_type clock_type
   return gpr_inf_past(clock_type);
 }
 
+GPR_EXPORT gpr_timespec GPR_CALLTYPE gprsharp_convert_clock_type(gpr_timespec t, gpr_clock_type target_clock) {
+  return gpr_convert_clock_type(t, target_clock);
+}
+
 GPR_EXPORT gpr_int32 GPR_CALLTYPE gprsharp_sizeof_timespec(void) {
   return sizeof(gpr_timespec);
 }
-- 
GitLab