summaryrefslogtreecommitdiffstats
path: root/abs/core-testing/mythtv/trunk/mythtv-svn/DeviceReadBuffer-polltimeout.2.patch
diff options
context:
space:
mode:
Diffstat (limited to 'abs/core-testing/mythtv/trunk/mythtv-svn/DeviceReadBuffer-polltimeout.2.patch')
-rw-r--r--abs/core-testing/mythtv/trunk/mythtv-svn/DeviceReadBuffer-polltimeout.2.patch219
1 files changed, 219 insertions, 0 deletions
diff --git a/abs/core-testing/mythtv/trunk/mythtv-svn/DeviceReadBuffer-polltimeout.2.patch b/abs/core-testing/mythtv/trunk/mythtv-svn/DeviceReadBuffer-polltimeout.2.patch
new file mode 100644
index 0000000..5bb713f
--- /dev/null
+++ b/abs/core-testing/mythtv/trunk/mythtv-svn/DeviceReadBuffer-polltimeout.2.patch
@@ -0,0 +1,219 @@
+Index: libs/libmythtv/DeviceReadBuffer.h
+===================================================================
+--- libs/libmythtv/DeviceReadBuffer.h (revision 18515)
++++ libs/libmythtv/DeviceReadBuffer.h (working copy)
+@@ -59,7 +59,7 @@
+ void IncrReadPointer(uint len);
+
+ bool HandlePausing(void);
+- bool Poll(void) const;
++ bool Poll(void);
+ uint WaitForUnused(uint bytes_needed) const;
+ uint WaitForUsed (uint bytes_needed) const;
+
+Index: libs/libmythtv/DeviceReadBuffer.cpp
+===================================================================
+--- libs/libmythtv/DeviceReadBuffer.cpp (revision 18515)
++++ libs/libmythtv/DeviceReadBuffer.cpp (working copy)
+@@ -90,9 +90,14 @@
+
+ void DeviceReadBuffer::Start(void)
+ {
+- lock.lock();
+- bool was_running = running;
+- lock.unlock();
++ bool was_running;
++
++ {
++ QMutexLocker locker(&lock);
++ was_running = running;
++ error = false;
++ }
++
+ if (was_running)
+ {
+ VERBOSE(VB_IMPORTANT, LOC_ERR + "Start(): Already running.");
+@@ -104,6 +109,8 @@
+ {
+ VERBOSE(VB_IMPORTANT,
+ LOC_ERR + QString("Start(): pthread_create failed.") + ENO);
++
++ QMutexLocker locker(&lock);
+ error = true;
+ }
+ }
+@@ -118,21 +125,25 @@
+ used = 0;
+ readPtr = buffer;
+ writePtr = buffer;
++
++ error = false;
+ }
+
+ void DeviceReadBuffer::Stop(void)
+ {
+ bool was_running = IsRunning();
+- lock.lock();
+- run = false;
+- lock.unlock();
+
+ if (!was_running)
+ {
+- VERBOSE(VB_IMPORTANT, LOC_ERR + "Stop(): Not running.");
++ VERBOSE(VB_IMPORTANT, LOC + "Stop(): Not running.");
+ return;
+ }
+
++ {
++ QMutexLocker locker(&lock);
++ run = false;
++ }
++
+ pthread_join(thread, NULL);
+ }
+
+@@ -229,10 +240,11 @@
+ {
+ uint errcnt = 0;
+
+- lock.lock();
+- run = true;
+- running = true;
+- lock.unlock();
++ {
++ QMutexLocker locker(&lock);
++ run = true;
++ running = true;
++ }
+
+ while (run)
+ {
+@@ -248,6 +260,15 @@
+ if (using_poll && !Poll())
+ continue;
+
++ {
++ QMutexLocker locker(&lock);
++ if (error)
++ {
++ VERBOSE(VB_RECORD, LOC + "fill_ringbuffer: error state");
++ break;
++ }
++ }
++
+ // Limit read size for faster return from read
+ size_t read_size =
+ min(dev_read_size, (size_t) WaitForUnused(TSPacket::SIZE));
+@@ -268,9 +289,10 @@
+ }
+ }
+
+- lock.lock();
+- running = false;
+- lock.unlock();
++ {
++ QMutexLocker locker(&lock);
++ running = false;
++ }
+ }
+
+ bool DeviceReadBuffer::HandlePausing(void)
+@@ -293,7 +315,7 @@
+ return true;
+ }
+
+-bool DeviceReadBuffer::Poll(void) const
++bool DeviceReadBuffer::Poll(void)
+ {
+ #ifdef USING_MINGW
+ #warning mingw DeviceReadBuffer::Poll
+@@ -302,31 +324,53 @@
+ return false;
+ #else
+ bool retval = true;
+- while (true)
++ uint timeout_cnt = 0;
++
++ for (;;)
+ {
+ struct pollfd polls;
+ polls.fd = _stream_fd;
+ polls.events = POLLIN;
+ polls.revents = 0;
+
+- int ret = poll(&polls, 1 /*number of polls*/, 10 /*msec*/);
+- if (IsPauseRequested() || !IsOpen() || !run)
++ int ret = poll(&polls, 1 /*number of polls*/, 250 /*msec*/);
++
++ if (polls.revents & (POLLERR | POLLHUP | POLLNVAL))
+ {
++ VERBOSE(VB_IMPORTANT, LOC + "poll error");
++ error = true;
++ return true;
++ }
++
++ if (!run || !IsOpen() || IsPauseRequested())
++ {
+ retval = false;
+ break; // are we supposed to pause, stop, etc.
+ }
+
+ if (ret > 0)
+ break; // we have data to read :)
+- if ((-1 == ret) && (EOVERFLOW == errno))
+- break; // we have an error to handle
+-
+- if ((-1 == ret) && ((EAGAIN == errno) || (EINTR == errno)))
+- continue; // errors that tell you to try again
+- if (ret == 0)
+- continue; // timed out, try again
+-
+- usleep(2500);
++ if (ret < 0)
++ {
++ if ((EOVERFLOW == errno))
++ break; // we have an error to handle
++ if ((EAGAIN == errno) || (EINTR == errno))
++ continue; // errors that tell you to try again
++ usleep(2500);
++ }
++ else // ret == 0
++ {
++ if (++timeout_cnt > 9)
++ {
++ VERBOSE(VB_RECORD, LOC_ERR + "Poll giving up");
++ QMutexLocker locker(&lock);
++ error = true;
++ return true;
++ }
++ if (timeout_cnt % 2)
++ VERBOSE(VB_RECORD, LOC_ERR + QString("Poll timeout (%1)")
++ .arg(timeout_cnt));
++ }
+ }
+ return retval;
+ #endif //!USING_MINGW
+@@ -360,9 +404,9 @@
+
+ if (++errcnt > 5)
+ {
+- lock.lock();
++ QMutexLocker locker(&lock);
++ VERBOSE(VB_RECORD, LOC + "Too many errors.");
+ error = true;
+- lock.unlock();
+ return false;
+ }
+
+@@ -376,10 +420,8 @@
+ VERBOSE(VB_IMPORTANT, LOC +
+ QString("End-Of-File? fd(%1)").arg(_stream_fd));
+
+- lock.lock();
++ QMutexLocker locker(&lock);
+ eof = true;
+- lock.unlock();
+-
+ return false;
+ }
+ usleep(500);