From c86dd569c171ecb8b469a8b71af2aab2c22253c6 Mon Sep 17 00:00:00 2001 From: Jacob Dufault Date: Mon, 17 Apr 2017 20:23:52 -0700 Subject: [PATCH] Enable configuration for the number of indexer threads. --- src/command_line.cc | 90 +++++++++++++++++++-------------------- src/indexer.h | 2 + src/language_server_api.h | 3 +- 3 files changed, 47 insertions(+), 48 deletions(-) diff --git a/src/command_line.cc b/src/command_line.cc index 506bf6e1..5e26b89e 100644 --- a/src/command_line.cc +++ b/src/command_line.cc @@ -33,7 +33,6 @@ namespace { -const int kNumIndexers = 8 - 1; const int kMaxWorkspaceSearchResults = 1000; const bool kUseMultipleProcesses = false; // TODO: initialization options not passed properly when set to true. @@ -195,7 +194,40 @@ struct IpcManager { IpcManager* IpcManager::instance_ = nullptr; +bool IsQueryDbProcessRunningOutOfProcess() { + if (!kUseMultipleProcesses) + return false; + IpcManager* ipc = IpcManager::instance(); + + // Discard any left-over messages from previous runs. + if (kUseMultipleProcesses) + ipc->GetMessages(IpcManager::Destination::Client); + + // Emit an alive check. Sleep so the server has time to respond. + std::cerr << "[setup] Sending IsAlive request to server" << std::endl; + ipc->SendMessage(IpcManager::Destination::Server, MakeUnique()); + + // TODO: Tune this value or make it configurable. + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + + // Check if we got an IsAlive message back. + std::vector> messages = ipc->GetMessages(IpcManager::Destination::Client); + for (auto& message : messages) { + if (IpcId::IsAlive == message->method_id) { + return true; + } + else { + std::cerr << "[setup] Unhandled IPC message " << IpcIdToString(message->method_id) << std::endl; + exit(1); + } + } + + // No response back. Clear out server messages so server doesn't respond to stale request. + ipc->GetMessages(IpcManager::Destination::Server); + + return false; +} @@ -1574,7 +1606,8 @@ void QueryDbMain(IndexerConfig* config) { FileConsumer::SharedState file_consumer_shared; // Start indexer threads. - for (int i = 0; i < kNumIndexers; ++i) { + std::cerr << "[querydb] Starting " << config->indexerCount << " indexers" << std::endl; + for (int i = 0; i < config->indexerCount; ++i) { new std::thread([&]() { IndexMain(config, &file_consumer_shared, &queue_do_index, &queue_do_id_map, &queue_on_id_mapped, &queue_on_indexed); }); @@ -1700,6 +1733,14 @@ void LanguageServerStdinLoop(IndexerConfig* config) { config->cacheDirectory += '/'; MakeDirectoryRecursive(config->cacheDirectory); + // Startup querydb now that we have initialization state. + // TODO: Pass init data to out of process querydb. + bool has_querydb = IsQueryDbProcessRunningOutOfProcess(); + if (!has_querydb) { + new std::thread([&config]() { + QueryDbMain(config); + }); + } ipc->SendMessage(IpcManager::Destination::Server, std::move(open_project)); } @@ -1849,54 +1890,9 @@ void LanguageServerMainLoop() { } } -bool IsQueryDbProcessRunning() { - if (!kUseMultipleProcesses) - return false; - - IpcManager* ipc = IpcManager::instance(); - - // Discard any left-over messages from previous runs. - if (kUseMultipleProcesses) - ipc->GetMessages(IpcManager::Destination::Client); - - // Emit an alive check. Sleep so the server has time to respond. - std::cerr << "[setup] Sending IsAlive request to server" << std::endl; - ipc->SendMessage(IpcManager::Destination::Server, MakeUnique()); - - // TODO: Tune this value or make it configurable. - std::this_thread::sleep_for(std::chrono::milliseconds(100)); - - // Check if we got an IsAlive message back. - std::vector> messages = ipc->GetMessages(IpcManager::Destination::Client); - for (auto& message : messages) { - if (IpcId::IsAlive == message->method_id) { - return true; - } - else { - std::cerr << "[setup] Unhandled IPC message " << IpcIdToString(message->method_id) << std::endl; - exit(1); - } - } - - // No response back. Clear out server messages so server doesn't respond to stale request. - ipc->GetMessages(IpcManager::Destination::Server); - - return false; -} - void LanguageServerMain(IndexerConfig* config) { SetCurrentThreadName("server"); - bool has_server = IsQueryDbProcessRunning(); - - // No server is running. Start it in-process. If the user wants to run the - // server out of process they have to start it themselves. - if (!has_server) { - new std::thread([&config]() { - QueryDbMain(config); - }); - } - // Run language client. new std::thread([&config]() { LanguageServerStdinLoop(config); diff --git a/src/indexer.h b/src/indexer.h index cac79feb..b6062631 100644 --- a/src/indexer.h +++ b/src/indexer.h @@ -433,6 +433,8 @@ struct IndexedFile { IdCache id_cache; std::string path; + // The content of |path| when it was indexed. + //std::string content; std::vector dependencies; std::vector types; diff --git a/src/language_server_api.h b/src/language_server_api.h index 2afe58b2..a4af77c7 100644 --- a/src/language_server_api.h +++ b/src/language_server_api.h @@ -59,8 +59,9 @@ struct IndexerConfig { std::string cacheDirectory; NonElidedVector whitelist; NonElidedVector blacklist; + int indexerCount = 1; }; -MAKE_REFLECT_STRUCT(IndexerConfig, cacheDirectory, whitelist, blacklist); +MAKE_REFLECT_STRUCT(IndexerConfig, cacheDirectory, whitelist, blacklist, indexerCount);