traverso-commit
[Top][All Lists]
Advanced

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

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


From: Remon Sijrier
Subject: [Traverso-commit] traverso/src/core MonoReader.cpp Peak.cpp Peak.h
Date: Fri, 18 May 2007 09:42:55 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Remon Sijrier <r_sijrier>       07/05/18 09:42:55

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

Log message:
        * Different approach to peak build thread.

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MonoReader.cpp?cvsroot=traverso&r1=1.9&r2=1.10
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.cpp?cvsroot=traverso&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/Peak.h?cvsroot=traverso&r1=1.12&r2=1.13

Patches:
Index: MonoReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MonoReader.cpp,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- MonoReader.cpp      17 May 2007 23:29:39 -0000      1.9
+++ MonoReader.cpp      18 May 2007 09:42:54 -0000      1.10
@@ -17,7 +17,7 @@
 along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
 
-$Id: MonoReader.cpp,v 1.9 2007/05/17 23:29:39 r_sijrier Exp $
+$Id: MonoReader.cpp,v 1.10 2007/05/18 09:42:54 r_sijrier Exp $
 */
 
 
@@ -61,7 +61,7 @@
                delete m_buffer;
        }
        if (m_peak) {
-               delete m_peak;
+               m_peak->close();
        }
        if (m_sf) {
                if (sf_close (m_sf)) {

Index: Peak.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.cpp,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- Peak.cpp    18 May 2007 01:13:05 -0000      1.24
+++ Peak.cpp    18 May 2007 09:42:55 -0000      1.25
@@ -73,26 +73,20 @@
 {
        PENTERDES;
        
-       // TODO how make this work with the new peakbuilder ?
-//     if (peakBuildThread) {
-//             if (peakBuildThread->isRunning()) {
-//                     interuptPeakBuild = true;
-//                     peakBuildThread->wait();
-//             }
-//             
-//             delete peakBuildThread;
-//     }
-
        if (m_file) {
                fclose(m_file);
        }
        
        if (m_normFile) {
                fclose(m_normFile);
-               remove(m_normFileName.toAscii().data());
+               QFile::remove(m_normFileName);
        }
 }
 
+void Peak::close()
+{
+       pp().free_peak(this);
+}
 
 int Peak::read_header()
 {
@@ -178,7 +172,7 @@
 
 void Peak::start_peak_loading()
 {
-       peakbuilder().queue_task(this);
+       pp().queue_task(this);
 }
 
 
@@ -481,7 +475,7 @@
        fclose(m_normFile);
        m_normFile = NULL;
        
-       if( remove(m_normFileName.toAscii().data()) != 0 ) {
+       if (!QFile::remove(m_normFileName)) {
                PERROR("Failed to remove temp. norm. data file! (%s)", 
m_normFileName.toAscii().data()); 
        }
        
@@ -674,65 +668,117 @@
 /******** PEAK BUILD THREAD CLASS **********/
 /******************************************/
 
-PeakBuildThread& peakbuilder()
+PeakProcessor& pp()
 {
-       static PeakBuildThread peakthread;
-       static long long count;
-       if (!count++) {
-               peakthread.moveToThread(&peakthread);
-       }
-       return peakthread;
+       static PeakProcessor processor;
+       return processor;
 }
 
 
+PeakProcessor::PeakProcessor()
+{
+       m_ppthread = new PPThread(this);
+       m_ppthread->start();
+       m_taskRunning = false;
+       m_runningPeak = 0;
+
+       moveToThread(m_ppthread);
+       
+       connect(this, SIGNAL(newTask()), this, SLOT(start_task()), 
Qt::QueuedConnection);
+}
+
 
-PeakBuildThread::PeakBuildThread()
+PeakProcessor::~ PeakProcessor()
 {
-       m_runningTasks = 0;
-       start();
+       m_ppthread->exit(0);
        
-       connect(this, SIGNAL(newTask(Peak*)), this, SLOT(start_task(Peak*)), 
Qt::QueuedConnection);
-#ifndef Q_WS_MAC
-//     setStackSize(20000);
-#endif
+       if (!m_ppthread->wait(1000)) {
+               m_ppthread->terminate();
+       }
+       
+       delete m_ppthread;
 }
 
-void PeakBuildThread::run()
+
+void PeakProcessor::start_task()
 {
-       exec();
+       m_runningPeak->create_from_scratch();
+       
+       QMutexLocker locker(&m_mutex);
+       
+       m_taskRunning = false;
+       
+       if (m_runningPeak->interuptPeakBuild) {
+               printf("PeakProcessor:: Deleting interrupted Peak!\n");
+               delete m_runningPeak;
+               m_runningPeak = 0;
+               return;
+       }
+       
+       m_runningPeak = 0;
+       
+       dequeue_queue();
 }
 
-void PeakBuildThread::start_task(Peak* peak)
+void PeakProcessor::queue_task(Peak * peak)
 {
-       peak->create_from_scratch();
+       QMutexLocker locker(&m_mutex);
        
-       m_mutex.lock();
-       m_runningTasks--;
+       m_queue.enqueue(peak);
+       
+       if (!m_taskRunning) {
+               dequeue_queue();
+       }
+}
        
+void PeakProcessor::dequeue_queue()
+{
        if (!m_queue.isEmpty()) {
-               m_runningTasks++;
-               Peak* peak = m_queue.dequeue();
-               m_mutex.unlock();
-               emit newTask(peak);
-               return;
+               m_taskRunning = true;
+               m_runningPeak = m_queue.dequeue();
+               emit newTask();
        }
-       m_mutex.unlock();
 }
 
-void PeakBuildThread::queue_task(Peak * peak)
+void PeakProcessor::free_peak(Peak * peak)
 {
        m_mutex.lock();
        
-       m_queue.enqueue(peak);
+       m_queue.removeAll(peak);
+       
+       if (peak == m_runningPeak) {
+               printf("PeakProcessor:: Interrupting running build process!\n");
+               peak->interuptPeakBuild =  true;
+               
+               m_mutex.unlock();
+               
+               m_ppthread->exit(0);
+               if (!m_ppthread->wait(500)) {
+                       printf("PeakProcessor:: Wait timed out!\n");
+               }
        
-       if (!m_runningTasks) {
-               m_runningTasks++;
-               Peak* peak = m_queue.dequeue();
+               m_ppthread->start();
+               
+               m_mutex.lock();
+               dequeue_queue();
                m_mutex.unlock();
-               emit newTask(peak);
+               
                return;
        }
        
        m_mutex.unlock();
+       
+       delete peak;
+}
+
+
+PPThread::PPThread(PeakProcessor * pp)
+{
+       m_pp = pp;
+}
+
+void PPThread::run()
+{
+       exec();
 }
 

Index: Peak.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/Peak.h,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -b -r1.12 -r1.13
--- Peak.h      18 May 2007 01:13:05 -0000      1.12
+++ Peak.h      18 May 2007 09:42:55 -0000      1.13
@@ -32,39 +32,55 @@
 class ReadSource;
 class AudioSource;
 class Peak;
+class PPThread;
 
-
-class PeakBuildThread : public QThread
+class PeakProcessor : public QObject
 {
        Q_OBJECT
-public:
        
+public:
        void queue_task(Peak* peak);
+       void free_peak(Peak* peak);
        
 private:
+       PPThread* m_ppthread;
        QMutex m_mutex;
-       
-       void run();
-       
-       int m_runningTasks;
+       bool m_taskRunning;
+       Peak* m_runningPeak;
                
        QQueue<Peak* > m_queue;
        
-       PeakBuildThread();
-       PeakBuildThread(const PeakBuildThread&);
+       void dequeue_queue();
+       
+       PeakProcessor();
+       ~PeakProcessor();
+       PeakProcessor(const PeakProcessor&);
        // allow this function to create one instance
-       friend PeakBuildThread& peakbuilder();
+       friend PeakProcessor& pp();
        
 private slots:
-       void start_task(Peak* peak);
+       void start_task();
        
 signals:
-       void newTask(Peak* peak);
+       void newTask();
+
+};
+
+class PPThread : public QThread
+{
+public:
+       PPThread(PeakProcessor* pp);
 
+protected:
+       void run();
+       
+private:
+       PeakProcessor* m_pp;
 };
 
+
 // use this function to access the PeakBuildThread
-PeakBuildThread& peakbuilder();
+PeakProcessor& pp();
 
 
 struct PeakData {
@@ -100,7 +116,7 @@
        int finish_processing();
        int calculate_peaks(void* buffer, int zoomLevel, nframes_t startPos, 
int count);
 
-       void free_buffer_memory();
+       void close();
        
        void start_peak_loading();
 
@@ -132,7 +148,7 @@
        int read_header();
        int write_header();
 
-       friend class PeakBuildThread;
+       friend class PeakProcessor;
 
 signals:
        void finished(Peak*);




reply via email to

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