1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. 2 // This source code is licensed under both the GPLv2 (found in the 3 // COPYING file in the root directory) and Apache 2.0 License 4 // (found in the LICENSE.Apache file in the root directory). 5 // 6 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. 7 // Use of this source code is governed by a BSD-style license that can be 8 // found in the LICENSE file. See the AUTHORS file for names of contributors. 9 10 #include "db/malloc_stats.h" 11 12 #ifndef ROCKSDB_LITE 13 #include <memory> 14 #include <string.h> 15 16 #include "port/jemalloc_helper.h" 17 18 namespace ROCKSDB_NAMESPACE { 19 20 #ifdef ROCKSDB_JEMALLOC 21 22 typedef struct { 23 char* cur; 24 char* end; 25 } MallocStatus; 26 GetJemallocStatus(void * mstat_arg,const char * status)27static void GetJemallocStatus(void* mstat_arg, const char* status) { 28 MallocStatus* mstat = reinterpret_cast<MallocStatus*>(mstat_arg); 29 size_t status_len = status ? strlen(status) : 0; 30 size_t buf_size = (size_t)(mstat->end - mstat->cur); 31 if (!status_len || status_len > buf_size) { 32 return; 33 } 34 35 snprintf(mstat->cur, buf_size, "%s", status); 36 mstat->cur += status_len; 37 } DumpMallocStats(std::string * stats)38void DumpMallocStats(std::string* stats) { 39 if (!HasJemalloc()) { 40 return; 41 } 42 MallocStatus mstat; 43 const unsigned int kMallocStatusLen = 1000000; 44 std::unique_ptr<char[]> buf{new char[kMallocStatusLen + 1]}; 45 mstat.cur = buf.get(); 46 mstat.end = buf.get() + kMallocStatusLen; 47 malloc_stats_print(GetJemallocStatus, &mstat, ""); 48 stats->append(buf.get()); 49 } 50 #else 51 void DumpMallocStats(std::string*) {} 52 #endif // ROCKSDB_JEMALLOC 53 } // namespace ROCKSDB_NAMESPACE 54 #endif // !ROCKSDB_LITE 55