Skip to content

Commit 2c05281

Browse files
authored
ThreadExecutor: refactoring in preparation of sharing code (#4870)
1 parent a5b0fd3 commit 2c05281

File tree

1 file changed

+74
-70
lines changed

1 file changed

+74
-70
lines changed

cli/threadexecutor.cpp

Lines changed: 74 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,43 @@ ThreadExecutor::ThreadExecutor(const std::map<std::string, std::size_t> &files,
4646
ThreadExecutor::~ThreadExecutor()
4747
{}
4848

49-
class Data
49+
class SyncLogForwarder : public ErrorLogger
50+
{
51+
public:
52+
explicit SyncLogForwarder(ThreadExecutor &threadExecutor, ErrorLogger &errorLogger)
53+
: mThreadExecutor(threadExecutor), mErrorLogger(errorLogger) {}
54+
55+
void reportOut(const std::string &outmsg, Color c) override
56+
{
57+
std::lock_guard<std::mutex> lg(mReportSync);
58+
59+
mErrorLogger.reportOut(outmsg, c);
60+
}
61+
62+
void reportErr(const ErrorMessage &msg) override {
63+
if (!mThreadExecutor.hasToLog(msg))
64+
return;
65+
66+
std::lock_guard<std::mutex> lg(mReportSync);
67+
mErrorLogger.reportErr(msg);
68+
}
69+
70+
void reportStatus(std::size_t fileindex, std::size_t filecount, std::size_t sizedone, std::size_t sizetotal) {
71+
std::lock_guard<std::mutex> lg(mReportSync);
72+
CppCheckExecutor::reportStatus(fileindex, filecount, sizedone, sizetotal);
73+
}
74+
75+
private:
76+
std::mutex mReportSync;
77+
ThreadExecutor &mThreadExecutor;
78+
ErrorLogger &mErrorLogger;
79+
};
80+
81+
class ThreadData
5082
{
5183
public:
52-
Data(const std::map<std::string, std::size_t> &files, const std::list<ImportProject::FileSettings> &fileSettings)
53-
: mFiles(files), mFileSettings(fileSettings), mProcessedFiles(0), mProcessedSize(0)
84+
ThreadData(ThreadExecutor &threadExecutor, ErrorLogger &errorLogger, const Settings &settings, const std::map<std::string, std::size_t> &files, const std::list<ImportProject::FileSettings> &fileSettings)
85+
: mFiles(files), mFileSettings(fileSettings), mProcessedFiles(0), mProcessedSize(0), mSettings(settings), logForwarder(threadExecutor, errorLogger)
5486
{
5587
mItNextFile = mFiles.begin();
5688
mItNextFileSettings = mFileSettings.begin();
@@ -61,20 +93,17 @@ class Data
6193
});
6294
}
6395

64-
bool finished() {
65-
std::lock_guard<std::mutex> l(mFileSync);
66-
return mItNextFile == mFiles.cend() && mItNextFileSettings == mFileSettings.cend();
67-
}
68-
6996
bool next(const std::string *&file, const ImportProject::FileSettings *&fs, std::size_t &fileSize) {
7097
std::lock_guard<std::mutex> l(mFileSync);
7198
if (mItNextFile != mFiles.end()) {
7299
file = &mItNextFile->first;
100+
fs = nullptr;
73101
fileSize = mItNextFile->second;
74102
++mItNextFile;
75103
return true;
76104
}
77105
if (mItNextFileSettings != mFileSettings.end()) {
106+
file = nullptr;
78107
fs = &(*mItNextFileSettings);
79108
fileSize = 0;
80109
++mItNextFileSettings;
@@ -84,87 +113,63 @@ class Data
84113
return false;
85114
}
86115

116+
unsigned int check(ErrorLogger &errorLogger, const std::string *file, const ImportProject::FileSettings *fs) const {
117+
CppCheck fileChecker(errorLogger, false, CppCheckExecutor::executeCommand);
118+
fileChecker.settings() = mSettings; // this is a copy
119+
120+
unsigned int result;
121+
if (fs) {
122+
// file settings..
123+
result = fileChecker.check(*fs);
124+
if (fileChecker.settings().clangTidy)
125+
fileChecker.analyseClangTidy(*fs);
126+
} else {
127+
// Read file from a file
128+
result = fileChecker.check(*file);
129+
}
130+
return result;
131+
}
132+
133+
void status(std::size_t fileSize) {
134+
std::lock_guard<std::mutex> l(mFileSync);
135+
mProcessedSize += fileSize;
136+
mProcessedFiles++;
137+
if (!mSettings.quiet)
138+
logForwarder.reportStatus(mProcessedFiles, mTotalFiles, mProcessedSize, mTotalFileSize);
139+
}
140+
87141
private:
88142
const std::map<std::string, std::size_t> &mFiles;
89143
std::map<std::string, std::size_t>::const_iterator mItNextFile;
90144
const std::list<ImportProject::FileSettings> &mFileSettings;
91145
std::list<ImportProject::FileSettings>::const_iterator mItNextFileSettings;
92146

93-
public:
94147
std::size_t mProcessedFiles;
95148
std::size_t mTotalFiles;
96149
std::size_t mProcessedSize;
97150
std::size_t mTotalFileSize;
98151

99152
std::mutex mFileSync;
100-
};
153+
const Settings &mSettings;
101154

102-
class SyncLogForwarder : public ErrorLogger
103-
{
104155
public:
105-
explicit SyncLogForwarder(ThreadExecutor &threadExecutor, ErrorLogger &errorLogger)
106-
: mThreadExecutor(threadExecutor), mErrorLogger(errorLogger) {}
107-
108-
void reportOut(const std::string &outmsg, Color c) override
109-
{
110-
std::lock_guard<std::mutex> lg(mReportSync);
111-
112-
mErrorLogger.reportOut(outmsg, c);
113-
}
114-
115-
void reportErr(const ErrorMessage &msg) override {
116-
if (!mThreadExecutor.hasToLog(msg))
117-
return;
118-
119-
std::lock_guard<std::mutex> lg(mReportSync);
120-
mErrorLogger.reportErr(msg);
121-
}
122-
123-
std::mutex mReportSync;
124-
125-
private:
126-
ThreadExecutor &mThreadExecutor;
127-
ErrorLogger &mErrorLogger;
156+
SyncLogForwarder logForwarder;
128157
};
129158

130-
static unsigned int STDCALL threadProc(Data *data, SyncLogForwarder* logForwarder, const Settings &settings)
159+
static unsigned int STDCALL threadProc(ThreadData *data)
131160
{
132161
unsigned int result = 0;
133162

134-
for (;;) {
135-
if (data->finished()) {
136-
break;
137-
}
138-
139-
const std::string *file = nullptr;
140-
const ImportProject::FileSettings *fs = nullptr;
141-
std::size_t fileSize;
142-
if (!data->next(file, fs, fileSize))
143-
break;
144-
145-
CppCheck fileChecker(*logForwarder, false, CppCheckExecutor::executeCommand);
146-
fileChecker.settings() = settings;
163+
const std::string *file;
164+
const ImportProject::FileSettings *fs;
165+
std::size_t fileSize;
147166

148-
if (fs) {
149-
// file settings..
150-
result += fileChecker.check(*fs);
151-
if (settings.clangTidy)
152-
fileChecker.analyseClangTidy(*fs);
153-
} else {
154-
// Read file from a file
155-
result += fileChecker.check(*file);
156-
}
167+
while (data->next(file, fs, fileSize)) {
168+
result += data->check(data->logForwarder, file, fs);
157169

158-
{
159-
std::lock_guard<std::mutex> l(data->mFileSync);
160-
data->mProcessedSize += fileSize;
161-
data->mProcessedFiles++;
162-
if (!settings.quiet) {
163-
std::lock_guard<std::mutex> lg(logForwarder->mReportSync);
164-
CppCheckExecutor::reportStatus(data->mProcessedFiles, data->mTotalFiles, data->mProcessedSize, data->mTotalFileSize);
165-
}
166-
}
170+
data->status(fileSize);
167171
}
172+
168173
return result;
169174
}
170175

@@ -173,12 +178,11 @@ unsigned int ThreadExecutor::check()
173178
std::vector<std::future<unsigned int>> threadFutures;
174179
threadFutures.reserve(mSettings.jobs);
175180

176-
Data data(mFiles, mSettings.project.fileSettings);
177-
SyncLogForwarder logforwarder(*this, mErrorLogger);
181+
ThreadData data(*this, mErrorLogger, mSettings, mFiles, mSettings.project.fileSettings);
178182

179183
for (unsigned int i = 0; i < mSettings.jobs; ++i) {
180184
try {
181-
threadFutures.emplace_back(std::async(std::launch::async, &threadProc, &data, &logforwarder, mSettings));
185+
threadFutures.emplace_back(std::async(std::launch::async, &threadProc, &data));
182186
}
183187
catch (const std::system_error &e) {
184188
std::cerr << "#### ThreadExecutor::check exception :" << e.what() << std::endl;

0 commit comments

Comments
 (0)