Skip to content
Snippets Groups Projects
Commit ab8dfb80 authored by Nicolas Noble's avatar Nicolas Noble Committed by GitHub
Browse files

Merge pull request #7463 from murgatroid99/ruby_undefined_symbol_usage

Fix undefined reference in Ruby code, add linker warning
parents e2195c06 8a16ce26
No related branches found
No related tags found
No related merge requests found
...@@ -92,6 +92,7 @@ if grpc_config == 'gcov' ...@@ -92,6 +92,7 @@ if grpc_config == 'gcov'
end end
$LDFLAGS << ' -Wl,-wrap,memcpy' if RUBY_PLATFORM =~ /linux/ $LDFLAGS << ' -Wl,-wrap,memcpy' if RUBY_PLATFORM =~ /linux/
$LDFLAGS << ' -Wl,--no-undefined' if RUBY_PLATFORM =~ /linux/
$LDFLAGS << ' -static' if windows $LDFLAGS << ' -static' if windows
$CFLAGS << ' -std=c99 ' $CFLAGS << ' -std=c99 '
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#include <grpc/grpc_security.h> #include <grpc/grpc_security.h>
#include <grpc/support/alloc.h> #include <grpc/support/alloc.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc/support/time.h>
#include "rb_grpc.h" #include "rb_grpc.h"
#include "rb_call.h" #include "rb_call.h"
#include "rb_channel_args.h" #include "rb_channel_args.h"
...@@ -71,6 +72,7 @@ typedef struct grpc_rb_channel { ...@@ -71,6 +72,7 @@ typedef struct grpc_rb_channel {
/* The actual channel */ /* The actual channel */
grpc_channel *wrapped; grpc_channel *wrapped;
grpc_completion_queue *queue;
} grpc_rb_channel; } grpc_rb_channel;
/* Destroys Channel instances. */ /* Destroys Channel instances. */
...@@ -83,6 +85,7 @@ static void grpc_rb_channel_free(void *p) { ...@@ -83,6 +85,7 @@ static void grpc_rb_channel_free(void *p) {
if (ch->wrapped != NULL) { if (ch->wrapped != NULL) {
grpc_channel_destroy(ch->wrapped); grpc_channel_destroy(ch->wrapped);
grpc_rb_completion_queue_destroy(ch->queue);
} }
xfree(p); xfree(p);
...@@ -165,6 +168,7 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) { ...@@ -165,6 +168,7 @@ static VALUE grpc_rb_channel_init(int argc, VALUE *argv, VALUE self) {
} }
rb_ivar_set(self, id_target, target); rb_ivar_set(self, id_target, target);
wrapper->wrapped = ch; wrapper->wrapped = ch;
wrapper->queue = grpc_completion_queue_create(NULL);
return self; return self;
} }
...@@ -203,16 +207,18 @@ static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE *argv, ...@@ -203,16 +207,18 @@ static VALUE grpc_rb_channel_get_connectivity_state(int argc, VALUE *argv,
the completion queue with success=0 */ the completion queue with success=0 */
static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self, static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self,
VALUE last_state, VALUE last_state,
VALUE cqueue, VALUE deadline) {
VALUE deadline,
VALUE tag) {
grpc_rb_channel *wrapper = NULL; grpc_rb_channel *wrapper = NULL;
grpc_channel *ch = NULL; grpc_channel *ch = NULL;
grpc_completion_queue *cq = NULL; grpc_completion_queue *cq = NULL;
cq = grpc_rb_get_wrapped_completion_queue(cqueue); void *tag = wrapper;
grpc_event event;
TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper); TypedData_Get_Struct(self, grpc_rb_channel, &grpc_channel_data_type, wrapper);
ch = wrapper->wrapped; ch = wrapper->wrapped;
cq = wrapper->queue;
if (ch == NULL) { if (ch == NULL) {
rb_raise(rb_eRuntimeError, "closed!"); rb_raise(rb_eRuntimeError, "closed!");
return Qnil; return Qnil;
...@@ -222,9 +228,16 @@ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self, ...@@ -222,9 +228,16 @@ static VALUE grpc_rb_channel_watch_connectivity_state(VALUE self,
(grpc_connectivity_state)NUM2LONG(last_state), (grpc_connectivity_state)NUM2LONG(last_state),
grpc_rb_time_timeval(deadline, /* absolute time */ 0), grpc_rb_time_timeval(deadline, /* absolute time */ 0),
cq, cq,
ROBJECT(tag)); tag);
return Qnil; event = rb_completion_queue_pluck(cq, tag,
gpr_inf_future(GPR_CLOCK_REALTIME), NULL);
if (event.success) {
return Qtrue;
} else {
return Qfalse;
}
} }
/* Create a call given a grpc_channel, in order to call method. The request /* Create a call given a grpc_channel, in order to call method. The request
......
...@@ -38,9 +38,6 @@ ...@@ -38,9 +38,6 @@
#include <grpc/grpc.h> #include <grpc/grpc.h>
/* Gets the wrapped completion queue from the ruby wrapper */
grpc_completion_queue *grpc_rb_get_wrapped_completion_queue(VALUE v);
void grpc_rb_completion_queue_destroy(grpc_completion_queue *cq); void grpc_rb_completion_queue_destroy(grpc_completion_queue *cq);
/** /**
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment