All pastes #950719 Raw Edit

Something

public text v1 · immutable
#950719 ·published 2008-03-20 20:03 UTC
rendered paste body
Index: 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;
 };