rendered paste bodyIndex: programs/mythbackend/filetransfer.cpp
===================================================================
--- programs/mythbackend/filetransfer.cpp (revision 16724)
+++ programs/mythbackend/filetransfer.cpp (working copy)
@@ -15,24 +15,28 @@
FileTransfer::FileTransfer(QString &filename, MythSocket *remote,
bool usereadahead, int retries) :
- readthreadlive(true),
+ readthreadlive(true), readsLocked(false),
rbuffer(new RingBuffer(filename, false, usereadahead, retries)),
- sock(remote), ateof(false), refCount(0)
+ sock(remote), ateof(false), lock(false), refLock(false), refCount(0)
{
}
-FileTransfer::FileTransfer(QString &filename, MythSocket *remote)
+FileTransfer::FileTransfer(QString &filename, MythSocket *remote) :
+ readthreadlive(true), readsLocked(false),
+ rbuffer(new RingBuffer(filename, false)),
+ sock(remote), ateof(false), lock(false), refLock(false), refCount(0)
{
- rbuffer = new RingBuffer(filename, false);
- sock = remote;
- readthreadlive = true;
- ateof = false;
- refCount = 0;
}
FileTransfer::~FileTransfer()
{
- sock->DownRef();
+ Stop();
+
+ if (rbuffer)
+ {
+ delete rbuffer;
+ rbuffer = NULL;
+ }
}
void FileTransfer::UpRef(void)
@@ -43,25 +47,16 @@
bool FileTransfer::DownRef(void)
{
- refLock.lock();
-
- refCount--;
-
- if (refCount < 0)
+ int count = 0;
{
- Stop();
+ QMutexLocker locker(&refLock);
+ count = --refCount;
+ }
- if (rbuffer)
- delete rbuffer;
-
- readthreadLock.unlock();
- refLock.unlock();
+ if (count < 0)
delete this;
- return true;
- }
- refLock.unlock();
- return false;
+ return (count < 0);
}
bool FileTransfer::isOpen(void)
@@ -77,20 +72,26 @@
{
readthreadlive = false;
rbuffer->StopReads();
- readthreadLock.lock();
+ QMutexLocker locker(&lock);
+ readsLocked = true;
}
}
void FileTransfer::Pause(void)
{
rbuffer->StopReads();
- readthreadLock.lock();
+ QMutexLocker locker(&lock);
+ readsLocked = true;
}
void FileTransfer::Unpause(void)
{
rbuffer->StartReads();
- readthreadLock.unlock();
+ {
+ QMutexLocker locker(&lock);
+ readsLocked = false;
+ }
+ readsUnlockedCond.wakeAll();
}
int FileTransfer::RequestBlock(int size)
@@ -101,7 +102,10 @@
int tot = 0;
int ret = 0;
- readthreadLock.lock();
+ QMutexLocker locker(&lock);
+ while (readsLocked)
+ readsUnlockedCond.wait(&lock, 100 /*ms*/);
+
requestBuffer.resize(max((size_t)max(size,0) + 128, requestBuffer.size()));
char *buf = &requestBuffer[0];
while (tot < size && !rbuffer->GetStopReads() && readthreadlive)
@@ -123,7 +127,6 @@
if (ret < request)
break; // we hit eof
}
- readthreadLock.unlock();
return (ret < 0) ? -1 : tot;
}
Index: programs/mythbackend/filetransfer.h
===================================================================
--- programs/mythbackend/filetransfer.h (revision 16724)
+++ programs/mythbackend/filetransfer.h (working copy)
@@ -11,6 +11,7 @@
// Qt headers
#include <qstring.h>
#include <qmutex.h>
+#include <qwaitcondition.h>
class RingBuffer;
class MythSocket;
@@ -46,8 +47,9 @@
private:
~FileTransfer();
- bool readthreadlive;
- QMutex readthreadLock;
+ volatile bool readthreadlive;
+ bool readsLocked;
+ QWaitCondition readsUnlockedCond;
RingBuffer *rbuffer;
MythSocket *sock;
@@ -55,6 +57,7 @@
vector<char> requestBuffer;
+ QMutex lock;
QMutex refLock;
int refCount;
};