diff options
Diffstat (limited to 'smdirwatcher.cpp')
-rw-r--r-- | smdirwatcher.cpp | 16 |
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); |