summaryrefslogtreecommitdiff
path: root/reader.c
diff options
context:
space:
mode:
Diffstat (limited to 'reader.c')
-rwxr-xr-x[-rw-r--r--]reader.c16
1 files changed, 12 insertions, 4 deletions
diff --git a/reader.c b/reader.c
index 277c488..9d4e152 100644..100755
--- a/reader.c
+++ b/reader.c
@@ -500,6 +500,7 @@ void cPvrReadThread::Action(void)
uint8_t *buffer = new uint8_t[bufferSize];
int r;
int retries = 3;
+ int reopen_retries = 5;
struct timeval selTimeout;
fd_set selSet;
@@ -551,11 +552,11 @@ void cPvrReadThread::Action(void)
FD_ZERO(&selSet);
FD_SET(parent->v4l2_fd, &selSet);
r = select(parent->v4l2_fd + 1, &selSet, 0, 0, &selTimeout);
- if (r == 0) {
- log(pvrDEBUG2, "cPvrReadThread::Action():timeout on select from /dev/video%d: %d:%s %s",
+ if ((r == 0) && (errno == 0)) {
+ log(pvrDEBUG1, "cPvrReadThread::Action():timeout on select from /dev/video%d: %d:%s %s",
parent->number, errno, strerror(errno), (retries > 0) ? " - retrying" : "");
- }
- else if (r < 0) {
+ }
+ else if ((r < 0) || (errno != 0)) {
log(pvrERROR, "cPvrReadThread::Action():error on select from /dev/video%d: %d:%s %s",
parent->number, errno, strerror(errno), (retries > 0) ? " - retrying" : "");
retries--;
@@ -563,6 +564,13 @@ void cPvrReadThread::Action(void)
usleep(100);
goto retry;
}
+ while (reopen_retries > 0) {
+ reopen_retries--;
+ if (parent->ReOpen() > 0) {
+ retries = 3;
+ goto retry;
+ }
+ }
break;
}
else if (FD_ISSET(parent->v4l2_fd, &selSet)) {