[vlc-devel] [PATCH] misc: implement vlc_poll_i11e() on OS/2
KO Myung-Hun
komh78 at gmail.com
Thu Jul 23 08:50:12 CEST 2015
---
src/misc/interrupt.c | 4 ++++
src/os2/thread.c | 32 +++++++++++++++++++++++++-------
2 files changed, 29 insertions(+), 7 deletions(-)
diff --git a/src/misc/interrupt.c b/src/misc/interrupt.c
index 08d5d81..5bc2b50 100644
--- a/src/misc/interrupt.c
+++ b/src/misc/interrupt.c
@@ -342,7 +342,11 @@ static int vlc_poll_i11e_inner(struct pollfd *restrict fds, unsigned nfds,
fd[1] = fd[0];
else
# endif
+#ifndef __OS2__
if (vlc_pipe(fd))
+#else
+ if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fd))
+#endif
{
vlc_testcancel();
errno = ENOMEM;
diff --git a/src/os2/thread.c b/src/os2/thread.c
index e221632..7d9673c 100644
--- a/src/os2/thread.c
+++ b/src/os2/thread.c
@@ -785,6 +785,7 @@ int vlc_poll_os2( struct pollfd *fds, unsigned nfds, int timeout )
fd_set rdset, wrset, exset;
struct timeval tv = { 0, 0 };
+ struct timeval *ptv = NULL;
int val = -1;
@@ -794,6 +795,16 @@ int vlc_poll_os2( struct pollfd *fds, unsigned nfds, int timeout )
for( unsigned i = 0; i < nfds; i++ )
{
int fd = fds[ i ].fd;
+
+ fds[ i ].revents = 0;
+ if( getsockopt( fd, SOL_SOCKET, SO_TYPE,
+ &( int ){ 0 }, &( int ){ sizeof( int )}) == -1 &&
+ ( errno == ENOTSOCK || errno == EBADF ))
+ {
+ fds[ i ].revents = POLLNVAL;
+ continue;
+ }
+
if( val < fd )
val = fd;
@@ -816,19 +827,26 @@ int vlc_poll_os2( struct pollfd *fds, unsigned nfds, int timeout )
div_t d = div( timeout, 1000 );
tv.tv_sec = d.quot;
tv.tv_usec = d.rem * 1000;
+
+ ptv = &tv;
}
- val = vlc_select( val + 1, &rdset, &wrset, &exset,
- ( timeout >= 0 ) ? &tv : NULL );
- if( val == -1 )
+ if( val != -1 && vlc_select( val + 1, &rdset, &wrset, &exset, ptv ) == -1 )
return -1;
+ val = 0;
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 );
+ if( fds[ i ].revents == 0 )
+ {
+ 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 );
+ }
+
+ if( fds[ i ].revents != 0 )
+ val++;
}
return val;
--
1.9.5
More information about the vlc-devel
mailing list