diff options
| author | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-03-28 02:18:05 +0000 |
|---|---|---|
| committer | Argyrios Kyrtzidis <akyrtzi@gmail.com> | 2012-03-28 02:18:05 +0000 |
| commit | 7317a5cbfcf7c309ca3c5635ec9fac9b1f3a76f1 (patch) | |
| tree | e181054664ae06fc89dc952fb8cdee28956d1160 /clang/tools/libclang/CIndex.cpp | |
| parent | c557bada5a2f61f70aaaecc7a38607934c1f5ee9 (diff) | |
| download | bcm5719-llvm-7317a5cbfcf7c309ca3c5635ec9fac9b1f3a76f1.tar.gz bcm5719-llvm-7317a5cbfcf7c309ca3c5635ec9fac9b1f3a76f1.zip | |
[libclang] Introduce options to control the priority for the threads
that libclang creates.
-Introduce CXGlobalOptFlags enum for the new options that can be
set on the CXIndex object.
-CXGlobalOpt_ThreadBackgroundPriorityForIndexing affects:
clang_indexSourceFile
clang_indexTranslationUnit
clang_parseTranslationUnit
clang_saveTranslationUnit
-CXGlobalOpt_ThreadBackgroundPriorityForEditing affects:
clang_reparseTranslationUnit
clang_codeCompleteAt
clang_annotateTokens
rdar://9075282
llvm-svn: 153562
Diffstat (limited to 'clang/tools/libclang/CIndex.cpp')
| -rw-r--r-- | clang/tools/libclang/CIndex.cpp | 48 |
1 files changed, 45 insertions, 3 deletions
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp index b3a29ef1052..3882d7bc953 100644 --- a/clang/tools/libclang/CIndex.cpp +++ b/clang/tools/libclang/CIndex.cpp @@ -52,10 +52,11 @@ using namespace clang::cxcursor; using namespace clang::cxstring; using namespace clang::cxtu; -CXTranslationUnit cxtu::MakeCXTranslationUnit(ASTUnit *TU) { +CXTranslationUnit cxtu::MakeCXTranslationUnit(CIndexer *CIdx, ASTUnit *TU) { if (!TU) return 0; CXTranslationUnit D = new CXTranslationUnitImpl(); + D->CIdx = CIdx; D->TUData = TU; D->StringPool = createCXStringPool(); D->Diagnostics = 0; @@ -2411,6 +2412,14 @@ CXIndex clang_createIndex(int excludeDeclarationsFromPCH, CIdxr->setOnlyLocalDecls(); if (displayDiagnostics) CIdxr->setDisplayDiagnostics(); + + if (getenv("LIBCLANG_BGPRIO_INDEX")) + CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() | + CXGlobalOpt_ThreadBackgroundPriorityForIndexing); + if (getenv("LIBCLANG_BGPRIO_EDIT")) + CIdxr->setCXGlobalOptFlags(CIdxr->getCXGlobalOptFlags() | + CXGlobalOpt_ThreadBackgroundPriorityForEditing); + return CIdxr; } @@ -2419,6 +2428,17 @@ void clang_disposeIndex(CXIndex CIdx) { delete static_cast<CIndexer *>(CIdx); } +void clang_CXIndex_setGlobalOptions(CXIndex CIdx, unsigned options) { + if (CIdx) + static_cast<CIndexer *>(CIdx)->setCXGlobalOptFlags(options); +} + +unsigned clang_CXIndex_getGlobalOptions(CXIndex CIdx) { + if (CIdx) + return static_cast<CIndexer *>(CIdx)->getCXGlobalOptFlags(); + return 0; +} + void clang_toggleCrashRecovery(unsigned isEnabled) { if (isEnabled) llvm::CrashRecoveryContext::Enable(); @@ -2441,7 +2461,7 @@ CXTranslationUnit clang_createTranslationUnit(CXIndex CIdx, 0, 0, /*CaptureDiagnostics=*/true, /*AllowPCHWithCompilerErrors=*/true); - return MakeCXTranslationUnit(TU); + return MakeCXTranslationUnit(CXXIdx, TU); } unsigned clang_defaultEditingTranslationUnitOptions() { @@ -2490,6 +2510,9 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { CIndexer *CXXIdx = static_cast<CIndexer *>(CIdx); + if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) + setBackGroundPriority(); + bool PrecompilePreamble = options & CXTranslationUnit_PrecompiledPreamble; // FIXME: Add a flag for modules. TranslationUnitKind TUKind @@ -2601,7 +2624,7 @@ static void clang_parseTranslationUnit_Impl(void *UserData) { } } - PTUI->result = MakeCXTranslationUnit(Unit.take()); + PTUI->result = MakeCXTranslationUnit(CXXIdx, Unit.take()); } CXTranslationUnit clang_parseTranslationUnit(CXIndex CIdx, const char *source_filename, @@ -2663,6 +2686,10 @@ static void clang_saveTranslationUnit_Impl(void *UserData) { SaveTranslationUnitInfo *STUI = static_cast<SaveTranslationUnitInfo*>(UserData); + CIndexer *CXXIdx = (CIndexer*)STUI->TU->CIdx; + if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForIndexing)) + setBackGroundPriority(); + STUI->result = static_cast<ASTUnit *>(STUI->TU->TUData)->Save(STUI->FileName); } @@ -2750,6 +2777,10 @@ static void clang_reparseTranslationUnit_Impl(void *UserData) { if (!TU) return; + CIndexer *CXXIdx = (CIndexer*)TU->CIdx; + if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) + setBackGroundPriority(); + ASTUnit *CXXUnit = static_cast<ASTUnit *>(TU->TUData); ASTUnit::ConcurrencyCheck Check(*CXXUnit); @@ -5133,6 +5164,10 @@ static void clang_annotateTokensImpl(void *UserData) { const unsigned NumTokens = ((clang_annotateTokens_Data*)UserData)->NumTokens; CXCursor *Cursors = ((clang_annotateTokens_Data*)UserData)->Cursors; + CIndexer *CXXIdx = (CIndexer*)TU->CIdx; + if (CXXIdx->isOptEnabled(CXGlobalOpt_ThreadBackgroundPriorityForEditing)) + setBackGroundPriority(); + // Determine the region of interest, which contains all of the tokens. SourceRange RegionOfInterest; RegionOfInterest.setBegin( @@ -5704,6 +5739,13 @@ void SetSafetyThreadStackSize(unsigned Value) { SafetyStackThreadSize = Value; } +void clang::setBackGroundPriority() { + // FIXME: Move to llvm/Support and make it cross-platform. +#ifdef __APPLE__ + setpriority(PRIO_DARWIN_THREAD, 0, PRIO_DARWIN_BG); +#endif +} + } extern "C" { |

