REORG: fd: centralize the processing of speculative events

Speculative events are independant on the poller, so they can be
centralized in fd.c.
This commit is contained in:
Willy Tarreau 2012-11-11 16:43:45 +01:00
parent 6ea20b1acb
commit 09f24569d4
4 changed files with 49 additions and 37 deletions

View File

@ -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 <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.
*/

View File

@ -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 */
}
/*

View File

@ -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)

View File

@ -1216,6 +1216,7 @@ void run_poll_loop()
/* The poller will ensure it returns around <next> */
cur_poller.poll(&cur_poller, next);
fd_process_spec_events();
}
}