summaryrefslogtreecommitdiffstats
path: root/smdirwatcher.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'smdirwatcher.cpp')
-rw-r--r--smdirwatcher.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/smdirwatcher.cpp b/smdirwatcher.cpp
index 839b021..3143212 100644
--- a/smdirwatcher.cpp
+++ b/smdirwatcher.cpp
@@ -32,8 +32,9 @@ SmDirWatcher::SmDirWatcher(int numFields, QObject *parent) : QThread(parent), mF
mCollector = new SmDataColletor(numFields, this);
mSemFree = new QSemaphore(1024);
mSemUsed = new QSemaphore;
+ mQueueMx = new QMutex;
mDataQueue = new QQueue<QPair<QString, DWEvent> >();
- mCollector->init(mSemFree, mSemUsed, mDataQueue);
+ mCollector->init(mSemFree, mSemUsed, mDataQueue, mQueueMx);
mCollector->start();
}
@@ -50,7 +51,9 @@ void SmDirWatcher::setDir(const QString &dir){
mCurrent = dir;
mSemFree->acquire();
QPair<QString, DWEvent> c = qMakePair(dir, Populate);
+ mQueueMx->lock();
mDataQueue->enqueue(c);
+ mQueueMx->unlock();
mSemUsed->release();
}
@@ -81,9 +84,9 @@ void SmDirWatcher::run(){
goto out;
}
c = qMakePair(name, curEvent);
- if(!mDataQueue->contains(c)){
- mDataQueue->enqueue(c);
- }
+ mQueueMx->lock();
+ mDataQueue->enqueue(c);
+ mQueueMx->unlock();
out:
mSemUsed->release();
i += sizeof(inotify_event) + e->len;
@@ -109,10 +112,11 @@ SmDataColletor::SmDataColletor(const int numFields, QObject *parent) : QThread(p
mMovPresentQ->prepare("SELECT COUNT(cmd5sum) FROM files WHERE cmd5sum = :md5");
}
-void SmDataColletor::init(QSemaphore *set, QSemaphore *get, QQueue<QPair<QString, SmDirWatcher::DWEvent> > *data){
+void SmDataColletor::init(QSemaphore *set, QSemaphore *get, QQueue<QPair<QString, SmDirWatcher::DWEvent> > *data, QMutex *queueMx){
mSemFree = set;
mSemUsed = get;
mDataQueue = data;
+ mQueueMx = queueMx;
}
void SmDataColletor::setCheckForPresent(bool present){
@@ -128,7 +132,9 @@ void SmDataColletor::run(){
mSemFree->release();
break;
}
+ mQueueMx->lock();
QPair<QString, SmDirWatcher::DWEvent> cur = mDataQueue->dequeue();
+ mQueueMx->unlock();
if(cur.second == SmDirWatcher::Populate){
SmTreeItem *i = populate(cur.first);
SmTreeItem *copy = new SmTreeItem(*i);