From 8ae189bbab2a401f93ce5109a746ea46b4cc55c8 Mon Sep 17 00:00:00 2001
From: zeliard <spacesun@naver.com>
Date: Thu, 23 Apr 2015 16:26:05 +0900
Subject: [PATCH] 64bit support on Windows

---
 include/grpc/support/time.h     | 4 ++++
 src/core/support/alloc.c        | 5 +++++
 src/core/support/slice_buffer.c | 2 +-
 src/core/support/time.c         | 4 ++--
 src/core/support/time_win32.c   | 2 +-
 5 files changed, 13 insertions(+), 4 deletions(-)

diff --git a/include/grpc/support/time.h b/include/grpc/support/time.h
index 1fd3181859..3e40f2b81e 100644
--- a/include/grpc/support/time.h
+++ b/include/grpc/support/time.h
@@ -47,7 +47,11 @@ extern "C" {
 
 typedef struct gpr_timespec {
     time_t tv_sec;
+#if defined(GPR_WIN32) && defined(GPR_ARCH_64)
+	__int64 tv_nsec;
+#else
     int tv_nsec;
+#endif
 } gpr_timespec;
 
 /* Time constants. */
diff --git a/src/core/support/alloc.c b/src/core/support/alloc.c
index a19a0141d4..acd2432efb 100644
--- a/src/core/support/alloc.c
+++ b/src/core/support/alloc.c
@@ -55,7 +55,12 @@ void *gpr_realloc(void *p, size_t size) {
 }
 
 void *gpr_malloc_aligned(size_t size, size_t alignment_log) {
+#if defined(GPR_WIN32) && defined(GPR_ARCH_64)
+  size_t alignment = 1ULL << alignment_log;
+#else
   size_t alignment = 1 << alignment_log;
+#endif
+
   size_t extra = alignment - 1 + sizeof(void *);
   void *p = gpr_malloc(size + extra);
   void **ret = (void **)(((gpr_uintptr)p + extra) & ~(alignment - 1));
diff --git a/src/core/support/slice_buffer.c b/src/core/support/slice_buffer.c
index 3b1daa07c5..a26dc1eefb 100644
--- a/src/core/support/slice_buffer.c
+++ b/src/core/support/slice_buffer.c
@@ -117,7 +117,7 @@ void gpr_slice_buffer_add(gpr_slice_buffer *sb, gpr_slice s) {
                s.data.inlined.bytes, s.data.inlined.length);
         back->data.inlined.length += s.data.inlined.length;
       } else {
-        size_t cp1 = GPR_SLICE_INLINED_SIZE - back->data.inlined.length;
+		gpr_uint32 cp1 = GPR_SLICE_INLINED_SIZE - back->data.inlined.length;
         memcpy(back->data.inlined.bytes + back->data.inlined.length,
                s.data.inlined.bytes, cp1);
         back->data.inlined.length = GPR_SLICE_INLINED_SIZE;
diff --git a/src/core/support/time.c b/src/core/support/time.c
index 7dbf95059f..9af81b742d 100644
--- a/src/core/support/time.c
+++ b/src/core/support/time.c
@@ -237,7 +237,7 @@ int gpr_time_similar(gpr_timespec a, gpr_timespec b, gpr_timespec threshold) {
 gpr_int32 gpr_time_to_millis(gpr_timespec t) {
   if (t.tv_sec >= 2147483) {
     if (t.tv_sec == 2147483 && t.tv_nsec < 648 * GPR_NS_PER_MS) {
-      return 2147483 * GPR_MS_PER_SEC + t.tv_nsec / GPR_NS_PER_MS;
+	  return 2147483 * GPR_MS_PER_SEC + (gpr_int32)t.tv_nsec / GPR_NS_PER_MS;
     }
     return 2147483647;
   } else if (t.tv_sec <= -2147483) {
@@ -245,7 +245,7 @@ gpr_int32 gpr_time_to_millis(gpr_timespec t) {
        care?) */
     return -2147483647;
   } else {
-    return t.tv_sec * GPR_MS_PER_SEC + t.tv_nsec / GPR_NS_PER_MS;
+	return (gpr_int32)t.tv_sec * GPR_MS_PER_SEC + (gpr_int32)t.tv_nsec / GPR_NS_PER_MS;
   }
 }
 
diff --git a/src/core/support/time_win32.c b/src/core/support/time_win32.c
index 539470bccf..0ca84565a2 100644
--- a/src/core/support/time_win32.c
+++ b/src/core/support/time_win32.c
@@ -64,7 +64,7 @@ void gpr_sleep_until(gpr_timespec until) {
     }
 
     delta = gpr_time_sub(until, now);
-    sleep_millis = delta.tv_sec * GPR_MS_PER_SEC + delta.tv_nsec / GPR_NS_PER_MS;
+	sleep_millis = (DWORD)delta.tv_sec * GPR_MS_PER_SEC + (DWORD)delta.tv_nsec / GPR_NS_PER_MS;
     Sleep(sleep_millis);
   }
 }
-- 
GitLab