shared: ParallelDirScanner: Perform first pass to collect paths
Scan the top directory to collect paths for the threads. This way we don't launch threads for paths without subdirs. Secondly, large trees like usually $HOME will be scanned by multiple threads at first. Nevertheless, ParallelDirScanner can be improved still as threads may run quickly out of work, so we may end up with only one anyway again
This commit is contained in:
@ -71,7 +71,34 @@ void ParallelDirScanner::scan()
|
||||
this->targetPathsQueue.clear();
|
||||
this->resultPathsQueue.clear();
|
||||
|
||||
this->targetPathsQueue.enqueue(this->paths);
|
||||
/* First scan without subdirs. This way we collect paths for the threads */
|
||||
WildcardMatcher matcher;
|
||||
matcher.setPatterns(this->ignorePatterns);
|
||||
for(QString &path : this->paths)
|
||||
{
|
||||
QDirIterator iterator(path, QStringList{}, QDir::Dirs | QDir::QDir::Files | QDir::NoDotDot);
|
||||
while(iterator.hasNext())
|
||||
{
|
||||
QString path = iterator.next();
|
||||
if(matcher.match(path))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
QFileInfo info = iterator.fileInfo();
|
||||
if(!info.isSymLink())
|
||||
{
|
||||
if(info.isDir())
|
||||
{
|
||||
this->targetPathsQueue.enqueue(info.absoluteFilePath());
|
||||
}
|
||||
else
|
||||
{
|
||||
this->resultPathsQueue.enqueue(info.absoluteFilePath());
|
||||
this->processedPaths += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
int threadsNum = getThreadsNum();
|
||||
if(threadsNum == 0)
|
||||
{
|
||||
|
Reference in New Issue
Block a user