[vlc-devel] [PATCH 13/18] Implement vlc_poll() on OS/2

Rémi Denis-Courmont remi at remlab.net
Thu Oct 20 15:10:53 CEST 2011


On Thu, 20 Oct 2011 21:30:20 +0900, KO Myung-Hun <komh at chollian.net>
wrote:
> ---
>  configure.ac     |    2 +-
>  src/Makefile.am  |    1 +
>  src/os2/poll.c   |  115
>  ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  src/win32/poll.c |    6 ---
>  4 files changed, 117 insertions(+), 7 deletions(-)
>  create mode 100644 src/os2/poll.c
> 
> diff --git a/configure.ac b/configure.ac
> index ffc1dee..4687149 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -576,7 +576,7 @@ dnl Check for poll
>  AC_SEARCH_LIBS(poll, [poll], [
>    AC_DEFINE(HAVE_POLL, 1, [Define to 1 if the OS has poll().])
>  ], [
> -  AS_IF([test "${SYS}" != "mingw32" -a "${SYS}" != "mingwce"], [
> +  AS_IF([test "${SYS}" != "mingw32" -a "${SYS}" != "mingwce" -a
"${SYS}"
> != "os2"], [
>      AC_MSG_ERROR([poll() is required.])
>    ])
>  ])
> diff --git a/src/Makefile.am b/src/Makefile.am
> index 0e617e2..347afdf 100644
> --- a/src/Makefile.am
> +++ b/src/Makefile.am
> @@ -281,6 +281,7 @@ SOURCES_libvlc_os2 = \
>  	misc/atomic.c \
>  	posix/filesystem.c \
>  	posix/plugin.c \
> +	os2/poll.c \
>  	os2/thread.c \
>  	os2/specific.c \
>  	$(NULL)
> diff --git a/src/os2/poll.c b/src/os2/poll.c
> new file mode 100644
> index 0000000..7a87658
> --- /dev/null
> +++ b/src/os2/poll.c
> @@ -0,0 +1,115 @@
>
+/*****************************************************************************
> + * poll.c: poll() emulation for OS/2
> +
>
*****************************************************************************
> + * Copyright © 2011 KO Myung-Hun <komh at chollian.et>
> + * Copyright © 2007 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.
> +
>
*****************************************************************************/
> +
> +#ifdef HAVE_CONFIG_H
> +# include "config.h"
> +#endif
> +
> +#include <stdlib.h>
> +#include <string.h>
> +#include <errno.h>
> +#include <sys/time.h>
> +
> +#include <vlc_common.h>
> +#include <vlc_network.h>
> +
> +int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
> +{
> +    fd_set rdset;
> +    fd_set wrset;
> +    fd_set exset;
> +    struct timeval tv = { 0, 0 };
> +    int val;
> +

Either you need this...

> +    if (nfds > FD_SETSIZE)
> +    {
> +        errno = EINVAL;
> +        return -1;
> +    }
> +
> +resume:
> +    val = -1;
> +    vlc_testcancel ();
> +
> +    FD_ZERO (&rdset);
> +    FD_ZERO (&wrset);
> +    FD_ZERO (&exset);
> +    for (unsigned i = 0; i < nfds; i++)
> +    {
> +        int fd = fds[i].fd;
> +
> +        if (fds[i].fd >= FD_SETSIZE)
> +        {
> +            errno = EINVAL;
> +            return -1;
> +        }

...or you need that, depending how FD_SET() and FD_ISSET() are
implemented. But I don't see why you'd need both checks.

> +
> +        if (val < fd)
> +            val = fd;
> +
> +        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);
> +    }
> +
> +#ifndef HAVE_ALERTABLE_SELECT
> +# warning FIXME! Fix cancellation and remove this crap.

Nobody bothered to fix this bug in the VLC for Windows. Indeed,
WSAWaitForMultipleEvents(), WaitForMultipleObjectsEx(), or on Vista
possibly WSAPoll() should be used instead of plain old select(). I don't
know OS/2, but there ought to be a better way than this.

> +    if ((timeout < 0) || (timeout > 50))
> +    {
> +        tv.tv_sec = 0;
> +        tv.tv_usec = 50000;
> +    }
> +    else
> +#endif
> +    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, &exset, &tv);
> +
> +#ifndef HAVE_ALERTABLE_SELECT
> +    if (val == 0)
> +    {
> +        if (timeout > 0)
> +            timeout -= (timeout > 50) ? 50 : timeout;
> +        if (timeout != 0)
> +            goto resume;
> +    }
> +#endif
> +
> +    if (val == -1)
> +        return -1;
> +
> +    for (unsigned i = 0; i < nfds; i++)
> +    {
> +        int fd = fds[i].fd;
> +        fds[i].revents = (FD_ISSET (fd, &rdset) ? POLLIN : 0)
> +                       | (FD_ISSET (fd, &wrset) ? POLLOUT : 0)
> +                       | (FD_ISSET (fd, &exset) ? POLLPRI : 0);
> +    }
> +    return val;
> +}
> diff --git a/src/win32/poll.c b/src/win32/poll.c
> index 4fa693f..1b2ec48 100644
> --- a/src/win32/poll.c
> +++ b/src/win32/poll.c
> @@ -35,12 +35,6 @@
>  #define FD_SETSIZE 0
>  #include <vlc_network.h>
>  
> -#ifdef __OS2__
> -#include <sys/time.h>
> -#include <sys/select.h>
> -#define SOCKET unsigned
> -#endif
> -
>  int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
>  {
>      size_t setsize = sizeof (fd_set) + nfds * sizeof (SOCKET);

-- 
Rémi Denis-Courmont
http://www.remlab.net/



More information about the vlc-devel mailing list