diff --git a/Makefile b/Makefile index e54277d2e..34df806e4 100644 --- a/Makefile +++ b/Makefile @@ -581,7 +581,7 @@ $(libcppdir)/utils.o: lib/utils.cpp lib/config.h lib/utils.h $(libcppdir)/valueflow.o: lib/valueflow.cpp lib/analyzer.h lib/astutils.h lib/calculate.h lib/check.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/forwardanalyzer.h lib/importproject.h lib/infer.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/programmemory.h lib/reverseanalyzer.h lib/settings.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenlist.h lib/utils.h lib/valueflow.h lib/valueptr.h $(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CPPFILESDIR) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(libcppdir)/valueflow.o $(libcppdir)/valueflow.cpp -cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlineparser.h cli/cppcheckexecutor.h cli/filelister.h cli/threadexecutor.h externals/tinyxml2/tinyxml2.h lib/check.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h +cli/cmdlineparser.o: cli/cmdlineparser.cpp cli/cmdlineparser.h cli/cppcheckexecutor.h cli/filelister.h externals/tinyxml2/tinyxml2.h lib/check.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h $(CXX) ${INCLUDE_FOR_CLI} $(CPPFLAGS) $(CPPFILESDIR) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o cli/cmdlineparser.o cli/cmdlineparser.cpp cli/cppcheckexecutor.o: cli/cppcheckexecutor.cpp cli/cmdlineparser.h cli/cppcheckexecutor.h cli/filelister.h cli/threadexecutor.h externals/simplecpp/simplecpp.h lib/analyzerinfo.h lib/check.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/cppcheck.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/path.h lib/pathmatch.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/timer.h lib/utils.h diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index 2907767f2..731879c46 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -37,6 +37,9 @@ endif() if(tinyxml2_FOUND AND NOT USE_BUNDLED_TINYXML2) target_link_libraries(cppcheck ${tinyxml2_LIBRARY}) endif() +if (USE_THREADS) + target_link_libraries(cppcheck ${CMAKE_THREAD_LIBS_INIT}) +endif() add_dependencies(cppcheck copy_cfg) add_dependencies(cppcheck copy_addons) diff --git a/cli/cmdlineparser.cpp b/cli/cmdlineparser.cpp index 8e6b8cc60..52901a88c 100644 --- a/cli/cmdlineparser.cpp +++ b/cli/cmdlineparser.cpp @@ -19,6 +19,7 @@ #include "cmdlineparser.h" #include "check.h" +#include "config.h" #include "cppcheckexecutor.h" #include "errortypes.h" #include "filelister.h" @@ -28,7 +29,6 @@ #include "settings.h" #include "standards.h" #include "suppressions.h" -#include "threadexecutor.h" // Threading model #include "timer.h" #include "utils.h" @@ -470,6 +470,7 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) } } +#ifdef THREADING_MODEL_FORK else if (std::strncmp(argv[i], "-l", 2) == 0) { std::string numberString; @@ -494,6 +495,7 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[]) return false; } } +#endif // Enforce language (--language=, -x) else if (std::strncmp(argv[i], "--language=", 11) == 0 || std::strcmp(argv[i], "-x") == 0) { diff --git a/cli/threadexecutor.cpp b/cli/threadexecutor.cpp index 7d64d93f8..9f378391e 100644 --- a/cli/threadexecutor.cpp +++ b/cli/threadexecutor.cpp @@ -19,19 +19,15 @@ #include "threadexecutor.h" #include "color.h" -#include "config.h" #include "cppcheck.h" #include "cppcheckexecutor.h" #include "errorlogger.h" -#include "errortypes.h" #include "importproject.h" #include "settings.h" #include "suppressions.h" #include -#include #include -#include #include #include #include @@ -41,9 +37,14 @@ #endif #ifdef THREADING_MODEL_FORK +#include "config.h" +#include "errortypes.h" + #if defined(__linux__) #include #endif +#include +#include #include #include #include @@ -54,13 +55,13 @@ using std::memset; #endif -#ifdef THREADING_MODEL_WIN +#ifdef THREADING_MODEL_THREAD #include #include #endif ThreadExecutor::ThreadExecutor(const std::map &files, Settings &settings, ErrorLogger &errorLogger) - : mFiles(files), mSettings(settings), mErrorLogger(errorLogger), mFileCount(0) + : mFiles(files), mSettings(settings), mErrorLogger(errorLogger) {} ThreadExecutor::~ThreadExecutor() @@ -231,7 +232,7 @@ bool ThreadExecutor::checkLoadAverage(size_t nchildren) unsigned int ThreadExecutor::check() { - mFileCount = 0; + unsigned int fileCount = 0; unsigned int result = 0; std::size_t totalfilesize = 0; @@ -337,10 +338,10 @@ unsigned int ThreadExecutor::check() } } - mFileCount++; + fileCount++; processedsize += size; if (!mSettings.quiet) - CppCheckExecutor::reportStatus(mFileCount, mFiles.size() + mSettings.project.fileSettings.size(), processedsize, totalfilesize); + CppCheckExecutor::reportStatus(fileCount, mFiles.size() + mSettings.project.fileSettings.size(), processedsize, totalfilesize); close(*rp); rp = rpipes.erase(rp); @@ -401,7 +402,7 @@ void ThreadExecutor::reportInternalChildErr(const std::string &childname, const mErrorLogger.reportErr(errmsg); } -#elif defined(THREADING_MODEL_WIN) +#elif defined(THREADING_MODEL_THREAD) class ThreadExecutor::LogWriter : public ErrorLogger { @@ -510,7 +511,7 @@ unsigned int ThreadExecutor::check() }); } -unsigned int __stdcall ThreadExecutor::threadProc(LogWriter* logWriter) +unsigned int STDCALL ThreadExecutor::threadProc(LogWriter* logWriter) { unsigned int result = 0; diff --git a/cli/threadexecutor.h b/cli/threadexecutor.h index 0c455635c..35bfed5a3 100644 --- a/cli/threadexecutor.h +++ b/cli/threadexecutor.h @@ -19,19 +19,13 @@ #ifndef THREADEXECUTOR_H #define THREADEXECUTOR_H +#include "config.h" + #include #include #include #include -#if ((defined(__GNUC__) || defined(__sun)) && !defined(__MINGW32__) && !defined(__CYGWIN__)) || defined(__CPPCHECK__) -#define THREADING_MODEL_FORK -#elif defined(_WIN32) -#define THREADING_MODEL_WIN -#else -#error "No threading model defined" -#endif - class Settings; class ErrorLogger; @@ -63,7 +57,6 @@ private: const std::map &mFiles; Settings &mSettings; ErrorLogger &mErrorLogger; - unsigned int mFileCount; std::list mErrorList; /** @brief Key is file name, and value is the content of the file */ @@ -92,10 +85,10 @@ private: */ void reportInternalChildErr(const std::string &childname, const std::string &msg); -#elif defined(THREADING_MODEL_WIN) +#elif defined(THREADING_MODEL_THREAD) class LogWriter; - static unsigned __stdcall threadProc(LogWriter *threadExecutor); + static unsigned int STDCALL threadProc(LogWriter *threadExecutor); #endif diff --git a/cmake/compilerDefinitions.cmake b/cmake/compilerDefinitions.cmake index b44e380fc..658385e60 100644 --- a/cmake/compilerDefinitions.cmake +++ b/cmake/compilerDefinitions.cmake @@ -27,5 +27,9 @@ if (ENABLE_CHECK_INTERNAL) add_definitions(-DCHECK_INTERNAL) endif() +if (USE_THREADS) + add_definitions(-DUSE_THREADS) +endif() + file(TO_CMAKE_PATH ${FILESDIR} _filesdir) add_definitions(-DFILESDIR="${_filesdir}") diff --git a/cmake/findDependencies.cmake b/cmake/findDependencies.cmake index 67ddae122..9e27704f2 100644 --- a/cmake/findDependencies.cmake +++ b/cmake/findDependencies.cmake @@ -56,3 +56,7 @@ if (NOT USE_BUNDLED_TINYXML2) endif() endif() endif() + +if (USE_THREADS) + find_package(Threads REQUIRED) +endif() diff --git a/cmake/options.cmake b/cmake/options.cmake index 1de951ad9..5fe68beaa 100644 --- a/cmake/options.cmake +++ b/cmake/options.cmake @@ -43,6 +43,7 @@ option(HAVE_RULES "Usage of rules (needs PCRE library and headers)" option(USE_Z3 "Usage of z3 library" OFF) option(USE_BUNDLED_TINYXML2 "Usage of bundled tinyxml2 library" ON) option(CPPCHK_GLIBCXX_DEBUG "Usage of _GLIBCXX_DEBUG in Debug build" ON) +option(USE_THREADS "Usage of threads instead of fork() for -j" OFF) if (CMAKE_VERSION VERSION_EQUAL "3.16" OR CMAKE_VERSION VERSION_GREATER "3.16") set(CMAKE_DISABLE_PRECOMPILE_HEADERS Off CACHE BOOL "Disable precompiled headers") diff --git a/cmake/printInfo.cmake b/cmake/printInfo.cmake index a81976c3d..5afd5f235 100644 --- a/cmake/printInfo.cmake +++ b/cmake/printInfo.cmake @@ -47,7 +47,12 @@ if (HAVE_RULES) message( STATUS "PCRE_LIBRARY = ${PCRE_LIBRARY}" ) endif() message( STATUS ) +message( STATUS "USE_THREADS = ${USE_THREADS}" ) +if (USE_THREADS) + message( STATUS "CMAKE_THREAD_LIBS_INIT = ${CMAKE_THREAD_LIBS_INIT}" ) +endif() if (NOT USE_MATCHCOMPILER_OPT MATCHES "Off") + message( STATUS ) message( STATUS "PYTHON_VERSION_STRING = ${PYTHON_VERSION_STRING}" ) message( STATUS "PYTHON_EXECUTABLE = ${PYTHON_EXECUTABLE}" ) endif() diff --git a/lib/config.h b/lib/config.h index 32aa19265..2a78761c2 100644 --- a/lib/config.h +++ b/lib/config.h @@ -95,4 +95,16 @@ static const std::string emptyString; #endif #endif +#if defined(_WIN32) +#define THREADING_MODEL_THREAD +#define STDCALL __stdcall +#elif defined(USE_THREADS) +#define THREADING_MODEL_THREAD +#define STDCALL +#elif ((defined(__GNUC__) || defined(__sun)) && !defined(__MINGW32__) && !defined(__CYGWIN__)) || defined(__CPPCHECK__) +#define THREADING_MODEL_FORK +#else +#error "No threading model defined" +#endif + #endif // configH diff --git a/lib/settings.cpp b/lib/settings.cpp index b580577b6..e01ce6379 100644 --- a/lib/settings.cpp +++ b/lib/settings.cpp @@ -59,7 +59,9 @@ Settings::Settings() inlineSuppressions(false), jobs(1), jointSuppressionReport(false), +#ifdef THREADING_MODEL_FORK loadAverage(0), +#endif maxConfigs(12), maxCtuDepth(2), maxTemplateRecursion(100), diff --git a/lib/settings.h b/lib/settings.h index 566bd47e6..ca1554729 100644 --- a/lib/settings.h +++ b/lib/settings.h @@ -228,8 +228,10 @@ public: /** Library */ Library library; +#ifdef THREADING_MODEL_FORK /** @brief Load average value */ int loadAverage; +#endif /** @brief Maximum number of configurations to check before bailing. Default is 12. (--max-configs=N) */ diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index caff36897..42fd64173 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -28,6 +28,9 @@ if (BUILD_TESTS) if(tinyxml2_FOUND AND NOT USE_BUNDLED_TINYXML2) target_link_libraries(testrunner ${tinyxml2_LIBRARY}) endif() + if (USE_THREADS) + target_link_libraries(testrunner ${CMAKE_THREAD_LIBS_INIT}) + endif() if (NOT CMAKE_DISABLE_PRECOMPILE_HEADERS) target_precompile_headers(testrunner PRIVATE precompiled.h)