forked from OSchip/llvm-project
[clangd] ignore parallelism level for quick tasks
This allows quick tasks without dependencies that need to run fast to run ASAP. This is mostly useful for code formatting. ---------------------------- This fixes something that's been annoying me: - Open your IDE workspace and its 20 open files - Clangd spends 5 minutes parsing it all - In the meantime you start to work - Save a file, trigger format-on-save, which hangs because clangd is busy - You're stuck waiting until clangd is done parsing your files before the formatting and save takes place Reviewed By: sammccall Differential Revision: https://reviews.llvm.org/D94875
This commit is contained in:
parent
aa8f3677f7
commit
3680cb99a7
|
@ -407,7 +407,7 @@ void ClangdServer::formatOnType(PathRef File, llvm::StringRef Code,
|
|||
Result.push_back(replacementToEdit(Code, R));
|
||||
return CB(Result);
|
||||
};
|
||||
WorkScheduler.run("FormatOnType", File, std::move(Action));
|
||||
WorkScheduler.runQuick("FormatOnType", File, std::move(Action));
|
||||
}
|
||||
|
||||
void ClangdServer::prepareRename(PathRef File, Position Pos,
|
||||
|
@ -635,7 +635,7 @@ void ClangdServer::formatCode(PathRef File, llvm::StringRef Code,
|
|||
tooling::calculateRangesAfterReplacements(IncludeReplaces, Ranges),
|
||||
File)));
|
||||
};
|
||||
WorkScheduler.run("Format", File, std::move(Action));
|
||||
WorkScheduler.runQuick("Format", File, std::move(Action));
|
||||
}
|
||||
|
||||
void ClangdServer::findDocumentHighlights(
|
||||
|
|
|
@ -1265,7 +1265,7 @@ TUScheduler::TUScheduler(const GlobalCompilationDatabase &CDB,
|
|||
: CDB(CDB), Opts(Opts),
|
||||
Callbacks(Callbacks ? move(Callbacks)
|
||||
: std::make_unique<ParsingCallbacks>()),
|
||||
Barrier(Opts.AsyncThreadsCount),
|
||||
Barrier(Opts.AsyncThreadsCount), QuickRunBarrier(Opts.AsyncThreadsCount),
|
||||
IdleASTs(
|
||||
std::make_unique<ASTCache>(Opts.RetentionPolicy.MaxRetainedASTs)) {
|
||||
// Avoid null checks everywhere.
|
||||
|
@ -1339,14 +1339,27 @@ llvm::StringMap<std::string> TUScheduler::getAllFileContents() const {
|
|||
|
||||
void TUScheduler::run(llvm::StringRef Name, llvm::StringRef Path,
|
||||
llvm::unique_function<void()> Action) {
|
||||
runWithSemaphore(Name, Path, std::move(Action), Barrier);
|
||||
}
|
||||
|
||||
void TUScheduler::runQuick(llvm::StringRef Name, llvm::StringRef Path,
|
||||
llvm::unique_function<void()> Action) {
|
||||
// Use QuickRunBarrier to serialize quick tasks: we are ignoring
|
||||
// the parallelism level set by the user, don't abuse it
|
||||
runWithSemaphore(Name, Path, std::move(Action), QuickRunBarrier);
|
||||
}
|
||||
|
||||
void TUScheduler::runWithSemaphore(llvm::StringRef Name, llvm::StringRef Path,
|
||||
llvm::unique_function<void()> Action,
|
||||
Semaphore &Sem) {
|
||||
if (!PreambleTasks) {
|
||||
WithContext WithProvidedContext(Opts.ContextProvider(Path));
|
||||
return Action();
|
||||
}
|
||||
PreambleTasks->runAsync(Name, [this, Ctx = Context::current().clone(),
|
||||
PreambleTasks->runAsync(Name, [this, &Sem, Ctx = Context::current().clone(),
|
||||
Path(Path.str()),
|
||||
Action = std::move(Action)]() mutable {
|
||||
std::lock_guard<Semaphore> BarrierLock(Barrier);
|
||||
std::lock_guard<Semaphore> BarrierLock(Sem);
|
||||
WithContext WC(std::move(Ctx));
|
||||
WithContext WithProvidedContext(Opts.ContextProvider(Path));
|
||||
Action();
|
||||
|
|
|
@ -247,6 +247,13 @@ public:
|
|||
void run(llvm::StringRef Name, llvm::StringRef Path,
|
||||
llvm::unique_function<void()> Action);
|
||||
|
||||
/// Similar to run, except the task is expected to be quick.
|
||||
/// This function will not honor AsyncThreadsCount (except
|
||||
/// if threading is disabled with AsyncThreadsCount=0)
|
||||
/// It is intended to run quick tasks that need to run ASAP
|
||||
void runQuick(llvm::StringRef Name, llvm::StringRef Path,
|
||||
llvm::unique_function<void()> Action);
|
||||
|
||||
/// Defines how a runWithAST action is implicitly cancelled by other actions.
|
||||
enum ASTActionInvalidation {
|
||||
/// The request will run unless explicitly cancelled.
|
||||
|
@ -319,10 +326,14 @@ public:
|
|||
void profile(MemoryTree &MT) const;
|
||||
|
||||
private:
|
||||
void runWithSemaphore(llvm::StringRef Name, llvm::StringRef Path,
|
||||
llvm::unique_function<void()> Action, Semaphore &Sem);
|
||||
|
||||
const GlobalCompilationDatabase &CDB;
|
||||
Options Opts;
|
||||
std::unique_ptr<ParsingCallbacks> Callbacks; // not nullptr
|
||||
Semaphore Barrier;
|
||||
Semaphore QuickRunBarrier;
|
||||
llvm::StringMap<std::unique_ptr<FileData>> Files;
|
||||
std::unique_ptr<ASTCache> IdleASTs;
|
||||
// None when running tasks synchronously and non-None when running tasks
|
||||
|
|
Loading…
Reference in New Issue