[Top][All Lists]
[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*);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Traverso-commit] traverso/src/core MonoReader.cpp Peak.cpp Peak.h,
Remon Sijrier <=