diff options
-rw-r--r-- | smdirwatcher.cpp | 16 | ||||
-rw-r--r-- | smdirwatcher.h | 4 |
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; |