summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--smdirwatcher.cpp16
-rw-r--r--smdirwatcher.h4
2 files changed, 14 insertions, 6 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);
diff --git a/smdirwatcher.h b/smdirwatcher.h
index 77d0d97..fda828b 100644
--- a/smdirwatcher.h
+++ b/smdirwatcher.h
@@ -45,6 +45,7 @@ class SmDirWatcher : public QThread {
QSemaphore *mSemFree;
QSemaphore *mSemUsed;
QQueue<QPair<QString, DWEvent> > *mDataQueue;
+ QMutex *mQueueMx;
char *mINdata;
int mBufLen;
};
@@ -53,7 +54,7 @@ class SmDataColletor : public QThread {
Q_OBJECT
public:
explicit SmDataColletor(const int numFields, QObject *parent = 0);
- void init(QSemaphore *set, QSemaphore *get, QQueue<QPair<QString, SmDirWatcher::DWEvent> > *data);
+ void init(QSemaphore *set, QSemaphore *get, QQueue<QPair<QString, SmDirWatcher::DWEvent> > *data, QMutex *queueMx);
public slots:
void setCheckForPresent(bool present);
@@ -71,6 +72,7 @@ class SmDataColletor : public QThread {
QString mCurrent;
QSemaphore *mSemFree;
QSemaphore *mSemUsed;
+ QMutex *mQueueMx;
QQueue<QPair<QString, SmDirWatcher::DWEvent> > *mDataQueue;
int mMode;
const int mNumFields;