traverso-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Traverso-commit] traverso/src/core Peak.cpp Peak.h


From: Remon Sijrier
Subject: [Traverso-commit] traverso/src/core Peak.cpp Peak.h
Date: Fri, 18 May 2007 01:08:48 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       07/05/18 01:08:47

Modified files:
        src/core       : Peak.cpp Peak.h 

Log message:
        * Use only one peak build thread, serialize access too it

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.22&r2=1.23
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.h?cvsroot=traverso&r1=1.10&r2=1.11

Patches:
Index: Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -b -r1.22 -r1.23
--- Peak.cpp    17 May 2007 23:27:53 -0000      1.22
+++ Peak.cpp    18 May 2007 01:08:47 -0000      1.23
@@ -27,6 +27,7 @@
 #include "Mixer.h"
 #include <QFileInfo>
 #include <QDateTime>
+#include <QMutexLocker>
 
 #include "Debugger.h"
 
@@ -177,12 +178,7 @@
 
 void Peak::start_peak_loading()
 {
-       Q_ASSERT(!peakBuildThread);
-       
-       if (!peakBuildThread) {
-               peakBuildThread = new PeakBuildThread(this);
-               peakBuildThread->start();
-       }
+       peakbuilder().queue_task(this);
 }
 
 
@@ -678,9 +674,24 @@
 /******** PEAK BUILD THREAD CLASS **********/
 /******************************************/
 
-PeakBuildThread::PeakBuildThread(Peak* peak)
+PeakBuildThread& peakbuilder()
 {
-       m_peak = peak;
+       static PeakBuildThread peakthread;
+       static long long count;
+       if (!count++) {
+               peakthread.moveToThread(&peakthread);
+       }
+       return peakthread;
+}
+
+
+
+PeakBuildThread::PeakBuildThread()
+{
+       m_runningTasks = 0;
+       start();
+       
+       connect(this, SIGNAL(newTask(Peak*)), this, SLOT(start_task(Peak*)), 
Qt::QueuedConnection);
 #ifndef Q_WS_MAC
 //     setStackSize(20000);
 #endif
@@ -688,7 +699,40 @@
 
 void PeakBuildThread::run()
 {
-       if(m_peak->create_from_scratch() < 1) {
-               PWARN("Failed to create peak buffers");
+       exec();
+}
+
+void PeakBuildThread::start_task(Peak* peak)
+{
+       peak->create_from_scratch();
+       
+       m_mutex.lock();
+       m_runningTasks--;
+       
+       if (!m_queue.isEmpty()) {
+               m_runningTasks++;
+               Peak* peak = m_queue.dequeue();
+               m_mutex.unlock();
+               emit newTask(peak);
+               return;
        }
+       m_mutex.unlock();
 }
+
+void PeakBuildThread::queue_task(Peak * peak)
+{
+       m_mutex.lock();
+       
+       m_queue.enqueue(peak);
+       
+       if (!m_runningTasks) {
+               m_runningTasks++;
+               Peak* peak = m_queue.dequeue();
+               m_mutex.unlock();
+               emit newTask(peak);
+               return;
+       }
+       
+       m_mutex.unlock();
+}
+

Index: Peak.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -b -r1.10 -r1.11
--- Peak.h      17 May 2007 23:27:54 -0000      1.10
+++ Peak.h      18 May 2007 01:08:47 -0000      1.11
@@ -24,7 +24,8 @@
 
 #include <QObject>
 #include <QThread>
-#include <QHash>
+#include <QMutex>
+#include <QQueue>
 
 #include "defines.h"
 
@@ -35,12 +36,37 @@
 
 class PeakBuildThread : public QThread
 {
+       Q_OBJECT
 public:
-       PeakBuildThread(Peak* peak);
-       Peak* m_peak;
+       
+       void queue_task(Peak* peak);
+       
+private:
+       QMutex m_mutex;
+       
        void run();
+       
+       int m_runningTasks;
+               
+       QQueue<Peak* > m_queue;
+       
+       PeakBuildThread();
+       PeakBuildThread(const PeakBuildThread&);
+       // allow this function to create one instance
+       friend PeakBuildThread& peakbuilder();
+       
+private slots:
+       void start_task(Peak* peak);
+       
+signals:
+       void newTask(Peak* peak);
+
 };
 
+// use this function to access the ProjectManager
+PeakBuildThread& peakbuilder();
+
+
 struct PeakData {
        int peakDataOffset;
        int normValuesDataOffset;




reply via email to

[Prev in Thread] Current Thread [Next in Thread]