| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "base/allocator/allocator_extension.h" | 
 |  | 
 | #include "base/logging.h" | 
 |  | 
 | #if defined(USE_TCMALLOC) | 
 | #include "third_party/tcmalloc/chromium/src/gperftools/heap-profiler.h" | 
 | #include "third_party/tcmalloc/chromium/src/gperftools/malloc_extension.h" | 
 | #include "third_party/tcmalloc/chromium/src/gperftools/malloc_hook.h" | 
 | #endif | 
 |  | 
 | namespace base { | 
 | namespace allocator { | 
 |  | 
 | void ReleaseFreeMemory() { | 
 | #if defined(USE_TCMALLOC) | 
 |   ::MallocExtension::instance()->ReleaseFreeMemory(); | 
 | #endif | 
 | } | 
 |  | 
 | bool GetNumericProperty(const char* name, size_t* value) { | 
 | #if defined(USE_TCMALLOC) | 
 |   return ::MallocExtension::instance()->GetNumericProperty(name, value); | 
 | #endif | 
 |   return false; | 
 | } | 
 |  | 
 | bool IsHeapProfilerRunning() { | 
 | #if defined(USE_TCMALLOC) | 
 |   return ::IsHeapProfilerRunning(); | 
 | #endif | 
 |   return false; | 
 | } | 
 |  | 
 | void SetHooks(AllocHookFunc alloc_hook, FreeHookFunc free_hook) { | 
 | // TODO(sque): Use allocator shim layer instead. | 
 | #if defined(USE_TCMALLOC) | 
 |   // Make sure no hooks get overwritten. | 
 |   auto prev_alloc_hook = MallocHook::SetNewHook(alloc_hook); | 
 |   if (alloc_hook) | 
 |     DCHECK(!prev_alloc_hook); | 
 |  | 
 |   auto prev_free_hook = MallocHook::SetDeleteHook(free_hook); | 
 |   if (free_hook) | 
 |     DCHECK(!prev_free_hook); | 
 | #endif | 
 | } | 
 |  | 
 | int GetCallStack(void** stack, int max_stack_size) { | 
 | #if defined(USE_TCMALLOC) | 
 |   return MallocHook::GetCallerStackTrace(stack, max_stack_size, 0); | 
 | #endif | 
 |   return 0; | 
 | } | 
 |  | 
 | }  // namespace allocator | 
 | }  // namespace base |