From 09f24569d45975f1fb08afaf9a008c99368d122f Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Sun, 11 Nov 2012 16:43:45 +0100 Subject: [PATCH] REORG: fd: centralize the processing of speculative events Speculative events are independant on the poller, so they can be centralized in fd.c. --- include/proto/fd.h | 5 +++++ src/ev_sepoll.c | 38 +------------------------------------- src/fd.c | 42 ++++++++++++++++++++++++++++++++++++++++++ src/haproxy.c | 1 + 4 files changed, 49 insertions(+), 37 deletions(-) diff --git a/include/proto/fd.h b/include/proto/fd.h index 592327814..e72c43ff8 100644 --- a/include/proto/fd.h +++ b/include/proto/fd.h @@ -76,6 +76,11 @@ int list_pollers(FILE *out); */ void run_poller(); +/* Scan and process the speculative events. This should be called right after + * the poller. + */ +void fd_process_spec_events(); + /* Mark fd as updated and allocate an entry in the update list for this if * it was not already there. This can be done at any time. */ diff --git a/src/ev_sepoll.c b/src/ev_sepoll.c index c5b2a6e7a..71e401440 100644 --- a/src/ev_sepoll.c +++ b/src/ev_sepoll.c @@ -48,7 +48,6 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) int status, eo, en; int fd, opcode; int count; - int spec_idx; int updt_idx; int wait_time; @@ -207,42 +206,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp) } } - /* now process speculative events if any */ - - for (spec_idx = 0; spec_idx < fd_nbspec; ) { - fd = fd_spec[spec_idx]; - eo = fdtab[fd].spec_e; - - /* - * Process the speculative events. - * - * Principle: events which are marked FD_EV_ACTIVE are processed - * with their usual I/O callback. The callback may remove the - * events from the list or tag them for polling. Changes will be - * applied on next round. - */ - - fdtab[fd].ev &= FD_POLL_STICKY; - - if ((eo & FD_EV_STATUS_R) == FD_EV_ACTIVE_R) - fdtab[fd].ev |= FD_POLL_IN; - - if ((eo & FD_EV_STATUS_W) == FD_EV_ACTIVE_W) - fdtab[fd].ev |= FD_POLL_OUT; - - if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev) - fdtab[fd].iocb(fd); - - /* if the fd was removed from the spec list, it has been - * replaced by the next one that we don't want to skip ! - */ - if (spec_idx < fd_nbspec && fd_spec[spec_idx] != fd) - continue; - - spec_idx++; - } - - /* in the end, we have processed status + spec_processed FDs */ + /* the caller will take care of speculative events */ } /* diff --git a/src/fd.c b/src/fd.c index 271874811..ac6ec5f41 100644 --- a/src/fd.c +++ b/src/fd.c @@ -132,6 +132,48 @@ void fd_delete(int fd) maxfd--; } +/* Scan and process the speculative events. This should be called right after + * the poller. + */ +void fd_process_spec_events() +{ + int fd, spec_idx, e; + + /* now process speculative events if any */ + + for (spec_idx = 0; spec_idx < fd_nbspec; ) { + fd = fd_spec[spec_idx]; + e = fdtab[fd].spec_e; + + /* + * Process the speculative events. + * + * Principle: events which are marked FD_EV_ACTIVE are processed + * with their usual I/O callback. The callback may remove the + * events from the list or tag them for polling. Changes will be + * applied on next round. + */ + + fdtab[fd].ev &= FD_POLL_STICKY; + + if ((e & FD_EV_STATUS_R) == FD_EV_ACTIVE_R) + fdtab[fd].ev |= FD_POLL_IN; + + if ((e & FD_EV_STATUS_W) == FD_EV_ACTIVE_W) + fdtab[fd].ev |= FD_POLL_OUT; + + if (fdtab[fd].iocb && fdtab[fd].owner && fdtab[fd].ev) + fdtab[fd].iocb(fd); + + /* if the fd was removed from the spec list, it has been + * replaced by the next one that we don't want to skip ! + */ + if (spec_idx < fd_nbspec && fd_spec[spec_idx] != fd) + continue; + + spec_idx++; + } +} /* disable the specified poller */ void disable_poller(const char *poller_name) diff --git a/src/haproxy.c b/src/haproxy.c index d973ae282..1bb65c1ce 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -1216,6 +1216,7 @@ void run_poll_loop() /* The poller will ensure it returns around */ cur_poller.poll(&cur_poller, next); + fd_process_spec_events(); } }