From: Rémi Denis-Courmont Date: Mon, 12 Feb 2007 17:27:59 +0000 (+0000) Subject: poll() replacement X-Git-Tag: 0.9.0-test0~8607 X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=c0b2d638f8aaa96da3dcee62598927603fe4f843;p=vlc poll() replacement --- diff --git a/include/vlc_network.h b/include/vlc_network.h index 8bcbac7244..36b64c5d04 100644 --- a/include/vlc_network.h +++ b/include/vlc_network.h @@ -2,6 +2,7 @@ * vlc_network.h: interface to communicate with network plug-ins ***************************************************************************** * Copyright (C) 2002-2005 the VideoLAN team + * Copyright © 2006-2007 Rémi Denis-Courmont * $Id$ * * Authors: Christophe Massiot @@ -140,6 +141,27 @@ VLC_EXPORT( int, __net_vaPrintf, ( vlc_object_t *p_this, int fd, const v_socket_ int inet_pton(int af, const char *src, void *dst); #endif +#ifndef HAVE_POLL +enum +{ + POLLIN=1, + POLLOUT=2, + POLLPRI=4 + POLLERR=8, // unsupported stub + POLLHUP=16, // unsupported stub + POLLNVAL=32 // unsupported stub +}; + +struct pollfd +{ + int fd; + int events; + int revents; +}; + +int poll (struct pollfd *fds, unsigned nfds, int timeout); +#endif + /***************************************************************************** * net_StopRecv/Send diff --git a/src/Makefile.am b/src/Makefile.am index a1cf8c733f..9df83e26a7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -275,6 +275,7 @@ SOURCES_libvlc_common = \ network/httpd.c \ network/rootwrap.c \ network/tls.c \ + network/poll.c \ text/charset.c \ text/strings.c \ text/unicode.c \ diff --git a/src/network/poll.c b/src/network/poll.c new file mode 100644 index 0000000000..b8b19721a2 --- /dev/null +++ b/src/network/poll.c @@ -0,0 +1,78 @@ +/***************************************************************************** + * poll.c: I/O event multiplexing + ***************************************************************************** + * Copyright © 2007 Rémi Denis-Courmont + * $Id$ + * + * Author: Rémi Denis-Courmont + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#include + +#ifndef HAVE_POLL +#include +#include +#include + +int poll (struct pollfd *fds, unsigned nfds, int timeout) +{ + fd_set rdset, wrset, exset; + struct timeval tv = { 0, 0 }; + int val = -1; + + + FD_ZERO (&rdset); + FD_ZERO (&wrset); + FD_ZERO (&exset); + for (unsigned i = 0; i < nfds; i++) + { + int fd = fds[i].fd; + if (val < fd) + val = fd; + + /* I assume the OS has a solution select overflow if it does not have + * poll(). If it did not, we are screwed anyway. */ + if (fds[i].events & POLLIN) + FD_SET (fd, &rdset); + if (fds[i].events & POLLOUT) + FD_SET (fd, &wrset); + if (fds[i].events & POLLPRI) + FD_SET (fd, &exset); + } + + if (timeout >= 0) + { + div_t d = div (timeout, 1000); + tv.tv_sec = d.quot; + tv.tv_usec = d.rem * 1000; + } + + val = select (val + 1, &rdset, &wrset, NULL, + (timeout >= 0) ? &tv : NULL); + if (val == -1) + return -1; + + for (unsigned i = 0; i < nfds; i++) + { + int fd = fds[i].fd; + fds[i].revents = (FD_ISSET (fds[i].fd, &rdset) ? POLLIN : 0) + | (FD_ISSET (fds[i].fd, &wrset) ? POLLOUT : 0) + | (FD_ISSET (fds[i].fd, &exset) ? POLLPRI : 0); + } + return val; +} +#endif /* !HAVE_POLL */