diff options
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.patch | 219 |
1 files changed, 0 insertions, 219 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 deleted file mode 100644 index 5bb713f..0000000 --- a/abs/core-testing/mythtv/trunk/mythtv-svn/DeviceReadBuffer-polltimeout.2.patch +++ /dev/null @@ -1,219 +0,0 @@ -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); |