mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-05-07 10:18: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();
|
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
|
/* 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.
|
* 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 status, eo, en;
|
||||||
int fd, opcode;
|
int fd, opcode;
|
||||||
int count;
|
int count;
|
||||||
int spec_idx;
|
|
||||||
int updt_idx;
|
int updt_idx;
|
||||||
int wait_time;
|
int wait_time;
|
||||||
|
|
||||||
@ -207,42 +206,7 @@ REGPRM2 static void _do_poll(struct poller *p, int exp)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* now process speculative events if any */
|
/* the caller will take care of speculative events */
|
||||||
|
|
||||||
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 */
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
42
src/fd.c
42
src/fd.c
@ -132,6 +132,48 @@ void fd_delete(int fd)
|
|||||||
maxfd--;
|
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 */
|
/* disable the specified poller */
|
||||||
void disable_poller(const char *poller_name)
|
void disable_poller(const char *poller_name)
|
||||||
|
@ -1216,6 +1216,7 @@ void run_poll_loop()
|
|||||||
|
|
||||||
/* The poller will ensure it returns around <next> */
|
/* The poller will ensure it returns around <next> */
|
||||||
cur_poller.poll(&cur_poller, next);
|
cur_poller.poll(&cur_poller, next);
|
||||||
|
fd_process_spec_events();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user