summaryrefslogtreecommitdiffstats
path: root/src/rocksdb/db/malloc_stats.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/rocksdb/db/malloc_stats.cc')
-rw-r--r--src/rocksdb/db/malloc_stats.cc55
1 files changed, 55 insertions, 0 deletions
diff --git a/src/rocksdb/db/malloc_stats.cc b/src/rocksdb/db/malloc_stats.cc
new file mode 100644
index 000000000..52f2e6e0f
--- /dev/null
+++ b/src/rocksdb/db/malloc_stats.cc
@@ -0,0 +1,55 @@
+// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
+// This source code is licensed under both the GPLv2 (found in the
+// COPYING file in the root directory) and Apache 2.0 License
+// (found in the LICENSE.Apache file in the root directory).
+//
+// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file. See the AUTHORS file for names of contributors.
+
+#include "db/malloc_stats.h"
+
+#ifndef ROCKSDB_LITE
+#include <string.h>
+
+#include <memory>
+
+#include "port/jemalloc_helper.h"
+
+namespace ROCKSDB_NAMESPACE {
+
+#ifdef ROCKSDB_JEMALLOC
+
+struct MallocStatus {
+ char* cur;
+ char* end;
+};
+
+static void GetJemallocStatus(void* mstat_arg, const char* status) {
+ MallocStatus* mstat = reinterpret_cast<MallocStatus*>(mstat_arg);
+ size_t status_len = status ? strlen(status) : 0;
+ size_t buf_size = (size_t)(mstat->end - mstat->cur);
+ if (!status_len || status_len > buf_size) {
+ return;
+ }
+
+ snprintf(mstat->cur, buf_size, "%s", status);
+ mstat->cur += status_len;
+}
+void DumpMallocStats(std::string* stats) {
+ if (!HasJemalloc()) {
+ return;
+ }
+ MallocStatus mstat;
+ const unsigned int kMallocStatusLen = 1000000;
+ std::unique_ptr<char[]> buf{new char[kMallocStatusLen + 1]};
+ mstat.cur = buf.get();
+ mstat.end = buf.get() + kMallocStatusLen;
+ malloc_stats_print(GetJemallocStatus, &mstat, "");
+ stats->append(buf.get());
+}
+#else
+void DumpMallocStats(std::string*) {}
+#endif // ROCKSDB_JEMALLOC
+} // namespace ROCKSDB_NAMESPACE
+#endif // !ROCKSDB_LITE