|
|
|
@ -54,8 +54,8 @@ typedef struct grpc_rb_event_queue { |
|
|
|
|
grpc_rb_event *head; |
|
|
|
|
grpc_rb_event *tail; |
|
|
|
|
|
|
|
|
|
gpr_mu *mu; |
|
|
|
|
gpr_cv *cv; |
|
|
|
|
gpr_mu mu; |
|
|
|
|
gpr_cv cv; |
|
|
|
|
|
|
|
|
|
// Indicates that the thread should stop waiting
|
|
|
|
|
bool abort; |
|
|
|
@ -69,15 +69,15 @@ void grpc_rb_event_queue_enqueue(void (*callback)(void*), |
|
|
|
|
event->callback = callback; |
|
|
|
|
event->argument = argument; |
|
|
|
|
event->next = NULL; |
|
|
|
|
gpr_mu_lock(event_queue.mu); |
|
|
|
|
gpr_mu_lock(&event_queue.mu); |
|
|
|
|
if (event_queue.tail == NULL) { |
|
|
|
|
event_queue.head = event_queue.tail = event; |
|
|
|
|
} else { |
|
|
|
|
event_queue.tail->next = event; |
|
|
|
|
event_queue.tail = event; |
|
|
|
|
} |
|
|
|
|
gpr_mu_unlock(event_queue.mu); |
|
|
|
|
gpr_cv_signal(event_queue.cv); |
|
|
|
|
gpr_cv_signal(&event_queue.cv); |
|
|
|
|
gpr_mu_unlock(&event_queue.mu); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static grpc_rb_event *grpc_rb_event_queue_dequeue() { |
|
|
|
@ -96,33 +96,31 @@ static grpc_rb_event *grpc_rb_event_queue_dequeue() { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void grpc_rb_event_queue_destroy() { |
|
|
|
|
gpr_mu_destroy(event_queue.mu); |
|
|
|
|
gpr_cv_destroy(event_queue.cv); |
|
|
|
|
gpr_free(event_queue.mu); |
|
|
|
|
gpr_free(event_queue.cv); |
|
|
|
|
gpr_mu_destroy(&event_queue.mu); |
|
|
|
|
gpr_cv_destroy(&event_queue.cv); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void *grpc_rb_wait_for_event_no_gil(void *param) { |
|
|
|
|
grpc_rb_event *event = NULL; |
|
|
|
|
gpr_mu_lock(event_queue.mu); |
|
|
|
|
gpr_mu_lock(&event_queue.mu); |
|
|
|
|
while ((event = grpc_rb_event_queue_dequeue()) == NULL) { |
|
|
|
|
gpr_cv_wait(event_queue.cv, |
|
|
|
|
event_queue.mu, |
|
|
|
|
gpr_cv_wait(&event_queue.cv, |
|
|
|
|
&event_queue.mu, |
|
|
|
|
gpr_inf_future(GPR_CLOCK_REALTIME)); |
|
|
|
|
if (event_queue.abort) { |
|
|
|
|
gpr_mu_unlock(event_queue.mu); |
|
|
|
|
gpr_mu_unlock(&event_queue.mu); |
|
|
|
|
return NULL; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
gpr_mu_unlock(event_queue.mu); |
|
|
|
|
gpr_mu_unlock(&event_queue.mu); |
|
|
|
|
return event; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void grpc_rb_event_unblocking_func(void *arg) { |
|
|
|
|
gpr_mu_lock(event_queue.mu); |
|
|
|
|
gpr_mu_lock(&event_queue.mu); |
|
|
|
|
event_queue.abort = true; |
|
|
|
|
gpr_mu_unlock(event_queue.mu); |
|
|
|
|
gpr_cv_signal(event_queue.cv); |
|
|
|
|
gpr_cv_signal(&event_queue.cv); |
|
|
|
|
gpr_mu_unlock(&event_queue.mu); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* This is the implementation of the thread that handles auth metadata plugin
|
|
|
|
@ -146,13 +144,10 @@ static VALUE grpc_rb_event_thread(VALUE arg) { |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void grpc_rb_event_queue_thread_start() { |
|
|
|
|
|
|
|
|
|
event_queue.mu = gpr_malloc(sizeof(gpr_mu)); |
|
|
|
|
event_queue.cv = gpr_malloc(sizeof(gpr_cv)); |
|
|
|
|
event_queue.head = event_queue.tail = NULL; |
|
|
|
|
event_queue.abort = false; |
|
|
|
|
gpr_mu_init(event_queue.mu); |
|
|
|
|
gpr_cv_init(event_queue.cv); |
|
|
|
|
gpr_mu_init(&event_queue.mu); |
|
|
|
|
gpr_cv_init(&event_queue.cv); |
|
|
|
|
|
|
|
|
|
rb_thread_create(grpc_rb_event_thread, NULL); |
|
|
|
|
} |
|
|
|
|