From: Douglas Gregor Date: Fri, 24 Sep 2010 21:18:36 +0000 (+0000) Subject: Teach libclang to enable multithreading in LLVM, since libclang clients are likely... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8c8d5412cddcc1c45beb0353d91d7894db74e585;p=clang Teach libclang to enable multithreading in LLVM, since libclang clients are likely to be multithreaded. Also move the printing of timers to somewhere better for multithreaded libclang clients git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@114760 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Frontend/ASTUnit.cpp b/lib/Frontend/ASTUnit.cpp index b6c4eaac5f..bd7e712bc7 100644 --- a/lib/Frontend/ASTUnit.cpp +++ b/lib/Frontend/ASTUnit.cpp @@ -84,6 +84,9 @@ ASTUnit::~ASTUnit() { ClearCachedCompletionResults(); + if (TimerGroup) + TimerGroup->printAll(llvm::errs()); + for (unsigned I = 0, N = Timers.size(); I != N; ++I) delete Timers[I]; } diff --git a/tools/libclang/CIndex.cpp b/tools/libclang/CIndex.cpp index d2d00571c1..554edd824e 100644 --- a/tools/libclang/CIndex.cpp +++ b/tools/libclang/CIndex.cpp @@ -34,8 +34,10 @@ #include "llvm/Support/CrashRecoveryContext.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/Timer.h" +#include "llvm/System/Mutex.h" #include "llvm/System/Program.h" #include "llvm/System/Signals.h" +#include "llvm/System/Threading.h" // Needed to define L_TMPNAM on some systems. #include @@ -1910,6 +1912,9 @@ bool CursorVisitor::VisitAttributes(Decl *D) { return false; } +static llvm::sys::Mutex EnableMultithreadingMutex; +static bool EnabledMultithreading; + extern "C" { CXIndex clang_createIndex(int excludeDeclarationsFromPCH, int displayDiagnostics) { @@ -1917,6 +1922,15 @@ CXIndex clang_createIndex(int excludeDeclarationsFromPCH, // enable it. llvm::CrashRecoveryContext::Enable(); + // Enable support for multithreading in LLVM. + { + llvm::sys::ScopedLock L(EnableMultithreadingMutex); + if (!EnabledMultithreading) { + llvm::llvm_start_multithreaded(); + EnabledMultithreading = true; + } + } + CIndexer *CIdxr = new CIndexer(); if (excludeDeclarationsFromPCH) CIdxr->setOnlyLocalDecls(); @@ -1928,8 +1942,6 @@ CXIndex clang_createIndex(int excludeDeclarationsFromPCH, void clang_disposeIndex(CXIndex CIdx) { if (CIdx) delete static_cast(CIdx); - if (getenv("LIBCLANG_TIMING")) - llvm::TimerGroup::printAll(llvm::errs()); } void clang_setUseExternalASTGeneration(CXIndex CIdx, int value) {