Author: Kadir Cetinkaya Date: 2021-06-25T16:49:31+02:00 New Revision: 3aa6ca8def510b5c10e76899ad9b78f5ba4ea19c
URL: https://github.com/llvm/llvm-project/commit/3aa6ca8def510b5c10e76899ad9b78f5ba4ea19c DIFF: https://github.com/llvm/llvm-project/commit/3aa6ca8def510b5c10e76899ad9b78f5ba4ea19c.diff LOG: [clangd] Call malloc_trim in clangd-index-server periodically Differential Revision: https://reviews.llvm.org/D104841 Added: Modified: clang-tools-extra/clangd/index/remote/server/Server.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/index/remote/server/Server.cpp b/clang-tools-extra/clangd/index/remote/server/Server.cpp index 7073cc0dc5670..4f4e80b8a4d74 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 <grpc++/ext/proto_server_reflection_plugin.h> #endif +#ifdef __GLIBC__ +#include <malloc.h> +#endif + namespace clang { namespace clangd { namespace remote { @@ -354,12 +358,25 @@ class Monitor final : public v1::Monitor::Service { std::atomic<llvm::sys::TimePoint<>> 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<llvm::vfs::FileSystem> &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() == _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits