aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Sree Kuchibhotla <sreek@google.com>2016-06-09 17:08:50 -0700
committerGravatar Sree Kuchibhotla <sreek@google.com>2016-06-09 17:08:50 -0700
commitc7be7c688829281b543428ec22029d4d09bd2a9c (patch)
tree6e364b02d9e779c07f3baa5ec284c11b812f9d6a /src/core
parent877dc0cc4930ce799a2ee5c4548b0cbeb38477bf (diff)
Add an API at the core level to disable signals or use a different
signal number
Diffstat (limited to 'src/core')
-rw-r--r--src/core/lib/iomgr/ev_epoll_linux.c45
1 files changed, 35 insertions, 10 deletions
diff --git a/src/core/lib/iomgr/ev_epoll_linux.c b/src/core/lib/iomgr/ev_epoll_linux.c
index d2d5d2852b..7e01ac144f 100644
--- a/src/core/lib/iomgr/ev_epoll_linux.c
+++ b/src/core/lib/iomgr/ev_epoll_linux.c
@@ -31,6 +31,7 @@
*
*/
+#include <grpc/grpc_posix.h>
#include <grpc/support/port_platform.h>
#ifdef GPR_LINUX_EPOLL
@@ -58,9 +59,26 @@
#include "src/core/lib/profiling/timers.h"
#include "src/core/lib/support/block_annotate.h"
-struct polling_island;
+static int grpc_wakeup_signal = -1;
+static bool is_grpc_wakeup_signal_initialized = false;
+
+/* Implements the function defined in grpc_posix.h. This function might be
+ * called before even calling grpc_init() to set either a different signal to
+ * use. If signum == -1, then the use of signals is disabled */
+void grpc_use_signal(int signum) {
+ grpc_wakeup_signal = signum;
+ is_grpc_wakeup_signal_initialized = true;
-static int grpc_poller_kick_signum;
+ if (grpc_wakeup_signal < 0) {
+ gpr_log(GPR_INFO,
+ "Use of signals is disabled. Epoll engine will not be used");
+ } else {
+ gpr_log(GPR_INFO, "epoll engine will be using signal: %d",
+ grpc_wakeup_signal);
+ }
+}
+
+struct polling_island;
/*******************************************************************************
* Fd Declarations
@@ -854,10 +872,7 @@ static void sig_handler(int sig_num) {
#endif
}
-static void poller_kick_init() {
- grpc_poller_kick_signum = SIGRTMIN + 2;
- signal(grpc_poller_kick_signum, sig_handler);
-}
+static void poller_kick_init() { signal(grpc_wakeup_signal, sig_handler); }
/* Global state management */
static void pollset_global_init(void) {
@@ -874,7 +889,7 @@ static void pollset_global_shutdown(void) {
}
static void pollset_worker_kick(grpc_pollset_worker *worker) {
- pthread_kill(worker->pt_id, grpc_poller_kick_signum);
+ pthread_kill(worker->pt_id, grpc_wakeup_signal);
}
/* Return 1 if the pollset has active threads in pollset_work (pollset must
@@ -1214,9 +1229,9 @@ static void pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
pollset->kicked_without_pollers = 0;
} else if (!pollset->shutting_down) {
sigemptyset(&new_mask);
- sigaddset(&new_mask, grpc_poller_kick_signum);
+ sigaddset(&new_mask, grpc_wakeup_signal);
pthread_sigmask(SIG_BLOCK, &new_mask, &orig_mask);
- sigdelset(&orig_mask, grpc_poller_kick_signum);
+ sigdelset(&orig_mask, grpc_wakeup_signal);
push_front_worker(pollset, &worker);
@@ -1497,19 +1512,29 @@ static bool is_epoll_available() {
}
const grpc_event_engine_vtable *grpc_init_epoll_linux(void) {
+ /* If use of signals is disabled, we cannot use epoll engine*/
+ if (is_grpc_wakeup_signal_initialized && grpc_wakeup_signal < 0) {
+ return NULL;
+ }
+
if (!is_epoll_available()) {
return NULL;
}
+ if (!is_grpc_wakeup_signal_initialized) {
+ grpc_use_signal(SIGRTMIN + 2);
+ }
+
fd_global_init();
pollset_global_init();
polling_island_global_init();
return &vtable;
}
-#else /* defined(GPR_LINUX_EPOLL) */
+#else /* defined(GPR_LINUX_EPOLL) */
/* If GPR_LINUX_EPOLL is not defined, it means epoll is not available. Return
* NULL */
const grpc_event_engine_vtable *grpc_init_epoll_linux(void) { return NULL; }
+void grpc_use_signal(int signum) {}
#endif /* !defined(GPR_LINUX_EPOLL) */