X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fnetwork%2Fpoll.c;h=cf9554a30ab687c453425985cf52f6a025b24820;hb=3adb049b4bba9e6537940a907cd50ebb52e1a278;hp=d65eccd1cd178bae68ca1b85aeb64f554080f88c;hpb=6ebae83db81a80cdc3cead264455074702223ac0;p=vlc diff --git a/src/network/poll.c b/src/network/poll.c index d65eccd1cd..cf9554a30a 100644 --- a/src/network/poll.c +++ b/src/network/poll.c @@ -26,6 +26,9 @@ #endif #include +#include +#include + #ifdef HAVE_POLL struct pollfd; @@ -36,15 +39,18 @@ int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) abort (); } #else /* !HAVE_POLL */ + #include -#include -#include int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) { fd_set rdset, wrset, exset; struct timeval tv = { 0, 0 }; - int val = -1; + int val; + +resume: + val = -1; + vlc_testcancel (); FD_ZERO (&rdset); FD_ZERO (&wrset); @@ -83,6 +89,15 @@ int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) FD_SET (fd, &exset); } +#ifndef HAVE_ALERTABLE_SELECT +# warning FIXME! Fix cancellation and remove this crap. + if ((timeout < 0) || (timeout > 50)) + { + tv.tv_sec = 0; + tv.tv_usec = 50000; + } + else +#endif if (timeout >= 0) { div_t d = div (timeout, 1000); @@ -91,7 +106,18 @@ int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout) } val = select (val + 1, &rdset, &wrset, &exset, - (timeout >= 0) ? &tv : NULL); + /*(timeout >= 0) ?*/ &tv /*: NULL*/); + +#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;