[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 02/11] poller: add Poller for growable GPollFD a
From: |
Anthony Liguori |
Subject: |
Re: [Qemu-devel] [PATCH 02/11] poller: add Poller for growable GPollFD arrays |
Date: |
Thu, 31 Jan 2013 06:56:56 -0600 |
User-agent: |
Notmuch/0.13.2+93~ged93d79 (http://notmuchmail.org) Emacs/23.3.1 (x86_64-pc-linux-gnu) |
Stefan Hajnoczi <address@hidden> writes:
> QEMU currently uses select(2)-style rfds/wfds/xfds for file descriptor
> event polling. Unfortunately the underlying fd_set type and its macros
> (FD_SET()) have a hardcoded maximum for file descriptors. It is
> possible to exceed this limit so we need a more scalable event polling
> structure.
>
> Poller is a growable array of GPollFDs that will allow us to use
> g_poll(3) instead of select(2) in the future.
>
> Signed-off-by: Stefan Hajnoczi <address@hidden>
How about using a GArray instead?
Regards,
Anthony Liguori
> ---
> include/qemu/poller.h | 56
> +++++++++++++++++++++++++++++++++++++++++++++++++++
> util/Makefile.objs | 1 +
> util/poller.c | 54 +++++++++++++++++++++++++++++++++++++++++++++++++
> 3 files changed, 111 insertions(+)
> create mode 100644 include/qemu/poller.h
> create mode 100644 util/poller.c
>
> diff --git a/include/qemu/poller.h b/include/qemu/poller.h
> new file mode 100644
> index 0000000..7630099
> --- /dev/null
> +++ b/include/qemu/poller.h
> @@ -0,0 +1,56 @@
> +/*
> + * Growable GPollFD arrays
> + *
> + * Copyright 2013 Red Hat, Inc. and/or its affiliates
> + *
> + * Authors:
> + * Stefan Hajnoczi <address@hidden>
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2 or later.
> + * See the COPYING.LIB file in the top-level directory.
> + *
> + */
> +
> +#ifndef QEMU_POLLER_H
> +#define QEMU_POLLER_H
> +
> +#include "qemu-common.h"
> +
> +typedef struct {
> + GPollFD *poll_fds;
> + int nfds;
> + int max;
> +} Poller;
> +
> +void poller_init(Poller *p);
> +void poller_cleanup(Poller *p);
> +
> +/**
> + * poller_reset: Forget all added file descriptors
> + */
> +void poller_reset(Poller *p);
> +
> +/**
> + * poller_add_fd: Enable event polling on a file descriptor
> + *
> + * Called by *_fill() functions that are invoked by the main loop to enable
> + * event polling on file descriptors that they care about. The results can
> be
> + * fetched with poller_get_revents() when the corresponding *_poll() function
> + * is invoked by the main loop.
> + *
> + * Return an index that can be used with poller_get_revents().
> + *
> + * @events: GIOCondition (G_IO_IN, G_IO_OUT, etc) bitmask
> + */
> +int poller_add_fd(Poller *p, int fd, int events);
> +
> +/**
> + * poller_get_revents: Fetch event polling results for an added file
> descriptor
> + *
> + * Return the GIOCondition (G_IO_IN, G_IO_OUT, etc) bitmask.
> + *
> + * @index: Return value from poller_add_fd(). This is not an fd!
> + */
> +int poller_get_revents(Poller *p, int index);
> +
> +#endif /* QEMU_POLLER_H */
> diff --git a/util/Makefile.objs b/util/Makefile.objs
> index 495a178..7ff18d6 100644
> --- a/util/Makefile.objs
> +++ b/util/Makefile.objs
> @@ -8,3 +8,4 @@ util-obj-y += error.o qemu-error.o
> util-obj-$(CONFIG_POSIX) += compatfd.o
> util-obj-y += iov.o aes.o qemu-config.o qemu-sockets.o uri.o notify.o
> util-obj-y += qemu-option.o qemu-progress.o
> +util-obj-y += poller.o
> diff --git a/util/poller.c b/util/poller.c
> new file mode 100644
> index 0000000..663e7a9
> --- /dev/null
> +++ b/util/poller.c
> @@ -0,0 +1,54 @@
> +/*
> + * Growable GPollFD arrays
> + *
> + * Copyright 2013 Red Hat, Inc. and/or its affiliates
> + *
> + * Authors:
> + * Stefan Hajnoczi <address@hidden>
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2 or later.
> + * See the COPYING.LIB file in the top-level directory.
> + *
> + */
> +
> +#include <assert.h>
> +#include <string.h>
> +#include "qemu/poller.h"
> +
> +void poller_init(Poller *p)
> +{
> + memset(p, 0, sizeof(*p));
> +}
> +
> +void poller_cleanup(Poller *p)
> +{
> + g_free(p->poll_fds);
> +}
> +
> +void poller_reset(Poller *p)
> +{
> + p->nfds = 0;
> +}
> +
> +int poller_add_fd(Poller *p, int fd, int events)
> +{
> + int index;
> +
> + index = p->nfds++;
> + if (index >= p->max) {
> + p->max += 64; /* avoid constant reallocation */
> + p->poll_fds = g_realloc(p->poll_fds, p->max *
> sizeof(p->poll_fds[0]));
> + }
> +
> + p->poll_fds[index] = (GPollFD){
> + .fd = fd,
> + .events = events,
> + };
> + return index;
> +}
> +
> +int poller_get_revents(Poller *p, int index)
> +{
> + assert(index < p->nfds);
> + return p->poll_fds[index].revents;
> +}
> --
> 1.8.1
- [Qemu-devel] [PATCH 00/11] main-loop: switch to g_poll(3) on POSIX hosts, Stefan Hajnoczi, 2013/01/31
- [Qemu-devel] [PATCH 03/11] poller: add poller_fill() and poller_poll(), Stefan Hajnoczi, 2013/01/31
- [Qemu-devel] [PATCH 04/11] main-loop: switch to g_poll() on POSIX hosts, Stefan Hajnoczi, 2013/01/31
- [Qemu-devel] [PATCH 05/11] main-loop: switch POSIX glib integration to Poller, Stefan Hajnoczi, 2013/01/31
- [Qemu-devel] [PATCH 07/11] iohandler: switch to Poller, Stefan Hajnoczi, 2013/01/31
- [Qemu-devel] [PATCH 08/11] main-loop: drop rfds/wfds/xfds for good, Stefan Hajnoczi, 2013/01/31
- [Qemu-devel] [PATCH 06/11] slirp: switch to Poller, Stefan Hajnoczi, 2013/01/31
- [Qemu-devel] [PATCH 09/11] aio: extract aio_dispatch() from aio_poll(), Stefan Hajnoczi, 2013/01/31
- [Qemu-devel] [PATCH 10/11] aio: convert aio_poll() to g_poll(3), Stefan Hajnoczi, 2013/01/31