1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "base/allocator/allocator_extension.h"
6 
7 #include "base/logging.h"
8 
9 #if defined(USE_TCMALLOC)
10 #include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h"
11 #include "third_party/tcmalloc/chromium/src/gperftools/malloc_extension.h"
12 #include "third_party/tcmalloc/chromium/src/gperftools/malloc_hook.h"
13 #endif
14 
15 namespace base {
16 namespace allocator {
17 
ReleaseFreeMemory()18 void ReleaseFreeMemory() {
19 #if defined(USE_TCMALLOC)
20   ::MallocExtension::instance()->ReleaseFreeMemory();
21 #endif
22 }
23 
GetNumericProperty(const char * name,size_t * value)24 bool GetNumericProperty(const char* name, size_t* value) {
25 #if defined(USE_TCMALLOC)
26   return ::MallocExtension::instance()->GetNumericProperty(name, value);
27 #endif
28   return false;
29 }
30 
IsHeapProfilerRunning()31 bool IsHeapProfilerRunning() {
32 #if defined(USE_TCMALLOC)
33   return ::IsHeapProfilerRunning();
34 #endif
35   return false;
36 }
37 
SetHooks(AllocHookFunc alloc_hook,FreeHookFunc free_hook)38 void SetHooks(AllocHookFunc alloc_hook, FreeHookFunc free_hook) {
39 // TODO(sque): Use allocator shim layer instead.
40 #if defined(USE_TCMALLOC)
41   // Make sure no hooks get overwritten.
42   auto prev_alloc_hook = MallocHook::SetNewHook(alloc_hook);
43   if (alloc_hook)
44     DCHECK(!prev_alloc_hook);
45 
46   auto prev_free_hook = MallocHook::SetDeleteHook(free_hook);
47   if (free_hook)
48     DCHECK(!prev_free_hook);
49 #endif
50 }
51 
GetCallStack(void ** stack,int max_stack_size)52 int GetCallStack(void** stack, int max_stack_size) {
53 #if defined(USE_TCMALLOC)
54   return MallocHook::GetCallerStackTrace(stack, max_stack_size, 0);
55 #endif
56   return 0;
57 }
58 
59 }  // namespace allocator
60 }  // namespace base
61