From ff1c0f6eea58903a6e89023f8d148f29d058f7ce Mon Sep 17 00:00:00 2001 From: Gleb Pinigin Date: Sun, 28 Jul 2013 18:32:51 +0700 Subject: [PATCH 09/23] io: implement network timeout(default 60s) --- src/network/io.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/network/io.c b/src/network/io.c index dc5ef12..effaf15 100644 --- a/src/network/io.c +++ b/src/network/io.c @@ -33,6 +33,7 @@ #endif #include +#include #include #include @@ -73,6 +74,9 @@ # define SOL_DCCP 269 #endif +#define MAX_TIMEOUT 60000 +#define POLL_TIMEOUT 10000 + #include "libvlc.h" /* vlc_object_waitpipe */ extern int rootwrap_bind (int family, int socktype, int protocol, @@ -267,6 +271,7 @@ net_Read (vlc_object_t *restrict p_this, int fd, const v_socket_t *vs, ufd[1].fd = vlc_object_waitpipe (p_this); ufd[1].events = POLLIN; + int i_timepassed = 0; size_t i_total = 0; do { @@ -288,6 +293,13 @@ net_Read (vlc_object_t *restrict p_this, int fd, const v_socket_t *vs, if (n < 0) { + if (i_timepassed >= MAX_TIMEOUT && i_total == 0) + { + access_t *p_access = (access_t *)p_this; + p_access->info.b_eof = true; + goto error; + } + switch (net_errno) { case EAGAIN: /* no data */ @@ -326,8 +338,9 @@ net_Read (vlc_object_t *restrict p_this, int fd, const v_socket_t *vs, return -1; } + i_timepassed += POLL_TIMEOUT; /* Wait for more data */ - if (poll (ufd, sizeof (ufd) / sizeof (ufd[0]), -1) < 0) + if (poll (ufd, sizeof (ufd) / sizeof (ufd[0]), POLL_TIMEOUT) < 0) { if (errno == EINTR) continue; -- 1.8.3.4 (Apple Git-47)