From 3aa6ca8def510b5c10e76899ad9b78f5ba4ea19c Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya Date: Thu, 24 Jun 2021 08:18:40 +0200 Subject: [PATCH] [clangd] Call malloc_trim in clangd-index-server periodically Differential Revision: https://reviews.llvm.org/D104841 --- .../clangd/index/remote/server/Server.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/clang-tools-extra/clangd/index/remote/server/Server.cpp b/clang-tools-extra/clangd/index/remote/server/Server.cpp index 7073cc0dc567..4f4e80b8a4d7 100644 --- a/clang-tools-extra/clangd/index/remote/server/Server.cpp +++ b/clang-tools-extra/clangd/index/remote/server/Server.cpp @@ -43,6 +43,10 @@ #include #endif +#ifdef __GLIBC__ +#include +#endif + namespace clang { namespace clangd { namespace remote { @@ -354,12 +358,25 @@ private: std::atomic> IndexBuildTime; }; +void maybeTrimMemory() { +#if defined(__GLIBC__) && CLANGD_MALLOC_TRIM + malloc_trim(0); +#endif +} + // Detect changes in \p IndexPath file and load new versions of the index // whenever they become available. void hotReload(clangd::SwapIndex &Index, llvm::StringRef IndexPath, llvm::vfs::Status &LastStatus, llvm::IntrusiveRefCntPtr &FS, Monitor &Monitor) { + // glibc malloc doesn't shrink an arena if there are items living at the end, + // which might happen since we destroy the old index after building new one. + // Trim more aggresively to keep memory usage of the server low. + // Note that we do it deliberately here rather than after Index.reset(), + // because old index might still be kept alive after the reset call if we are + // serving requests. + maybeTrimMemory(); auto Status = FS->status(IndexPath); // Requested file is same as loaded index: no reload is needed. if (!Status || (Status->getLastModificationTime() ==