diff --git a/mythtv/libs/libmythtv/DeviceReadBuffer.cpp b/mythtv/libs/libmythtv/DeviceReadBuffer.cpp index 95ce4490c82..68de6e0e1a3 100644 --- a/mythtv/libs/libmythtv/DeviceReadBuffer.cpp +++ b/mythtv/libs/libmythtv/DeviceReadBuffer.cpp @@ -23,7 +23,7 @@ DeviceReadBuffer::DeviceReadBuffer(DeviceReaderCB *cb, bool use_poll) readerCB(cb), // Data for managing the device ringbuffer - dorun(false), running(false), + dorun(false), eof(false), error(false), request_pause(false), paused(false), using_poll(use_poll), max_poll_wait(2500 /*ms*/), @@ -58,10 +58,12 @@ DeviceReadBuffer::DeviceReadBuffer(DeviceReaderCB *cb, bool use_poll) DeviceReadBuffer::~DeviceReadBuffer() { + Stop(); if (buffer) + { delete[] buffer; - if (isRunning() || dorun) - Stop(); + buffer = NULL; + } } bool DeviceReadBuffer::Setup(const QString &streamName, int streamfd, @@ -125,28 +127,25 @@ void DeviceReadBuffer::Start(void) { LOG(VB_RECORD, LOG_INFO, LOC + "Start() -- begin"); + QMutexLocker locker(&lock); if (isRunning() || dorun) { - { - QMutexLocker locker(&lock); - dorun = false; - } + dorun = false; + locker.unlock(); WakePoll(); wait(); + locker.relock(); } - { - QMutexLocker locker(&lock); - error = false; - eof = false; - } + dorun = true; + error = false; + eof = false; start(); LOG(VB_RECORD, LOG_INFO, LOC + "Start() -- middle"); - QMutexLocker locker(&lock); - while (dorun && !running) + while (dorun && !isRunning()) runWait.wait(locker.mutex(), 100); LOG(VB_RECORD, LOG_INFO, LOC + "Start() -- end"); @@ -170,15 +169,14 @@ void DeviceReadBuffer::Reset(const QString &streamName, int streamfd) void DeviceReadBuffer::Stop(void) { LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- begin"); + QMutexLocker locker(&lock); + if (isRunning() || dorun) { - QMutexLocker locker(&lock); dorun = false; + locker.unlock(); + WakePoll(); + wait(); } - - WakePoll(); - LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- middle"); - - wait(); LOG(VB_RECORD, LOG_INFO, LOC + "Stop() -- end"); } @@ -205,7 +203,7 @@ void DeviceReadBuffer::WakePoll(void) const char buf[1]; buf[0] = '0'; ssize_t wret = 0; - while (running && (wret <= 0) && (wake_pipe[1] >= 0)) + while (isRunning() && (wret <= 0) && (wake_pipe[1] >= 0)) { wret = ::write(wake_pipe[1], &buf, 1); if ((wret < 0) && (EAGAIN != errno) && (EINTR != errno)) @@ -277,7 +275,7 @@ bool DeviceReadBuffer::IsEOF(void) const bool DeviceReadBuffer::IsRunning(void) const { QMutexLocker locker(&lock); - return running; + return isRunning(); } uint DeviceReadBuffer::GetUnused(void) const @@ -325,8 +323,6 @@ void DeviceReadBuffer::run(void) threadRegister("DeviceReadBuffer"); lock.lock(); - dorun = true; - running = true; runWait.wakeAll(); lock.unlock(); @@ -382,7 +378,6 @@ void DeviceReadBuffer::run(void) ClosePipes(); lock.lock(); - running = false; eof = true; runWait.wakeAll(); dataWait.wakeAll(); @@ -675,7 +670,7 @@ uint DeviceReadBuffer::WaitForUsed(uint needed, uint max_wait) const QMutexLocker locker(&lock); size_t avail = used; - while ((needed > avail) && running && + while ((needed > avail) && isRunning() && !request_pause && !error && !eof && (timer.elapsed() < (int)max_wait)) { diff --git a/mythtv/libs/libmythtv/DeviceReadBuffer.h b/mythtv/libs/libmythtv/DeviceReadBuffer.h index 0a3fab172d0..3779d54ab69 100644 --- a/mythtv/libs/libmythtv/DeviceReadBuffer.h +++ b/mythtv/libs/libmythtv/DeviceReadBuffer.h @@ -89,8 +89,7 @@ class DeviceReadBuffer : protected QThread // Data for managing the device ringbuffer mutable QMutex lock; - bool dorun; - bool running; + volatile bool dorun; bool eof; mutable bool error; bool request_pause;