mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-05-03 16:28:01 +00:00
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:
parent
6ea20b1acb
commit
09f24569d4
@ -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.
|
||||
*/
|
||||
|
@ -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 */
|
||||
}
|
||||
|
||||
/*
|
||||
|
42
src/fd.c
42
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)
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user