From 988e37f1fc8542c205db569be0dd20f758c39164 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Thu, 1 Oct 2015 07:53:56 -0700 Subject: Allow fd_posix to force a re-evaluation of polling on wakeup --- src/core/iomgr/pollset_posix.h | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'src/core/iomgr/pollset_posix.h') diff --git a/src/core/iomgr/pollset_posix.h b/src/core/iomgr/pollset_posix.h index 83c5258539..762582c79d 100644 --- a/src/core/iomgr/pollset_posix.h +++ b/src/core/iomgr/pollset_posix.h @@ -50,6 +50,7 @@ struct grpc_fd; typedef struct grpc_pollset_worker { grpc_wakeup_fd wakeup_fd; + int reevaluate_polling_on_wakeup; struct grpc_pollset_worker *next; struct grpc_pollset_worker *prev; } grpc_pollset_worker; @@ -111,6 +112,10 @@ void grpc_kick_drain(grpc_pollset *p); int grpc_poll_deadline_to_millis_timeout(gpr_timespec deadline, gpr_timespec now); +#define GRPC_POLLSET_CAN_KICK_SELF 1 +#define GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP 2 +void grpc_pollset_kick_ex(grpc_pollset *p, grpc_pollset_worker *specific_worker, gpr_uint32 flags); + /* turn a pollset into a multipoller: platform specific */ typedef void (*grpc_platform_become_multipoller_type)(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset, -- cgit v1.2.3 From 57f79d641e70c07e7bbff518c8ad5189d3770d3c Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 2 Oct 2015 14:00:12 -0700 Subject: clang-format --- src/core/iomgr/fd_posix.c | 23 +++++++++++++--------- src/core/iomgr/fd_posix.h | 5 ++--- .../iomgr/pollset_multipoller_with_poll_posix.c | 2 +- src/core/iomgr/pollset_posix.c | 13 +++++++----- src/core/iomgr/pollset_posix.h | 3 ++- 5 files changed, 27 insertions(+), 19 deletions(-) (limited to 'src/core/iomgr/pollset_posix.h') diff --git a/src/core/iomgr/fd_posix.c b/src/core/iomgr/fd_posix.c index 567e1ff02e..e086a71e12 100644 --- a/src/core/iomgr/fd_posix.c +++ b/src/core/iomgr/fd_posix.c @@ -46,8 +46,8 @@ #include #include -#define CLOSURE_NOT_READY ((grpc_closure*)0) -#define CLOSURE_READY ((grpc_closure*)1) +#define CLOSURE_NOT_READY ((grpc_closure *)0) +#define CLOSURE_READY ((grpc_closure *)1) /* We need to keep a freelist not because of any concerns of malloc performance * but instead so that implementations with multiple threads in (for example) @@ -175,13 +175,16 @@ grpc_fd *grpc_fd_create(int fd, const char *name) { static int count_inactive(grpc_fd *fd) { int n = 0; grpc_fd_watcher *w; - for (w = fd->inactive_watcher_root.next; w != &fd->inactive_watcher_root; w = w->next) { + for (w = fd->inactive_watcher_root.next; w != &fd->inactive_watcher_root; + w = w->next) { n++; } return n; } -static void fdev_add(fd_event_type type, grpc_fd *fd, grpc_pollset *pollset, grpc_pollset_worker *pollset_worker, grpc_fd_watcher *fd_watcher) { +static void fdev_add(fd_event_type type, grpc_fd *fd, grpc_pollset *pollset, + grpc_pollset_worker *pollset_worker, + grpc_fd_watcher *fd_watcher) { fd_event *ev; if (fd->num_ev == fd->cap_ev) { fd->cap_ev = GPR_MAX(2 * fd->cap_ev, 32); @@ -210,7 +213,8 @@ static void pollset_kick_locked(grpc_fd_watcher *watcher, fd_event_type type) { fdev_add(type, watcher->fd, watcher->pollset, watcher->worker, watcher); gpr_mu_lock(GRPC_POLLSET_MU(watcher->pollset)); GPR_ASSERT(watcher->worker); - grpc_pollset_kick_ex(watcher->pollset, watcher->worker, GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP); + grpc_pollset_kick_ex(watcher->pollset, watcher->worker, + GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP); gpr_mu_unlock(GRPC_POLLSET_MU(watcher->pollset)); fdev_add(type + 1, watcher->fd, watcher->pollset, watcher->worker, watcher); } @@ -277,8 +281,8 @@ void grpc_fd_ref(grpc_fd *fd) { ref_by(fd, 2); } void grpc_fd_unref(grpc_fd *fd) { unref_by(fd, 2); } #endif -static void notify_on_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd, grpc_closure **st, - grpc_closure *closure) { +static void notify_on_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd, + grpc_closure **st, grpc_closure *closure) { if (*st == CLOSURE_NOT_READY) { *st = closure; } else if (*st == CLOSURE_READY) { @@ -296,7 +300,7 @@ static void notify_on_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd, grpc_closure /* returns 1 if state becomes not ready */ static int set_ready_locked(grpc_exec_ctx *exec_ctx, grpc_fd *fd, - grpc_closure **st) { + grpc_closure **st) { if (*st == CLOSURE_READY) { /* duplicate ready, ignore */ return 0; @@ -407,7 +411,8 @@ void grpc_fd_end_poll(grpc_exec_ctx *exec_ctx, grpc_fd_watcher *watcher, gpr_mu_lock(&fd->mu); - fdev_add(FDEV_END_POLL, watcher->fd, watcher->pollset, watcher->worker, watcher); + fdev_add(FDEV_END_POLL, watcher->fd, watcher->pollset, watcher->worker, + watcher); if (watcher == fd->read_watcher) { /* remove read watcher, kick if we still need a read */ diff --git a/src/core/iomgr/fd_posix.h b/src/core/iomgr/fd_posix.h index b56931cb2b..8e6f2cfb52 100644 --- a/src/core/iomgr/fd_posix.h +++ b/src/core/iomgr/fd_posix.h @@ -129,9 +129,8 @@ void grpc_fd_orphan(grpc_exec_ctx *exec_ctx, grpc_fd *fd, grpc_closure *on_done, fd's current interest (such as epoll) do not need to call this function. MUST NOT be called with a pollset lock taken */ gpr_uint32 grpc_fd_begin_poll(grpc_fd *fd, grpc_pollset *pollset, - grpc_pollset_worker *worker, - gpr_uint32 read_mask, gpr_uint32 write_mask, - grpc_fd_watcher *rec); + grpc_pollset_worker *worker, gpr_uint32 read_mask, + gpr_uint32 write_mask, grpc_fd_watcher *rec); /* Complete polling previously started with grpc_fd_begin_poll MUST NOT be called with a pollset lock taken */ void grpc_fd_end_poll(grpc_exec_ctx *exec_ctx, grpc_fd_watcher *rec, diff --git a/src/core/iomgr/pollset_multipoller_with_poll_posix.c b/src/core/iomgr/pollset_multipoller_with_poll_posix.c index ba0ba72816..faa6c14491 100644 --- a/src/core/iomgr/pollset_multipoller_with_poll_posix.c +++ b/src/core/iomgr/pollset_multipoller_with_poll_posix.c @@ -103,7 +103,7 @@ static void multipoll_with_poll_pollset_maybe_work_and_unlock( grpc_exec_ctx *exec_ctx, grpc_pollset *pollset, grpc_pollset_worker *worker, gpr_timespec deadline, gpr_timespec now) { #define POLLOUT_CHECK (POLLOUT | POLLHUP | POLLERR) -#define POLLIN_CHECK (POLLIN | POLLHUP | POLLERR) +#define POLLIN_CHECK (POLLIN | POLLHUP | POLLERR) int timeout; int r; diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c index 5b7f7cce9a..574ebc7c60 100644 --- a/src/core/iomgr/pollset_posix.c +++ b/src/core/iomgr/pollset_posix.c @@ -98,7 +98,8 @@ static void push_front_worker(grpc_pollset *p, grpc_pollset_worker *worker) { worker->prev->next = worker->next->prev = worker; } -void grpc_pollset_kick_ex(grpc_pollset *p, grpc_pollset_worker *specific_worker, gpr_uint32 flags) { +void grpc_pollset_kick_ex(grpc_pollset *p, grpc_pollset_worker *specific_worker, + gpr_uint32 flags) { /* pollset->mu already held */ if (specific_worker != NULL) { if (specific_worker == GRPC_POLLSET_KICK_BROADCAST) { @@ -128,11 +129,13 @@ void grpc_pollset_kick_ex(grpc_pollset *p, grpc_pollset_worker *specific_worker, GPR_ASSERT((flags & GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP) == 0); specific_worker = pop_front_worker(p); if (specific_worker != NULL) { - if (gpr_tls_get(&g_current_thread_worker) == (gpr_intptr)specific_worker) { + if (gpr_tls_get(&g_current_thread_worker) == + (gpr_intptr)specific_worker) { push_back_worker(p, specific_worker); specific_worker = pop_front_worker(p); - if ((flags & GRPC_POLLSET_CAN_KICK_SELF) == 0 && - gpr_tls_get(&g_current_thread_worker) == (gpr_intptr)specific_worker) { + if ((flags & GRPC_POLLSET_CAN_KICK_SELF) == 0 && + gpr_tls_get(&g_current_thread_worker) == + (gpr_intptr)specific_worker) { push_back_worker(p, specific_worker); return; } @@ -497,7 +500,7 @@ static void basic_pollset_maybe_work_and_unlock(grpc_exec_ctx *exec_ctx, gpr_timespec deadline, gpr_timespec now) { #define POLLOUT_CHECK (POLLOUT | POLLHUP | POLLERR) -#define POLLIN_CHECK (POLLIN | POLLHUP | POLLERR) +#define POLLIN_CHECK (POLLIN | POLLHUP | POLLERR) struct pollfd pfd[3]; grpc_fd *fd; diff --git a/src/core/iomgr/pollset_posix.h b/src/core/iomgr/pollset_posix.h index 762582c79d..d375207643 100644 --- a/src/core/iomgr/pollset_posix.h +++ b/src/core/iomgr/pollset_posix.h @@ -114,7 +114,8 @@ int grpc_poll_deadline_to_millis_timeout(gpr_timespec deadline, #define GRPC_POLLSET_CAN_KICK_SELF 1 #define GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP 2 -void grpc_pollset_kick_ex(grpc_pollset *p, grpc_pollset_worker *specific_worker, gpr_uint32 flags); +void grpc_pollset_kick_ex(grpc_pollset *p, grpc_pollset_worker *specific_worker, + gpr_uint32 flags); /* turn a pollset into a multipoller: platform specific */ typedef void (*grpc_platform_become_multipoller_type)(grpc_exec_ctx *exec_ctx, -- cgit v1.2.3 From 548735efb8d27b61db8eae3752b4fffb1ae4bcd9 Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Fri, 2 Oct 2015 16:17:10 -0700 Subject: Commentary --- src/core/iomgr/fd_posix.h | 4 +++- src/core/iomgr/pollset_posix.h | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'src/core/iomgr/pollset_posix.h') diff --git a/src/core/iomgr/fd_posix.h b/src/core/iomgr/fd_posix.h index ca3d065abc..b85c74b52b 100644 --- a/src/core/iomgr/fd_posix.h +++ b/src/core/iomgr/fd_posix.h @@ -128,7 +128,9 @@ gpr_uint32 grpc_fd_begin_poll(grpc_fd *fd, grpc_pollset *pollset, grpc_pollset_worker *worker, gpr_uint32 read_mask, gpr_uint32 write_mask, grpc_fd_watcher *rec); /* Complete polling previously started with grpc_fd_begin_poll - MUST NOT be called with a pollset lock taken */ + MUST NOT be called with a pollset lock taken + if got_read or got_write are 1, also does the notify_on_{read,write} as + appropriate. */ void grpc_fd_end_poll(grpc_exec_ctx *exec_ctx, grpc_fd_watcher *rec, int got_read, int got_write); diff --git a/src/core/iomgr/pollset_posix.h b/src/core/iomgr/pollset_posix.h index d375207643..f0ec07ebce 100644 --- a/src/core/iomgr/pollset_posix.h +++ b/src/core/iomgr/pollset_posix.h @@ -112,8 +112,12 @@ void grpc_kick_drain(grpc_pollset *p); int grpc_poll_deadline_to_millis_timeout(gpr_timespec deadline, gpr_timespec now); +/* Allow kick to wakeup the currently polling worker */ #define GRPC_POLLSET_CAN_KICK_SELF 1 +/* Force the wakee to repoll when awoken */ #define GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP 2 +/* As per grpc_pollset_kick, with an extended set of flags (defined above) + -- mostly for fd_posix's use. */ void grpc_pollset_kick_ex(grpc_pollset *p, grpc_pollset_worker *specific_worker, gpr_uint32 flags); -- cgit v1.2.3 From b937aa1b7a62142c9decf20b8c0a5be3ef20ec0b Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 6 Oct 2015 11:30:30 -0700 Subject: ex --> ext --- src/core/iomgr/fd_posix.c | 4 ++-- src/core/iomgr/pollset_posix.c | 6 +++--- src/core/iomgr/pollset_posix.h | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) (limited to 'src/core/iomgr/pollset_posix.h') diff --git a/src/core/iomgr/fd_posix.c b/src/core/iomgr/fd_posix.c index dc4aabb668..7ae8d6efa5 100644 --- a/src/core/iomgr/fd_posix.c +++ b/src/core/iomgr/fd_posix.c @@ -172,8 +172,8 @@ int grpc_fd_is_orphaned(grpc_fd *fd) { static void pollset_kick_locked(grpc_fd_watcher *watcher) { gpr_mu_lock(GRPC_POLLSET_MU(watcher->pollset)); GPR_ASSERT(watcher->worker); - grpc_pollset_kick_ex(watcher->pollset, watcher->worker, - GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP); + grpc_pollset_kick_ext(watcher->pollset, watcher->worker, + GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP); gpr_mu_unlock(GRPC_POLLSET_MU(watcher->pollset)); } diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c index 574ebc7c60..0851a0dc70 100644 --- a/src/core/iomgr/pollset_posix.c +++ b/src/core/iomgr/pollset_posix.c @@ -98,8 +98,8 @@ static void push_front_worker(grpc_pollset *p, grpc_pollset_worker *worker) { worker->prev->next = worker->next->prev = worker; } -void grpc_pollset_kick_ex(grpc_pollset *p, grpc_pollset_worker *specific_worker, - gpr_uint32 flags) { +void grpc_pollset_kick_ext(grpc_pollset *p, grpc_pollset_worker *specific_worker, + gpr_uint32 flags) { /* pollset->mu already held */ if (specific_worker != NULL) { if (specific_worker == GRPC_POLLSET_KICK_BROADCAST) { @@ -151,7 +151,7 @@ void grpc_pollset_kick_ex(grpc_pollset *p, grpc_pollset_worker *specific_worker, } void grpc_pollset_kick(grpc_pollset *p, grpc_pollset_worker *specific_worker) { - grpc_pollset_kick_ex(p, specific_worker, 0); + grpc_pollset_kick_ext(p, specific_worker, 0); } /* global state management */ diff --git a/src/core/iomgr/pollset_posix.h b/src/core/iomgr/pollset_posix.h index f0ec07ebce..6b91725de7 100644 --- a/src/core/iomgr/pollset_posix.h +++ b/src/core/iomgr/pollset_posix.h @@ -118,8 +118,8 @@ int grpc_poll_deadline_to_millis_timeout(gpr_timespec deadline, #define GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP 2 /* As per grpc_pollset_kick, with an extended set of flags (defined above) -- mostly for fd_posix's use. */ -void grpc_pollset_kick_ex(grpc_pollset *p, grpc_pollset_worker *specific_worker, - gpr_uint32 flags); +void grpc_pollset_kick_ext(grpc_pollset *p, grpc_pollset_worker *specific_worker, + gpr_uint32 flags); /* turn a pollset into a multipoller: platform specific */ typedef void (*grpc_platform_become_multipoller_type)(grpc_exec_ctx *exec_ctx, -- cgit v1.2.3 From d0a00003d6123a45842ac6df842abcbdb6ed612f Mon Sep 17 00:00:00 2001 From: Craig Tiller Date: Tue, 6 Oct 2015 11:30:37 -0700 Subject: clang-format --- src/core/iomgr/pollset_posix.c | 3 ++- src/core/iomgr/pollset_posix.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'src/core/iomgr/pollset_posix.h') diff --git a/src/core/iomgr/pollset_posix.c b/src/core/iomgr/pollset_posix.c index 0851a0dc70..7581c3593e 100644 --- a/src/core/iomgr/pollset_posix.c +++ b/src/core/iomgr/pollset_posix.c @@ -98,7 +98,8 @@ static void push_front_worker(grpc_pollset *p, grpc_pollset_worker *worker) { worker->prev->next = worker->next->prev = worker; } -void grpc_pollset_kick_ext(grpc_pollset *p, grpc_pollset_worker *specific_worker, +void grpc_pollset_kick_ext(grpc_pollset *p, + grpc_pollset_worker *specific_worker, gpr_uint32 flags) { /* pollset->mu already held */ if (specific_worker != NULL) { diff --git a/src/core/iomgr/pollset_posix.h b/src/core/iomgr/pollset_posix.h index 6b91725de7..34f76db2af 100644 --- a/src/core/iomgr/pollset_posix.h +++ b/src/core/iomgr/pollset_posix.h @@ -118,7 +118,8 @@ int grpc_poll_deadline_to_millis_timeout(gpr_timespec deadline, #define GRPC_POLLSET_REEVALUATE_POLLING_ON_WAKEUP 2 /* As per grpc_pollset_kick, with an extended set of flags (defined above) -- mostly for fd_posix's use. */ -void grpc_pollset_kick_ext(grpc_pollset *p, grpc_pollset_worker *specific_worker, +void grpc_pollset_kick_ext(grpc_pollset *p, + grpc_pollset_worker *specific_worker, gpr_uint32 flags); /* turn a pollset into a multipoller: platform specific */ -- cgit v1.2.3