From 0cd13230d0a6696974d4a7c152ef97482d76fcc8 Mon Sep 17 00:00:00 2001 From: Philippe Canal Date: Tue, 12 Nov 2024 12:16:09 -0600 Subject: [PATCH 1/3] [cmake] Add support for worktree in the search for roottest. .git is usually a directory but can also be a file, for example in the case of a clone created via `worktree` --- CMakeLists.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index be930aea2a798..64f6d5e5e4870 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,7 +99,8 @@ function(relatedrepo_GetClosestMatch) set(${__FETCHURL_VARIABLE} ${__UPSTREAM_PREFIX}/${__REPO_NAME} PARENT_SCOPE) - if(NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/.git) + # .git is usually a directory but can also be a file, for example in the case of clone created via `worktree` + if(NOT EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/.git) set(${__FETCHREF_VARIABLE} v${ROOT_MAJOR_VERSION}-${ROOT_MINOR_VERSION}-${ROOT_PATCH_VERSION} PARENT_SCOPE) return() endif() From b43cd6837ee2db26a89a2d36a1f04545a209631e Mon Sep 17 00:00:00 2001 From: Philippe Canal Date: Wed, 13 Nov 2024 11:52:37 -0600 Subject: [PATCH 2/3] Do not build test using webgui when webgui is disabled --- test/CMakeLists.txt | 34 ++++++++++++++++++---------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 57927c68f21d1..a9e5240bfc41d 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -178,22 +178,24 @@ if(ROOT_opengl_FOUND) COMMAND ${ROOT_root_CMD} -b -q -l ${CMAKE_CURRENT_SOURCE_DIR}/stressGraphics.cxx FAILREGEX "FAILED|Error in" DEPENDS test-stressgraphics) - # Disabled until the failures on Fedora 41 are addressed - # if(CHROME_EXECUTABLE) - # ROOT_ADD_TEST(test-stressgraphics-chrome - # RUN_SERIAL - # ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_LIBRARY_PATH} - # COMMAND stressGraphics -b -k -p=sgc --web=chrome - # FAILREGEX "FAILED|Error in" - # LABELS longtest) - # endif() - if(FIREFOX_EXECUTABLE AND NOT APPLE) - ROOT_ADD_TEST(test-stressgraphics-firefox-skip3d - RUN_SERIAL - ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_LIBRARY_PATH} - COMMAND stressGraphics -b -k -p=sgf --web=firefox -skip3d - FAILREGEX "FAILED|Error in" - LABELS longtest) + if(webgui) + # Disabled until the failures on Fedora 41 are addressed + # if(CHROME_EXECUTABLE) + # ROOT_ADD_TEST(test-stressgraphics-chrome + # RUN_SERIAL + # ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_LIBRARY_PATH} + # COMMAND stressGraphics -b -k -p=sgc --web=chrome + # FAILREGEX "FAILED|Error in" + # LABELS longtest) + # endif() + if(FIREFOX_EXECUTABLE AND NOT APPLE) + ROOT_ADD_TEST(test-stressgraphics-firefox-skip3d + RUN_SERIAL + ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib:$ENV{LD_LIBRARY_PATH} + COMMAND stressGraphics -b -k -p=sgf --web=firefox -skip3d + FAILREGEX "FAILED|Error in" + LABELS longtest) + endif() endif() endif() From 004bde97c63a6224876788b3e752906738a3fd19 Mon Sep 17 00:00:00 2001 From: Philippe Canal Date: Fri, 25 Apr 2025 18:00:44 -0500 Subject: [PATCH 3/3] [cling] The LookupHelper routines need the ROOT lock. Those routines are at the very least looking up information into Clang and thus need to prevent concurrent updates. Some of the routines can also sometimes induces changes in Clang (eg. template instantiation). Add new header to access lock from clingutils --- core/clingutils/src/TClingUtils.cxx | 10 +++++ .../cling/Interpreter/InterpreterAccessRAII.h | 43 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 interpreter/cling/include/cling/Interpreter/InterpreterAccessRAII.h diff --git a/core/clingutils/src/TClingUtils.cxx b/core/clingutils/src/TClingUtils.cxx index 3746617a150be..59420c68eef87 100644 --- a/core/clingutils/src/TClingUtils.cxx +++ b/core/clingutils/src/TClingUtils.cxx @@ -54,6 +54,7 @@ #include "cling/Interpreter/Transaction.h" #include "cling/Interpreter/Interpreter.h" #include "cling/Utils/AST.h" +#include "cling/Interpreter/InterpreterAccessRAII.h" #include "llvm/Support/Path.h" #include "llvm/Support/FileSystem.h" @@ -569,6 +570,9 @@ void TClingLookupHelper::GetPartiallyDesugaredName(std::string &nameLong) bool TClingLookupHelper::IsAlreadyPartiallyDesugaredName(const std::string &nondef, const std::string &nameLong) { + // We are going to use and possibly update the interpreter information. + cling::InterpreterAccessRAII LockAccess(*fInterpreter); + const cling::LookupHelper& lh = fInterpreter->getLookupHelper(); clang::QualType t = lh.findType(nondef.c_str(), ToLHDS(WantDiags())); if (!t.isNull()) { @@ -584,6 +588,9 @@ bool TClingLookupHelper::IsAlreadyPartiallyDesugaredName(const std::string &nond bool TClingLookupHelper::IsDeclaredScope(const std::string &base, bool &isInlined) { + // We are going to use and possibly update the interpreter information. + cling::InterpreterAccessRAII LockAccess(*fInterpreter); + const cling::LookupHelper& lh = fInterpreter->getLookupHelper(); const clang::Decl *scope = lh.findScope(base.c_str(), ToLHDS(WantDiags()), nullptr); @@ -618,6 +625,9 @@ bool TClingLookupHelper::GetPartiallyDesugaredNameWithScopeHandling(const std::s if (fAutoParse) fAutoParse(tname.c_str()); + // We are going to use and possibly update the interpreter information. + cling::InterpreterAccessRAII LockAccess(*fInterpreter); + // Since we already check via other means (TClassTable which is populated by // the dictonary loading, and the gROOT list of classes and enums, which are // populated via TProtoClass/Enum), we should be able to disable the autoloading diff --git a/interpreter/cling/include/cling/Interpreter/InterpreterAccessRAII.h b/interpreter/cling/include/cling/Interpreter/InterpreterAccessRAII.h new file mode 100644 index 0000000000000..d300615fe4c42 --- /dev/null +++ b/interpreter/cling/include/cling/Interpreter/InterpreterAccessRAII.h @@ -0,0 +1,43 @@ +//------------------------------------------------------------------------------ +// CLING - the C++ LLVM-based InterpreterG :) +// author: Vassil Vassilev +// +// This file is dual-licensed: you can choose to license it under the University +// of Illinois Open Source License or the GNU Lesser General Public License. See +// LICENSE.TXT for details. +//------------------------------------------------------------------------------ + +#ifndef CLING_INTERPRETERACCESSRAII_H +#define CLING_INTERPRETERACCESSRAII_H + +#include "cling/Interpreter/Interpreter.h" +#include "cling/Interpreter/InterpreterCallbacks.h" + +namespace cling { +///\brief Locks and unlocks access to the interpreter. +struct InterpreterAccessRAII { + /// Callbacks used to un/lock. + InterpreterCallbacks* fCallbacks; + /// Info provided to UnlockCompilationDuringUserCodeExecution(). + void* fStateInfo = nullptr; + + InterpreterAccessRAII(InterpreterCallbacks* callbacks): + fCallbacks(callbacks) + { + if (fCallbacks) + // The return value is alway a nullptr. + fStateInfo = fCallbacks->LockCompilationDuringUserCodeExecution(); + } + + InterpreterAccessRAII(Interpreter& interp): + InterpreterAccessRAII(interp.getCallbacks()) {} + + ~InterpreterAccessRAII() + { + if (fCallbacks) + fCallbacks->UnlockCompilationDuringUserCodeExecution(fStateInfo); + } +}; +} + +#endif // CLING_ENTERUSERCODERAII_H