mirror of https://github.com/grpc/grpc.git
Merge pull request #6472 from murgatroid99/ruby_signal_handling2
Make Ruby library terminate on Ctrl+C on client and serverpull/6490/head
commit
03f7e995d2
7 changed files with 195 additions and 51 deletions
@ -0,0 +1,70 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2016, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#include <ruby/ruby.h> |
||||||
|
#include <signal.h> |
||||||
|
#include <stdbool.h> |
||||||
|
|
||||||
|
#include <grpc/support/log.h> |
||||||
|
|
||||||
|
#include "rb_grpc.h" |
||||||
|
|
||||||
|
static void (*old_sigint_handler)(int); |
||||||
|
static void (*old_sigterm_handler)(int); |
||||||
|
|
||||||
|
static volatile bool signal_received = false; |
||||||
|
|
||||||
|
/* This has to be handled at the C level instead of Ruby, because Ruby signal
|
||||||
|
* handlers are constrained to run in the main interpreter thread. If that main |
||||||
|
* thread is blocked on grpc_completion_queue_pluck, the signal handlers will |
||||||
|
* never run */ |
||||||
|
static void handle_signal(int signum) { |
||||||
|
signal_received = true; |
||||||
|
if (signum == SIGINT) { |
||||||
|
old_sigint_handler(signum); |
||||||
|
} else if (signum == SIGTERM) { |
||||||
|
old_sigterm_handler(signum); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
static VALUE grpc_rb_signal_received(VALUE self) { |
||||||
|
(void)self; |
||||||
|
return signal_received ? Qtrue : Qfalse; |
||||||
|
} |
||||||
|
|
||||||
|
void Init_grpc_signals() { |
||||||
|
old_sigint_handler = signal(SIGINT, handle_signal); |
||||||
|
old_sigterm_handler = signal(SIGTERM, handle_signal); |
||||||
|
rb_define_singleton_method(grpc_rb_mGrpcCore, "signal_received?", |
||||||
|
grpc_rb_signal_received, 0); |
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
/*
|
||||||
|
* |
||||||
|
* Copyright 2016, Google Inc. |
||||||
|
* All rights reserved. |
||||||
|
* |
||||||
|
* Redistribution and use in source and binary forms, with or without |
||||||
|
* modification, are permitted provided that the following conditions are |
||||||
|
* met: |
||||||
|
* |
||||||
|
* * Redistributions of source code must retain the above copyright |
||||||
|
* notice, this list of conditions and the following disclaimer. |
||||||
|
* * Redistributions in binary form must reproduce the above |
||||||
|
* copyright notice, this list of conditions and the following disclaimer |
||||||
|
* in the documentation and/or other materials provided with the |
||||||
|
* distribution. |
||||||
|
* * Neither the name of Google Inc. nor the names of its |
||||||
|
* contributors may be used to endorse or promote products derived from |
||||||
|
* this software without specific prior written permission. |
||||||
|
* |
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
* |
||||||
|
*/ |
||||||
|
|
||||||
|
#ifndef GRPC_RB_SIGNAL_H_ |
||||||
|
#define GRPC_RB_SIGNAL_H_ |
||||||
|
|
||||||
|
void Init_grpc_signals(); |
||||||
|
|
||||||
|
#endif /* GRPC_RB_SIGNAL_H_ */ |
@ -0,0 +1,69 @@ |
|||||||
|
# Copyright 2016, Google Inc. |
||||||
|
# All rights reserved. |
||||||
|
# |
||||||
|
# Redistribution and use in source and binary forms, with or without |
||||||
|
# modification, are permitted provided that the following conditions are |
||||||
|
# met: |
||||||
|
# |
||||||
|
# * Redistributions of source code must retain the above copyright |
||||||
|
# notice, this list of conditions and the following disclaimer. |
||||||
|
# * Redistributions in binary form must reproduce the above |
||||||
|
# copyright notice, this list of conditions and the following disclaimer |
||||||
|
# in the documentation and/or other materials provided with the |
||||||
|
# distribution. |
||||||
|
# * Neither the name of Google Inc. nor the names of its |
||||||
|
# contributors may be used to endorse or promote products derived from |
||||||
|
# this software without specific prior written permission. |
||||||
|
# |
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
||||||
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
||||||
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
||||||
|
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
||||||
|
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
||||||
|
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
||||||
|
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
||||||
|
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
||||||
|
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
||||||
|
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
||||||
|
|
||||||
|
require 'thread' |
||||||
|
require_relative 'grpc' |
||||||
|
|
||||||
|
# GRPC contains the General RPC module. |
||||||
|
module GRPC |
||||||
|
# Signals contains gRPC functions related to signal handling |
||||||
|
module Signals |
||||||
|
@interpreter_exiting = false |
||||||
|
@signal_handlers = [] |
||||||
|
@handlers_mutex = Mutex.new |
||||||
|
|
||||||
|
def register_handler(&handler) |
||||||
|
@handlers_mutex.synchronize do |
||||||
|
@signal_handlers.push(handler) |
||||||
|
handler.call if @exit_signal_received |
||||||
|
end |
||||||
|
# Returns a function to remove the handler |
||||||
|
lambda do |
||||||
|
@handlers_mutex.synchronize { @signal_handlers.delete(handler) } |
||||||
|
end |
||||||
|
end |
||||||
|
module_function :register_handler |
||||||
|
|
||||||
|
def wait_for_signals |
||||||
|
t = Thread.new do |
||||||
|
sleep 0.1 until GRPC::Core.signal_received? || @interpreter_exiting |
||||||
|
unless @interpreter_exiting |
||||||
|
@handlers_mutex.synchronize do |
||||||
|
@signal_handlers.each(&:call) |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
at_exit do |
||||||
|
@interpreter_exiting = true |
||||||
|
t.join |
||||||
|
end |
||||||
|
end |
||||||
|
module_function :wait_for_signals |
||||||
|
end |
||||||
|
end |
Loading…
Reference in new issue