|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] mini-os: implement poll(2)
On Tue, 2013-02-19 at 13:41 +0000, Wei Liu wrote:
> It is just a wrapper around select(2).
>
> Signed-off-by: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
> extras/mini-os/include/posix/poll.h | 1 +
> extras/mini-os/lib/sys.c | 90
> ++++++++++++++++++++++++++++++++++-
> 2 files changed, 90 insertions(+), 1 deletion(-)
> create mode 100644 extras/mini-os/include/posix/poll.h
>
> diff --git a/extras/mini-os/include/posix/poll.h
> b/extras/mini-os/include/posix/poll.h
> new file mode 100644
> index 0000000..06fb41a
> --- /dev/null
> +++ b/extras/mini-os/include/posix/poll.h
> @@ -0,0 +1 @@
> +#include <sys/poll.h>
> diff --git a/extras/mini-os/lib/sys.c b/extras/mini-os/lib/sys.c
> index 3cc3340..aae02df 100644
> --- a/extras/mini-os/lib/sys.c
> +++ b/extras/mini-os/lib/sys.c
> @@ -31,6 +31,7 @@
> #include <tpm_tis.h>
> #include <xenbus.h>
> #include <xenstore.h>
> +#include <poll.h>
>
> #include <sys/types.h>
> #include <sys/unistd.h>
> @@ -678,6 +679,29 @@ static void dump_set(int nfds, fd_set *readfds, fd_set
> *writefds, fd_set *except
> #define dump_set(nfds, readfds, writefds, exceptfds, timeout)
> #endif
>
> +#ifdef LIBC_DEBUG
> +static void dump_pollfds(struct pollfd *pfd, int nfds, int timeout)
> +{
> + int i, comma, fd;
> +
> + printk("[");
> + comma = 0;
> + for (i = 0; i < nfds; i++) {
> + fd = pfd[i].fd;
> + if (comma)
> + printk(", ");
> + printk("%d(%c)/%02x", fd, file_types[files[fd].type],
> + pfd[i].events);
> + comma = 1;
> + }
> + printk("]");
> +
> + printk(", %d, %d", nfds, timeout);
> +}
> +#else
> +#define dump_pollfds(pfds, nfds, timeout)
> +#endif
> +
> /* Just poll without blocking */
> static int select_poll(int nfds, fd_set *readfds, fd_set *writefds, fd_set
> *exceptfds)
> {
> @@ -983,6 +1007,71 @@ out:
> return ret;
> }
>
> +/* Wrap around select */
> +int poll(struct pollfd _pfd[], nfds_t _nfds, int _timeout)
> +{
> + int ret;
> + int i, fd;
> + struct timeval _timeo, *timeo = NULL;
> + fd_set rfds, wfds, efds;
> + int max_fd = -1;
> +
> + DEBUG("poll(");
> + dump_pollfds(_pfd, _nfds, _timeout);
> + DEBUG(")\n");
> +
> + if (_timeout != -1) {
should be _timeout >= 0, any negative value will cause an infinite wait.
> + /* Timeout in poll is in millisecond. */
> + _timeo.tv_sec = _timeout / 1000;
> + _timeo.tv_usec = (_timeout - _timeo.tv_sec * 1000) * 1000;
why not _timeout % 1000? gcc can also optimize and detect you have a
division and a module and use only a single instruction in x86.
> + timeo = &_timeo;
> + }
> +
> + FD_ZERO(&rfds);
> + FD_ZERO(&wfds);
> + FD_ZERO(&efds);
> +
> + for (i = 0; i < _nfds; i++) {
> + fd = _pfd[i].fd;
I think you should check if fd is < 0 and return EINVAL (not sure about
the error code). Well.. probably you should check fd in range 0..1023.
> + /* map POLL* into readfds and writefds */
> + /* POLLIN -> readfds
> + * POLLOUT -> writefds
> + * POLL* -> none
> + */
> + if (_pfd[i].events & POLLIN)
> + FD_SET(fd, &rfds);
> + if (_pfd[i].events & POLLOUT)
> + FD_SET(fd, &wfds);
> + /* always set exceptfds */
> + FD_SET(fd, &efds);
> + _pfd[i].revents = 0;
> + if (fd > max_fd)
> + max_fd = fd;
> + }
> +
> + ret = select(max_fd+1, &rfds, &wfds, &efds, timeo);
> +
> + for (i = 0; i < _nfds; i++) {
> + fd = _pfd[i].fd;
> + if (FD_ISSET(fd, &efds)) {
> + /* anything bad happens we set POLLERR, ignoring PULLHUP
> + * POLLNVAL */
> + _pfd[i].revents |= POLLERR;
> + continue;
> + }
> + if (FD_ISSET(fd, &rfds))
> + _pfd[i].revents |= POLLIN;
> + if (FD_ISSET(fd, &wfds))
> + _pfd[i].revents |= POLLOUT;
> + }
> +
> + DEBUG("poll(");
> + dump_pollfds(_pfd, _nfds, _timeout);
> + DEBUG(")\n");
> +
you probably want to save and restore errno or are we sure dump_pollfds
cannot overwrite errno ?
> + return ret;
> +}
> +
> #ifdef HAVE_LWIP
> int socket(int domain, int type, int protocol)
> {
> @@ -1360,7 +1449,6 @@ unsupported_function(int, tcgetattr, 0);
> unsupported_function(int, grantpt, -1);
> unsupported_function(int, unlockpt, -1);
> unsupported_function(char *, ptsname, NULL);
> -unsupported_function(int, poll, -1);
>
> /* net/if.h */
> unsupported_function_log(unsigned int, if_nametoindex, -1);
Frediano
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |