@@ -46,11 +46,43 @@ ThreadExecutor::ThreadExecutor(const std::map<std::string, std::size_t> &files,
4646ThreadExecutor::~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{
5183public:
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+
87141private:
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- {
104155public:
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