From 3a4880856a9d1e19b51aa49f34c80bb9062d888d Mon Sep 17 00:00:00 2001
From: Craig Tiller <craig.tiller@gmail.com>
Date: Mon, 11 May 2015 09:02:07 -0700
Subject: [PATCH] Ruby progress

---
 src/ruby/ext/grpc/rb_completion_queue.c | 19 +++++--------------
 src/ruby/ext/grpc/rb_completion_queue.h |  4 ++--
 2 files changed, 7 insertions(+), 16 deletions(-)

diff --git a/src/ruby/ext/grpc/rb_completion_queue.c b/src/ruby/ext/grpc/rb_completion_queue.c
index 3cf6c313ee..cef8cd75d2 100644
--- a/src/ruby/ext/grpc/rb_completion_queue.c
+++ b/src/ruby/ext/grpc/rb_completion_queue.c
@@ -47,7 +47,7 @@ static VALUE grpc_rb_cCompletionQueue = Qnil;
 /* Used to allow grpc_completion_queue_next call to release the GIL */
 typedef struct next_call_stack {
   grpc_completion_queue *cq;
-  grpc_event *event;
+  grpc_event event;
   gpr_timespec timeout;
   void *tag;
 } next_call_stack;
@@ -145,12 +145,9 @@ static VALUE grpc_rb_completion_queue_next(VALUE self, VALUE timeout) {
   TypedData_Get_Struct(self, grpc_completion_queue,
                        &grpc_rb_completion_queue_data_type, next_call.cq);
   next_call.timeout = grpc_rb_time_timeval(timeout, /* absolute time*/ 0);
-  next_call.event = NULL;
+  next_call.event.type = GRPC_QUEUE_TIMEOUT;
   rb_thread_call_without_gvl(grpc_rb_completion_queue_next_no_gil,
                              (void *)&next_call, NULL, NULL);
-  if (next_call.event == NULL) {
-    return Qnil;
-  }
   return grpc_rb_new_event(next_call.event);
 }
 
@@ -158,17 +155,14 @@ static VALUE grpc_rb_completion_queue_next(VALUE self, VALUE timeout) {
  * event. */
 VALUE grpc_rb_completion_queue_pluck(VALUE self, VALUE tag,
                                      VALUE timeout) {
-  grpc_event *ev = grpc_rb_completion_queue_pluck_event(self, tag, timeout);
-  if (ev == NULL) {
-    return Qnil;
-  }
+  grpc_event ev = grpc_rb_completion_queue_pluck_event(self, tag, timeout);
   return grpc_rb_new_event(ev);
 }
 
 /* Blocks until the next event for given tag is available, and returns the
  * event. */
-grpc_event* grpc_rb_completion_queue_pluck_event(VALUE self, VALUE tag,
-                                                 VALUE timeout) {
+grpc_event grpc_rb_completion_queue_pluck_event(VALUE self, VALUE tag,
+                                                VALUE timeout) {
   next_call_stack next_call;
   MEMZERO(&next_call, next_call_stack, 1);
   TypedData_Get_Struct(self, grpc_completion_queue,
@@ -178,9 +172,6 @@ grpc_event* grpc_rb_completion_queue_pluck_event(VALUE self, VALUE tag,
   next_call.event = NULL;
   rb_thread_call_without_gvl(grpc_rb_completion_queue_pluck_no_gil,
                              (void *)&next_call, NULL, NULL);
-  if (next_call.event == NULL) {
-    return NULL;
-  }
   return next_call.event;
 }
 
diff --git a/src/ruby/ext/grpc/rb_completion_queue.h b/src/ruby/ext/grpc/rb_completion_queue.h
index 4d0f49ac47..e4d04b10c8 100644
--- a/src/ruby/ext/grpc/rb_completion_queue.h
+++ b/src/ruby/ext/grpc/rb_completion_queue.h
@@ -45,8 +45,8 @@ grpc_completion_queue *grpc_rb_get_wrapped_completion_queue(VALUE v);
  *
  * This avoids having code that holds the GIL repeated at multiple sites.
  */
-grpc_event* grpc_rb_completion_queue_pluck_event(VALUE cqueue, VALUE tag,
-                                                 VALUE timeout);
+grpc_event grpc_rb_completion_queue_pluck_event(VALUE cqueue, VALUE tag,
+                                                VALUE timeout);
 
 /* Initializes the CompletionQueue class. */
 void Init_grpc_completion_queue();
-- 
GitLab