Commit 80fb50ea authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Code factorization

parent e5ca059b
...@@ -772,6 +772,7 @@ fi # end "${SYS}" != "mingw32" -a "${SYS}" != "mingwce" ...@@ -772,6 +772,7 @@ fi # end "${SYS}" != "mingw32" -a "${SYS}" != "mingwce"
AC_HEADER_TIME AC_HEADER_TIME
AC_CHECK_TYPE(ssize_t, int)
AC_SEARCH_LIBS(poll, [poll], [AC_DEFINE(HAVE_POLL, 1, [Define to 1 if the OS is usabl... err, has poll().])]) AC_SEARCH_LIBS(poll, [poll], [AC_DEFINE(HAVE_POLL, 1, [Define to 1 if the OS is usabl... err, has poll().])])
dnl Check for dirent dnl Check for dirent
......
...@@ -127,7 +127,7 @@ void net_Close (int fd) ...@@ -127,7 +127,7 @@ void net_Close (int fd)
} }
static int static ssize_t
net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv, net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv,
const v_socket_t *const *restrict vsv, const v_socket_t *const *restrict vsv,
uint8_t *restrict p_buf, size_t i_buflen, uint8_t *restrict p_buf, size_t i_buflen,
...@@ -135,10 +135,10 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv, ...@@ -135,10 +135,10 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv,
{ {
size_t i_total = 0; size_t i_total = 0;
do while (i_buflen > 0)
{ {
unsigned int i; unsigned i;
int n, delay_ms; ssize_t n;
#ifdef HAVE_POLL #ifdef HAVE_POLL
struct pollfd ufd[fdc]; struct pollfd ufd[fdc];
#else #else
...@@ -146,21 +146,18 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv, ...@@ -146,21 +146,18 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv,
fd_set set; fd_set set;
#endif #endif
if( i_buflen == 0 ) int delay_ms = 500;
return i_total; // output buffer full if ((wait_ms != -1) && (wait_ms < 500))
delay_ms = 500;
if( (wait_ms != -1) && (wait_ms < 500) )
delay_ms = wait_ms; delay_ms = wait_ms;
if( p_this->b_die ) if (p_this->b_die)
{ {
errno = EINTR; errno = EINTR;
goto error; goto error;
} }
#ifdef HAVE_POLL #ifdef HAVE_POLL
memset(ufd, 0, sizeof (ufd) ); memset (ufd, 0, sizeof (ufd));
for( i = 0; i < fdc; i++ ) for( i = 0; i < fdc; i++ )
{ {
...@@ -169,25 +166,6 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv, ...@@ -169,25 +166,6 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv,
} }
n = poll( ufd, fdc, delay_ms ); n = poll( ufd, fdc, delay_ms );
if( n == -1 )
goto error;
assert( (unsigned int)n <= fdc );
for( i = 0; n > 0; i++ )
{
if( (i_total > 0) && (ufd[i].revents & POLLERR) )
return i_total; // error will be dequeued on next run
if( ufd[i].revents )
{
fdc = 1;
fdv += i;
vsv += i;
n--;
goto receive;
}
}
#else #else
FD_ZERO (&set); FD_ZERO (&set);
...@@ -209,23 +187,32 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv, ...@@ -209,23 +187,32 @@ net_ReadInner( vlc_object_t *restrict p_this, unsigned fdc, const int *fdv,
n = select( maxfd + 1, &set, NULL, NULL, n = select( maxfd + 1, &set, NULL, NULL,
(wait_ms == -1) ? NULL (wait_ms == -1) ? NULL
: &(struct timeval){ 0, delay_ms * 1000 } ); : &(struct timeval){ 0, delay_ms * 1000 } );
#endif
if( n == -1 ) if( n == -1 )
goto error; goto error;
for( i = 0; n > 0; i++ ) assert ((unsigned)n <= fdc);
if( FD_ISSET (fdv[i], &set) )
{
fdc = 1;
fdv += i;
vsv += i;
n--;
goto receive;
}
#endif
continue; if (n == 0) // timeout
continue;
for (i = 0;; i++)
{
#ifdef HAVE_POLL
if ((i_total > 0) && (ufd[i].revents & POLLERR))
return i_total; // error will be dequeued on next run
if ((ufd[i].revents & POLLIN) == 0)
#else
if (!FD_ISSET (fdv[i], &set))
continue;
#endif
fdc = 1;
fdv += i;
vsv += i;
break;
}
receive:
if( (*vsv) != NULL ) if( (*vsv) != NULL )
{ {
n = (*vsv)->pf_recv( (*vsv)->p_sys, p_buf, i_buflen ); n = (*vsv)->pf_recv( (*vsv)->p_sys, p_buf, i_buflen );
...@@ -272,19 +259,16 @@ receive: ...@@ -272,19 +259,16 @@ receive:
p_buf += n; p_buf += n;
i_buflen -= n; i_buflen -= n;
if( wait_ms == -1 ) if (!waitall)
{ return i_total;
if( !waitall )
return i_total; if (wait_ms != -1)
}
else
{ {
wait_ms -= delay_ms; wait_ms -= delay_ms;
if (wait_ms == 0)
return i_total; // time's up!
} }
} }
while( wait_ms );
return i_total; // timeout
error: error:
msg_Err( p_this, "Read error: %s", net_strerror (net_errno) ); msg_Err( p_this, "Read error: %s", net_strerror (net_errno) );
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment