Correct pending_threads counter.

Correct exit criteria in LaunchStdin.
This commit is contained in:
forest93 2018-12-26 23:47:10 +08:00
parent 998a1cf17f
commit 69d2e8338b
2 changed files with 15 additions and 5 deletions

View File

@ -423,6 +423,7 @@ void ThreadLeave() {
std::lock_guard lock(thread_mtx); std::lock_guard lock(thread_mtx);
if (!--pending_threads) if (!--pending_threads)
no_pending_threads.notify_one(); no_pending_threads.notify_one();
assert(pending_threads >= 0);
} }
void Init() { void Init() {
@ -526,13 +527,13 @@ void LaunchStdin() {
ReflectMember(reader, "method", method); ReflectMember(reader, "method", method);
if (method.empty()) if (method.empty())
continue; continue;
const auto should_exit = method == "exit";
// g_config is not available before "initialize". Use 0 in that case. // g_config is not available before "initialize". Use 0 in that case.
on_request->PushBack( on_request->PushBack(
{id, std::move(method), std::move(message), std::move(document), {id, std::move(method), std::move(message), std::move(document),
chrono::steady_clock::now() + chrono::steady_clock::now() +
chrono::milliseconds(g_config ? g_config->request.timeout : 0)}); chrono::milliseconds(g_config ? g_config->request.timeout : 0)});
if (should_exit)
if (method == "exit")
break; break;
} }
}).detach(); }).detach();

View File

@ -406,6 +406,10 @@ void BuildPreamble(Session &session, CompilerInvocation &CI,
void *PreambleMain(void *manager_) { void *PreambleMain(void *manager_) {
auto *manager = static_cast<SemaManager *>(manager_); auto *manager = static_cast<SemaManager *>(manager_);
pipeline::ThreadEnter();
struct RAII {
~RAII() { pipeline::ThreadLeave(); }
} raii{};
set_thread_name("preamble"); set_thread_name("preamble");
while (true) { while (true) {
SemaManager::PreambleTask task = manager->preamble_tasks.Dequeue(); SemaManager::PreambleTask task = manager->preamble_tasks.Dequeue();
@ -432,12 +436,15 @@ void *PreambleMain(void *manager_) {
manager->ScheduleDiag(task.path, debounce); manager->ScheduleDiag(task.path, debounce);
} }
} }
pipeline::ThreadLeave();
return nullptr; return nullptr;
} }
void *CompletionMain(void *manager_) { void *CompletionMain(void *manager_) {
auto *manager = static_cast<SemaManager *>(manager_); auto *manager = static_cast<SemaManager *>(manager_);
pipeline::ThreadEnter();
struct RAII {
~RAII() { pipeline::ThreadLeave(); }
} raii{};
set_thread_name("comp"); set_thread_name("comp");
while (true) { while (true) {
std::unique_ptr<SemaManager::CompTask> task = manager->comp_tasks.Dequeue(); std::unique_ptr<SemaManager::CompTask> task = manager->comp_tasks.Dequeue();
@ -493,7 +500,6 @@ void *CompletionMain(void *manager_) {
task->on_complete(&Clang->getCodeCompletionConsumer()); task->on_complete(&Clang->getCodeCompletionConsumer());
} }
pipeline::ThreadLeave();
return nullptr; return nullptr;
} }
@ -527,6 +533,10 @@ void printDiag(llvm::raw_string_ostream &OS, const DiagBase &d) {
void *DiagnosticMain(void *manager_) { void *DiagnosticMain(void *manager_) {
auto *manager = static_cast<SemaManager *>(manager_); auto *manager = static_cast<SemaManager *>(manager_);
pipeline::ThreadEnter();
struct RAII {
~RAII() { pipeline::ThreadLeave(); }
} raii{};
set_thread_name("diag"); set_thread_name("diag");
while (true) { while (true) {
SemaManager::DiagTask task = manager->diag_tasks.Dequeue(); SemaManager::DiagTask task = manager->diag_tasks.Dequeue();
@ -643,7 +653,6 @@ void *DiagnosticMain(void *manager_) {
} }
manager->on_diagnostic_(task.path, ls_diags); manager->on_diagnostic_(task.path, ls_diags);
} }
pipeline::ThreadLeave();
return nullptr; return nullptr;
} }