Clang: Prepare for multi-threading

* Make the necessary data implicitly shared since it might get
  accessed/modified from two different threads with follow-up changes.
  This applies for UnsavedFiles/UnsavedFile and ProjectPart::arguments().

* Avoid returning references.

Change-Id: I98842c1cb90ae0d344a15c63b72cbc89568722d3
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Nikolai Kosjar
2016-05-30 10:25:52 +02:00
parent 53415cece1
commit 606d41187c
23 changed files with 323 additions and 291 deletions

View File

@@ -25,20 +25,23 @@
#include "unsavedfiles.h"
#include "clangunsavedfilesshallowarguments.h"
#include "unsavedfile.h"
#include <QSharedData>
#include <algorithm>
namespace ClangBackEnd {
class UnsavedFilesData
class UnsavedFilesData : public QSharedData
{
public:
UnsavedFilesData();
public:
time_point lastChangeTimePoint;
std::vector<UnsavedFile> unsavedFiles;
QVector<UnsavedFile> unsavedFiles;
};
UnsavedFilesData::UnsavedFilesData()
@@ -47,24 +50,22 @@ UnsavedFilesData::UnsavedFilesData()
}
UnsavedFiles::UnsavedFiles()
: d(std::make_shared<UnsavedFilesData>())
: d(new UnsavedFilesData)
{
}
UnsavedFiles::~UnsavedFiles() = default;
UnsavedFiles::UnsavedFiles(const UnsavedFiles &) = default;
UnsavedFiles &UnsavedFiles::operator=(const UnsavedFiles &) = default;
UnsavedFiles::UnsavedFiles(UnsavedFiles &&other)
: d(std::move(other.d))
UnsavedFiles::~UnsavedFiles()
{
}
UnsavedFiles &UnsavedFiles::operator=(UnsavedFiles &&other)
UnsavedFiles::UnsavedFiles(const UnsavedFiles &other)
: d(other.d)
{
d = std::move(other.d);
}
UnsavedFiles &UnsavedFiles::operator=(const UnsavedFiles &other)
{
d = other.d;
return *this;
}
@@ -105,12 +106,17 @@ uint UnsavedFiles::count() const
return uint(d->unsavedFiles.size());
}
CXUnsavedFile *UnsavedFiles::cxUnsavedFiles() const
const UnsavedFile &UnsavedFiles::at(int index) const
{
return d->unsavedFiles.data()->data();
return d->unsavedFiles.at(index);
}
const time_point &UnsavedFiles::lastChangeTimePoint() const
UnsavedFilesShallowArguments UnsavedFiles::shallowArguments() const
{
return UnsavedFilesShallowArguments(*this);
}
const time_point UnsavedFiles::lastChangeTimePoint() const
{
return d->lastChangeTimePoint;
}
@@ -141,7 +147,7 @@ void UnsavedFiles::addOrUpdateUnsavedFile(const FileContainer &fileContainer)
auto unsavedFileIterator = std::find_if(d->unsavedFiles.begin(), d->unsavedFiles.end(), isSameFile);
if (unsavedFileIterator == d->unsavedFiles.end())
d->unsavedFiles.emplace_back(filePath, fileContent);
d->unsavedFiles.append(UnsavedFile(filePath, fileContent));
else
*unsavedFileIterator = UnsavedFile(filePath, fileContent);
}