[clangd] Call malloc_trim in clangd-index-server periodically

Differential Revision: https://reviews.llvm.org/D104841
This commit is contained in:
Kadir Cetinkaya 2021-06-24 08:18:40 +02:00
parent 4921ecfc81
commit 3aa6ca8def
No known key found for this signature in database
GPG key ID: E39E36B8D2057ED6

View file

@ -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 @@ private:
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() ==