summaryrefslogtreecommitdiff
path: root/reader.c
diff options
context:
space:
mode:
authorLars Hanisch <dvb@flensrocker.de>2010-06-09 21:09:39 +0200
committerLars Hanisch <dvb@flensrocker.de>2010-06-09 21:09:39 +0200
commit643ebe816466891354cf511e9a570236a8884d7e (patch)
tree9e63880bb93110b9861efb5b7b103d67658de820 /reader.c
parentf3b6986f0de148868a0a8baebb6eb7fa2847e2ea (diff)
downloadvdr-plugin-pvrinput-643ebe816466891354cf511e9a570236a8884d7e.tar.gz
vdr-plugin-pvrinput-643ebe816466891354cf511e9a570236a8884d7e.tar.bz2
reopen video device if select reports an error
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)) {