Fix:Wrong mutex operation in search-manager.

This commit is contained in:
iaom 2021-08-24 17:14:28 +08:00
parent 87eccf6dc4
commit d9ac480ae1
3 changed files with 65 additions and 53 deletions

View File

@ -18,14 +18,13 @@
* *
*/ */
#include "search-manager.h" #include "search-manager.h"
using namespace Zeeker; using namespace Zeeker;
size_t SearchManager::uniqueSymbol1 = 0; size_t SearchManager::uniqueSymbolFile = 0;
size_t SearchManager::uniqueSymbol2 = 0; size_t SearchManager::uniqueSymbolDir = 0;
size_t SearchManager::uniqueSymbol3 = 0; size_t SearchManager::uniqueSymbolContent = 0;
QMutex SearchManager::m_mutex1; QMutex SearchManager::m_mutexFile;
QMutex SearchManager::m_mutex2; QMutex SearchManager::m_mutexDir;
QMutex SearchManager::m_mutex3; QMutex SearchManager::m_mutexContent;
SearchManager::SearchManager(QObject *parent) : QObject(parent) { SearchManager::SearchManager(QObject *parent) : QObject(parent) {
m_pool.setMaxThreadCount(3); m_pool.setMaxThreadCount(3);
m_pool.setExpiryTimeout(1000); m_pool.setExpiryTimeout(1000);
@ -46,31 +45,31 @@ int SearchManager::getCurrentIndexCount() {
void SearchManager::onKeywordSearch(QString keyword, QQueue<QString> *searchResultFile, QQueue<QString> *searchResultDir, void SearchManager::onKeywordSearch(QString keyword, QQueue<QString> *searchResultFile, QQueue<QString> *searchResultDir,
QQueue<QPair<QString, QStringList>> *searchResultContent) { QQueue<QPair<QString, QStringList>> *searchResultContent) {
m_mutex1.lock(); m_mutexFile.lock();
++uniqueSymbol1; ++uniqueSymbolFile;
m_mutex1.unlock(); m_mutexFile.unlock();
m_mutex2.lock(); m_mutexDir.lock();
++uniqueSymbol2; ++uniqueSymbolDir;
m_mutex2.unlock(); m_mutexDir.unlock();
m_mutex3.lock(); m_mutexContent.lock();
++uniqueSymbol3; ++uniqueSymbolContent;
m_mutex3.unlock(); m_mutexContent.unlock();
if(FileUtils::SearchMethod::DIRECTSEARCH == FileUtils::searchMethod) { if(FileUtils::SearchMethod::DIRECTSEARCH == FileUtils::searchMethod) {
DirectSearch *directSearch; DirectSearch *directSearch;
directSearch = new DirectSearch(keyword, searchResultFile, searchResultDir, uniqueSymbol1); directSearch = new DirectSearch(keyword, searchResultFile, searchResultDir, uniqueSymbolFile);
m_pool.start(directSearch); m_pool.start(directSearch);
} else if(FileUtils::SearchMethod::INDEXSEARCH == FileUtils::searchMethod) { } else if(FileUtils::SearchMethod::INDEXSEARCH == FileUtils::searchMethod) {
FileSearch *filesearch; FileSearch *filesearch;
filesearch = new FileSearch(searchResultFile, uniqueSymbol1, keyword, "0", 1, 0, 5); filesearch = new FileSearch(searchResultFile, uniqueSymbolFile, keyword, "0", 1, 0, 5);
m_pool.start(filesearch); m_pool.start(filesearch);
FileSearch *dirsearch; FileSearch *dirsearch;
dirsearch = new FileSearch(searchResultDir, uniqueSymbol2, keyword, "1", 1, 0, 5); dirsearch = new FileSearch(searchResultDir, uniqueSymbolDir, keyword, "1", 1, 0, 5);
m_pool.start(dirsearch); m_pool.start(dirsearch);
FileContentSearch *contentSearch; FileContentSearch *contentSearch;
contentSearch = new FileContentSearch(searchResultContent, uniqueSymbol3, keyword, 0, 5); contentSearch = new FileContentSearch(searchResultContent, uniqueSymbolContent, keyword, 0, 5);
m_pool.start(contentSearch); m_pool.start(contentSearch);
} else { } else {
qWarning() << "Unknown search method! FileUtils::searchMethod: " << static_cast<int>(FileUtils::searchMethod); qWarning() << "Unknown search method! FileUtils::searchMethod: " << static_cast<int>(FileUtils::searchMethod);
@ -104,9 +103,20 @@ FileSearch::~FileSearch() {
} }
void FileSearch::run() { void FileSearch::run() {
if(!m_search_result->isEmpty()) { if(m_value == "0") {
m_search_result->clear(); SearchManager::m_mutexFile.lock();
if(!m_search_result->isEmpty()) {
m_search_result->clear();
}
SearchManager::m_mutexFile.unlock();
} else if(m_value == "1") {
SearchManager::m_mutexDir.lock();
if(!m_search_result->isEmpty()) {
m_search_result->clear();
}
SearchManager::m_mutexDir.unlock();
} }
int resultCount = 0; int resultCount = 0;
int total = 0; int total = 0;
while(total < 100) { while(total < 100) {
@ -187,23 +197,23 @@ int FileSearch::getResult(Xapian::MSet &result) {
} else { } else {
switch(m_value.toInt()) { switch(m_value.toInt()) {
case 1: case 1:
SearchManager::m_mutex1.lock(); SearchManager::m_mutexDir.lock();
if(m_uniqueSymbol == SearchManager::uniqueSymbol2) { if(m_uniqueSymbol == SearchManager::uniqueSymbolDir) {
m_search_result->enqueue(path); m_search_result->enqueue(path);
SearchManager::m_mutex1.unlock(); SearchManager::m_mutexDir.unlock();
} else { } else {
SearchManager::m_mutex1.unlock(); SearchManager::m_mutexDir.unlock();
return -1; return -1;
} }
break; break;
case 0: case 0:
SearchManager::m_mutex2.lock(); SearchManager::m_mutexFile.lock();
if(m_uniqueSymbol == SearchManager::uniqueSymbol1) { if(m_uniqueSymbol == SearchManager::uniqueSymbolFile) {
m_search_result->enqueue(path); m_search_result->enqueue(path);
SearchManager::m_mutex2.unlock(); SearchManager::m_mutexFile.unlock();
} else { } else {
SearchManager::m_mutex2.unlock(); SearchManager::m_mutexFile.unlock();
return -1; return -1;
} }
break; break;
@ -233,9 +243,11 @@ FileContentSearch::~FileContentSearch() {
} }
void FileContentSearch::run() { void FileContentSearch::run() {
SearchManager::m_mutexContent.lock();
if(!m_search_result->isEmpty()) { if(!m_search_result->isEmpty()) {
m_search_result->clear(); m_search_result->clear();
} }
SearchManager::m_mutexContent.unlock();
int resultCount = 0; int resultCount = 0;
int total = 0; int total = 0;
@ -375,14 +387,14 @@ int FileContentSearch::getResult(Xapian::MSet &result, std::string &keyWord) {
// QString().swap(snippet); // QString().swap(snippet);
// } // }
SearchManager::m_mutex3.lock(); SearchManager::m_mutexContent.lock();
if(m_uniqueSymbol == SearchManager::uniqueSymbol3) { if(m_uniqueSymbol == SearchManager::uniqueSymbolContent) {
m_search_result->enqueue(qMakePair(path, snippets)); m_search_result->enqueue(qMakePair(path, snippets));
SearchManager::m_mutex3.unlock(); SearchManager::m_mutexContent.unlock();
snippets.clear(); snippets.clear();
QStringList().swap(snippets); QStringList().swap(snippets);
} else { } else {
SearchManager::m_mutex3.unlock(); SearchManager::m_mutexContent.unlock();
return -1; return -1;
} }
// searchResult.insert(path,snippets); // searchResult.insert(path,snippets);
@ -432,16 +444,16 @@ void DirectSearch::run() {
bfs.enqueue(i.absoluteFilePath()); bfs.enqueue(i.absoluteFilePath());
} }
if(i.fileName().contains(m_keyword, Qt::CaseInsensitive)) { if(i.fileName().contains(m_keyword, Qt::CaseInsensitive)) {
SearchManager::m_mutex1.lock(); SearchManager::m_mutexFile.lock();
// qWarning() << i.fileName() << m_keyword; // qWarning() << i.fileName() << m_keyword;
if(m_uniqueSymbol == SearchManager::uniqueSymbol1) { if(m_uniqueSymbol == SearchManager::uniqueSymbolFile) {
// TODO // TODO
if(i.isDir() && m_searchResultDir->length() < 51) { if(i.isDir() && m_searchResultDir->length() < 51) {
m_searchResultDir->enqueue(i.absoluteFilePath()); m_searchResultDir->enqueue(i.absoluteFilePath());
} else if(m_searchResultFile->length() < 51) { } else if(m_searchResultFile->length() < 51) {
m_searchResultFile->enqueue(i.absoluteFilePath()); m_searchResultFile->enqueue(i.absoluteFilePath());
} }
SearchManager::m_mutex1.unlock(); SearchManager::m_mutexFile.unlock();
if(m_searchResultDir->length() > 49 && m_searchResultFile->length() > 49) { if(m_searchResultDir->length() > 49 && m_searchResultFile->length() > 49) {
return; return;
} }
@ -450,7 +462,7 @@ void DirectSearch::run() {
// More suitable method? // More suitable method?
m_searchResultFile->clear(); m_searchResultFile->clear();
m_searchResultDir->clear(); m_searchResultDir->clear();
SearchManager::m_mutex1.unlock(); SearchManager::m_mutexFile.unlock();
return; return;
} }
} }

View File

@ -57,12 +57,12 @@ public:
static int getCurrentIndexCount(); static int getCurrentIndexCount();
static size_t uniqueSymbol1; static size_t uniqueSymbolFile;
static size_t uniqueSymbol2; static size_t uniqueSymbolDir;
static size_t uniqueSymbol3; static size_t uniqueSymbolContent;
static QMutex m_mutex1; static QMutex m_mutexFile;
static QMutex m_mutex2; static QMutex m_mutexDir;
static QMutex m_mutex3; static QMutex m_mutexContent;
public Q_SLOTS: public Q_SLOTS:
void onKeywordSearch(QString keyword, QQueue<QString> *searchResultFile, QQueue<QString> *searchResultDir, QQueue<QPair<QString, QStringList>> *searchResultContent); void onKeywordSearch(QString keyword, QQueue<QString> *searchResultFile, QQueue<QString> *searchResultDir, QQueue<QPair<QString, QStringList>> *searchResultContent);

View File

@ -44,31 +44,31 @@ void SearchResult::run() {
int emptyLists = 0; int emptyLists = 0;
while(!isInterruptionRequested()) { while(!isInterruptionRequested()) {
emptyLists = 0; emptyLists = 0;
m_mainwindow->m_searcher->m_mutex1.lock(); m_mainwindow->m_searcher->m_mutexFile.lock();
if(!m_mainwindow->m_search_result_file->isEmpty()) { if(!m_mainwindow->m_search_result_file->isEmpty()) {
Q_EMIT this->searchResultFile(m_mainwindow->m_search_result_file->dequeue()); Q_EMIT this->searchResultFile(m_mainwindow->m_search_result_file->dequeue());
m_mainwindow->m_searcher->m_mutex1.unlock(); m_mainwindow->m_searcher->m_mutexFile.unlock();
} else { } else {
emptyLists ++; emptyLists ++;
m_mainwindow->m_searcher->m_mutex1.unlock(); m_mainwindow->m_searcher->m_mutexFile.unlock();
} }
m_mainwindow->m_searcher->m_mutex2.lock(); m_mainwindow->m_searcher->m_mutexDir.lock();
if(!m_mainwindow->m_search_result_dir->isEmpty()) { if(!m_mainwindow->m_search_result_dir->isEmpty()) {
Q_EMIT this->searchResultDir(m_mainwindow->m_search_result_dir->dequeue()); Q_EMIT this->searchResultDir(m_mainwindow->m_search_result_dir->dequeue());
m_mainwindow->m_searcher->m_mutex2.unlock(); m_mainwindow->m_searcher->m_mutexDir.unlock();
} else { } else {
emptyLists ++; emptyLists ++;
m_mainwindow->m_searcher->m_mutex2.unlock(); m_mainwindow->m_searcher->m_mutexDir.unlock();
} }
m_mainwindow->m_searcher->m_mutex3.lock(); m_mainwindow->m_searcher->m_mutexContent.lock();
// if (!m_mainwindow->m_search_result_content->isEmpty()) // if (!m_mainwindow->m_search_result_content->isEmpty())
// qDebug() << m_mainwindow->m_search_result_content->head(); // qDebug() << m_mainwindow->m_search_result_content->head();
if(!m_mainwindow->m_search_result_content->isEmpty()) { if(!m_mainwindow->m_search_result_content->isEmpty()) {
Q_EMIT this->searchResultContent(m_mainwindow->m_search_result_content->dequeue()); Q_EMIT this->searchResultContent(m_mainwindow->m_search_result_content->dequeue());
m_mainwindow->m_searcher->m_mutex3.unlock(); m_mainwindow->m_searcher->m_mutexContent.unlock();
} else { } else {
emptyLists ++; emptyLists ++;
m_mainwindow->m_searcher->m_mutex3.unlock(); m_mainwindow->m_searcher->m_mutexContent.unlock();
} }
if(m_timer->isActive() && m_timer->remainingTime() < 0.01) { if(m_timer->isActive() && m_timer->remainingTime() < 0.01) {
this->requestInterruption(); this->requestInterruption();