|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 13/20] libxl: libxl_event.c:beforepoll_internal, REQUIRE_FDS
On Fri, 2012-03-16 at 16:26 +0000, Ian Jackson wrote:
> Introduce definition and use of a new function-local macro REQUIRE_FDS
> to avoid repeatedly spelling out which fds we are interested in.
>
> We are going to introduce a new fd for the SIGCHLD self-pipe.
>
> Signed-off-by: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> ---
> tools/libxl/libxl_event.c | 82 ++++++++++++++++++++++++++++++--------------
> 1 files changed, 56 insertions(+), 26 deletions(-)
>
> diff --git a/tools/libxl/libxl_event.c b/tools/libxl/libxl_event.c
> index 5ac6334..5405299 100644
> --- a/tools/libxl/libxl_event.c
> +++ b/tools/libxl/libxl_event.c
> @@ -593,6 +593,45 @@ static int beforepoll_internal(libxl__gc *gc,
> libxl__poller *poller,
> int rc;
>
> /*
> + * We need to look at the fds we want twice: firstly, to count
> + * them so we can make the rindex array big enough, and secondly
> + * to actually fill the arrays in.
> + *
> + * To ensure correctness and avoid repeating the logic for
> + * deciding which fds are relevant, we define a macro
> + * REQUIRE_FDS( BODY )
> + * which calls
> + * do{
> + * int req_fd;
> + * int req_events;
> + * BODY;
> + * }while(0)
> + * for each fd with a nonzero events. This is invoked twice.
> + *
> + * The definition of REQUIRE_FDS is simplified with the helper
> + * macro
> + * void REQUIRE_FD(int req_fd, int req_events, BODY);
> + */
> +
> +#define REQUIRE_FDS(BODY) do{ \
> + \
> + LIBXL_LIST_FOREACH(efd, &CTX->efds, entry) \
> + REQUIRE_FD(efd->fd, efd->events, BODY); \
> + \
> + REQUIRE_FD(poller->wakeup_pipe[0], POLLIN, BODY); \
> + \
> + }while(0)
> +
> +#define REQUIRE_FD(req_fd_, req_events_, BODY) do{ \
> + int req_events = (req_events_); \
> + int req_fd = (req_fd_); \
> + if (req_events) { \
> + BODY; \
> + } \
> + }while(0)
> +
> +
> + /*
> * In order to be able to efficiently find the libxl__ev_fd
> * for a struct poll during _afterpoll, we maintain a shadow
> * data structure in CTX->fd_beforepolled: each slot in
> @@ -609,13 +648,13 @@ static int beforepoll_internal(libxl__gc *gc,
> libxl__poller *poller,
> * not to mess with fd_rindex.
> */
>
> - int maxfd = poller->wakeup_pipe[0] + 1;
> - LIBXL_LIST_FOREACH(efd, &CTX->efds, entry) {
> - if (!efd->events)
> - continue;
> - if (efd->fd >= maxfd)
> - maxfd = efd->fd + 1;
> - }
> + int maxfd = 0;
> +
> + REQUIRE_FDS({
> + if (req_fd >= maxfd)
> + maxfd = req_fd + 1;
> + });
> +
> /* make sure our array is as big as *nfds_io */
> if (poller->fd_rindex_allocd < maxfd) {
> assert(maxfd < INT_MAX / sizeof(int) / 2);
> @@ -630,25 +669,16 @@ static int beforepoll_internal(libxl__gc *gc,
> libxl__poller *poller,
>
> int used = 0;
>
> -#define REQUIRE_FD(req_fd, req_events, efd) do{ \
> - if ((req_events)) { \
> - if (used < *nfds_io) { \
> - fds[used].fd = (req_fd); \
> - fds[used].events = (req_events); \
> - fds[used].revents = 0; \
> - assert((req_fd) < poller->fd_rindex_allocd); \
> - poller->fd_rindex[(req_fd)] = used; \
> - } \
> - used++; \
> - } \
> - }while(0)
> -
> - LIBXL_LIST_FOREACH(efd, &CTX->efds, entry)
> - REQUIRE_FD(efd->fd, efd->events, efd);
> -
> - REQUIRE_FD(poller->wakeup_pipe[0], POLLIN, 0);
> -
> -#undef REQUIRE_FD
> + REQUIRE_FDS({
> + if (used < *nfds_io) {
> + fds[used].fd = req_fd;
> + fds[used].events = req_events;
> + fds[used].revents = 0;
> + assert(req_fd < poller->fd_rindex_allocd);
> + poller->fd_rindex[req_fd] = used;
> + }
> + used++;
> + });
>
> rc = used <= *nfds_io ? 0 : ERROR_BUFFERFULL;
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |