diff options
author | Craig Tiller <ctiller@google.com> | 2016-06-27 22:14:17 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-06-27 22:14:17 -0700 |
commit | 05b57e626c3ba9ec41bd2a5068abb5b8208ec1f4 (patch) | |
tree | 7835037de887cc3ea34d54513eda2d850d144a56 | |
parent | 48bbc554bbb0ccb83044516d1dd16175a4ee556a (diff) | |
parent | 510ff69fa3dac27c71c29694020a25787eec7e03 (diff) |
Merge pull request #7098 from ctiller/sig
Dont reblock sigmask every loop
-rw-r--r-- | src/core/lib/iomgr/ev_epoll_linux.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/src/core/lib/iomgr/ev_epoll_linux.c b/src/core/lib/iomgr/ev_epoll_linux.c index 5460d72734..475bd3c1df 100644 --- a/src/core/lib/iomgr/ev_epoll_linux.c +++ b/src/core/lib/iomgr/ev_epoll_linux.c @@ -1031,6 +1031,8 @@ static void fd_notify_on_write(grpc_exec_ctx *exec_ctx, grpc_fd *fd, */ GPR_TLS_DECL(g_current_thread_pollset); GPR_TLS_DECL(g_current_thread_worker); +static __thread bool g_initialized_sigmask; +static __thread sigset_t g_orig_sigmask; static void sig_handler(int sig_num) { #ifdef GRPC_EPOLL_DEBUG @@ -1388,7 +1390,6 @@ static grpc_error *pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset, int timeout_ms = poll_deadline_to_millis_timeout(deadline, now); sigset_t new_mask; - sigset_t orig_mask; grpc_pollset_worker worker; worker.next = worker.prev = NULL; @@ -1423,21 +1424,26 @@ static grpc_error *pollset_work(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset, times *except* when it is in epoll_pwait(). This way, the worker never misses acting on a kick */ - sigemptyset(&new_mask); - sigaddset(&new_mask, grpc_wakeup_signal); - pthread_sigmask(SIG_BLOCK, &new_mask, &orig_mask); - sigdelset(&orig_mask, grpc_wakeup_signal); - /* new_mask: The new thread mask which blocks 'grpc_wakeup_signal'. This is - the mask used at all times *except during epoll_wait()*" - orig_mask: The thread mask which allows 'grpc_wakeup_signal' and this is - the mask to use *during epoll_wait()* - - The new_mask is set on the worker before it is added to the pollset (i.e - before it can be kicked) */ + if (!g_initialized_sigmask) { + sigemptyset(&new_mask); + sigaddset(&new_mask, grpc_wakeup_signal); + pthread_sigmask(SIG_BLOCK, &new_mask, &g_orig_sigmask); + sigdelset(&g_orig_sigmask, grpc_wakeup_signal); + g_initialized_sigmask = true; + /* new_mask: The new thread mask which blocks 'grpc_wakeup_signal'. + This is the mask used at all times *except during + epoll_wait()*" + g_orig_sigmask: The thread mask which allows 'grpc_wakeup_signal' and + this is the mask to use *during epoll_wait()* + + The new_mask is set on the worker before it is added to the pollset + (i.e before it can be kicked) */ + } push_front_worker(pollset, &worker); /* Add worker to pollset */ - pollset_work_and_unlock(exec_ctx, pollset, timeout_ms, &orig_mask, &error); + pollset_work_and_unlock(exec_ctx, pollset, timeout_ms, &g_orig_sigmask, + &error); grpc_exec_ctx_flush(exec_ctx); gpr_mu_lock(&pollset->mu); |