tcmalloc.cc

#include "config.h"
#include <new>
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
#include <stdarg.h>
#include "packed-cache-inl.h"
#include "base/commandlineflags.h"
#include "base/basictypes.h"
#include "base/sysinfo.h"
#include "base/spinlock.h"
#include <google/malloc_hook.h>
#include <google/malloc_extension.h>
#include "internal_logging.h"
#include "pagemap.h"
#include "system-alloc.h"
#include "maybe_threads.h"
#include <google/stacktrace.h>

tcmalloc-0.93/tcmalloc.ccのインクルード依存関係図

ソースコードを見る。

構成

struct  TCEntry
class  PageHeapAllocator< T >
struct  Span
struct  StackTrace
class  MapSelector< BITS >
class  MapSelector< 32 >
class  TCMalloc_PageHeap
struct  TCMalloc_PageHeap::SpanList
class  TCMalloc_ThreadCache_FreeList
class  TCMalloc_ThreadCache
class  TCMalloc_Central_FreeList
class  TCMalloc_Central_FreeListPadded
struct  TCMallocStats
class  TCMallocImplementation
class  TCMallocGuard

マクロ定義

#define __THROW
#define Event(s, o, v)   ((void) 0)
#define pageheap   ((TCMalloc_PageHeap*) pageheap_memory)

型定義

typedef uintptr_t PageID
typedef uintptr_t Length

関数

 DEFINE_int64 (tcmalloc_sample_parameter, 262147,"Twice the approximate gap between sampling actions."" Must be a prime number. Otherwise will be rounded up to a "" larger prime number")
 DEFINE_double (tcmalloc_release_rate, 10,"Rate at which we release unused memory to the system. ""Zero means we never release memory back to the system. ""Increase this flag to return memory faster; decrease it ""to return memory slower. Reasonable rates are in the ""range [0,10]")
static int ClassIndex (size_t s)
static int LgFloor (size_t n)
static void * SLL_Next (void *t)
static void SLL_SetNext (void *t, void *n)
static void SLL_Push (void **list, void *element)
static void * SLL_Pop (void **list)
static void SLL_PopRange (void **head, int N, void **start, void **end)
static void SLL_PushRange (void **head, void *start, void *end)
static size_t SLL_Size (void *head)
static int SizeClass (size_t size)
static size_t ByteSizeForClass (size_t cl)
static int NumMoveSize (size_t size)
static void InitSizeClasses ()
static void * MetaDataAlloc (size_t bytes)
static Length pages (size_t bytes)
static size_t AllocationSize (size_t bytes)
static SpanNewSpan (PageID p, Length len)
static void DeleteSpan (Span *span)
static void DLL_Init (Span *list)
static void DLL_Remove (Span *span)
static bool DLL_IsEmpty (const Span *list)
static int DLL_Length (const Span *list)
static void DLL_Prepend (Span *list, Span *span)
static double PagesToMB (uint64_t pages)
static void RecordGrowth (size_t growth)
static void ReleaseFreeList (Span *list, Span *returned)
static void ExtractStats (TCMallocStats *r, uint64_t *class_count)
static void DumpStats (TCMalloc_Printer *out, int level)
static void PrintStats (int level)
static void ** DumpStackTraces ()
static void ** DumpHeapGrowthStackTraces ()
static SpanDoSampledAllocation (size_t size)
static bool CheckCachedSizeClass (void *ptr)
static void * CheckedMallocResult (void *result)
static void * SpanToMallocResult (Span *span)
static void * do_malloc (size_t size)
static void do_free (void *ptr)
static void * do_memalign (size_t align, size_t size)
static void do_malloc_stats ()
static int do_mallopt (int cmd, int value)
void * malloc (size_t size) __THROW ATTRIBUTE_SECTION(google_malloc)
void free (void *ptr) __THROW ATTRIBUTE_SECTION(google_malloc)
void * realloc (void *ptr, size_t size) __THROW ATTRIBUTE_SECTION(google_malloc)
void * calloc (size_t nmemb, size_t size) __THROW ATTRIBUTE_SECTION(google_malloc)
void cfree (void *ptr) __THROW ATTRIBUTE_SECTION(google_malloc)
void * memalign (size_t __alignment, size_t __size) __THROW ATTRIBUTE_SECTION(google_malloc)
int posix_memalign (void **ptr, size_t align, size_t size) __THROW ATTRIBUTE_SECTION(google_malloc)
void * valloc (size_t __size) __THROW ATTRIBUTE_SECTION(google_malloc)
void * pvalloc (size_t __size) __THROW ATTRIBUTE_SECTION(google_malloc)
static void * MemalignOverride (size_t align, size_t size, const void *caller) __THROW ATTRIBUTE_SECTION(google_malloc)
void * operator new (size_t size) ATTRIBUTE_SECTION(google_malloc)
void operator delete (void *p) __THROW ATTRIBUTE_SECTION(google_malloc)
void * operator new[] (size_t size) ATTRIBUTE_SECTION(google_malloc)
void operator delete[] (void *p) __THROW ATTRIBUTE_SECTION(google_malloc)
void * operator new (size_t size, const std::nothrow_t &) __THROW ATTRIBUTE_SECTION(google_malloc)
void operator delete (void *p, const std::nothrow_t &) __THROW ATTRIBUTE_SECTION(google_malloc)
void * operator new[] (size_t size, const std::nothrow_t &) __THROW ATTRIBUTE_SECTION(google_malloc)
void operator delete[] (void *p, const std::nothrow_t &) __THROW ATTRIBUTE_SECTION(google_malloc)
static void * cpp_alloc (size_t size, bool nothrow)
void malloc_stats (void)
int mallopt (int cmd, int value)

変数

static const size_t kPageShift = 12
static const size_t kPageSize = 1 << kPageShift
static const size_t kMaxSize = 8u * kPageSize
static const size_t kAlignShift = 3
static const size_t kAlignment = 1 << kAlignShift
static const size_t kNumClasses = 68
static const size_t kPageMapBigAllocationThreshold = 128 << 20
static const int kMinSystemAlloc = 1 << (20 - kPageShift)
static int num_objects_to_move [kNumClasses]
static const int kMaxFreeListLength = 256
static const size_t kMinThreadCacheSize = kMaxSize * 2
static const size_t kMaxThreadCacheSize = 2 << 20
static const size_t kDefaultOverallThreadCacheSize = 16 << 20
static const size_t kMaxPages = kMinSystemAlloc
static unsigned int primes_list []
static size_t sample_period = 262147
static SpinLock sample_period_lock (SpinLock::LINKER_INITIALIZED)
static const int kMaxSmallSize = 1024
static const int shift_amount [2] = { 3, 7 }
static const int add_amount [2] = { 7, 127 + (120 << 7) }
static unsigned char class_array [377]
static size_t class_to_size [kNumClasses]
static size_t class_to_pages [kNumClasses]
static const int kNumTransferEntries = kNumClasses
static uint64_t metadata_system_bytes = 0
static const Length kMaxValidPages = (~static_cast<Length>(0)) >> kPageShift
static PageHeapAllocator< Spanspan_allocator
static const int kMaxStackDepth = 31
static PageHeapAllocator
< StackTrace
stacktrace_allocator
static Span sampled_objects
static StackTracegrowth_stacks = NULL
static
TCMalloc_Central_FreeListPadded 
central_cache [kNumClasses]
static SpinLock pageheap_lock (SpinLock::LINKER_INITIALIZED)
static char pageheap_memory [sizeof(TCMalloc_PageHeap)]
static bool phinited = false
static bool tsd_inited = false
static pthread_key_t heap_key
static PageHeapAllocator
< TCMalloc_ThreadCache
threadheap_allocator
static TCMalloc_ThreadCachethread_heaps = NULL
static int thread_heap_count = 0
static size_t overall_thread_cache_size = kDefaultOverallThreadCacheSize
static volatile size_t per_thread_cache_size = kMaxThreadCacheSize
static TCMallocGuard module_enter_exit_hook
static SpinLock set_new_handler_lock (SpinLock::LINKER_INITIALIZED)
static size_t pagesize = 0
void *(* __memalign_hook )(size_t, size_t, const void *) = MemalignOverride


マクロ定義

#define __THROW

tcmalloc-0.93/tcmalloc.cc161 行で定義されています。

#define Event ( s,
o,
 )     ((void) 0)

tcmalloc-0.93/tcmalloc.cc678 行で定義されています。

#define pageheap   ((TCMalloc_PageHeap*) pageheap_memory)

tcmalloc-0.93/tcmalloc.cc1594 行で定義されています。


型定義

typedef uintptr_t Length

tcmalloc-0.93/tcmalloc.cc625 行で定義されています。

typedef uintptr_t PageID

tcmalloc-0.93/tcmalloc.cc622 行で定義されています。


関数

static size_t AllocationSize ( size_t  bytes  )  [static]

tcmalloc-0.93/tcmalloc.cc638 行で定義されています。

参照先 ASSERT, ByteSizeForClass(), pages(), と SizeClass().

static size_t ByteSizeForClass ( size_t  cl  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc389 行で定義されています。

void* calloc ( size_t  nmemb,
size_t  size 
)

tcmalloc-0.8/tcmalloc.cc2350 行で定義されています。

参照先 do_malloc(), と MallocHook::InvokeNewHook().

参照元 __libc_calloc().

void cfree ( void *  ptr  ) 

tcmalloc-0.8/tcmalloc.cc2363 行で定義されています。

static bool CheckCachedSizeClass ( void *  ptr  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc2623 行で定義されています。

参照先 pageheap.

参照元 CheckedMallocResult().

static void* CheckedMallocResult ( void *  result  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc2630 行で定義されています。

参照先 ASSERT, と CheckCachedSizeClass().

参照元 do_malloc(), do_memalign(), と SpanToMallocResult().

static int ClassIndex ( size_t  s  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc280 行で定義されています。

参照元 InitSizeClasses(), と SizeClass().

static void* cpp_alloc ( size_t  size,
bool  nothrow 
) [inline, static]

tcmalloc-0.93/tcmalloc.cc2961 行で定義されています。

参照先 do_malloc(), と set_new_handler_lock.

DEFINE_double ( tcmalloc_release_rate  ,
10  ,
"Rate at which we release unused memory to the system. ""Zero means we never release memory back to the system. ""Increase this flag to return memory faster; decrease it ""to return memory slower. Reasonable rates are in the ""range "  [0, 10] 
)

DEFINE_int64 ( tcmalloc_sample_parameter  ,
262147  ,
"Twice the approximate gap between sampling actions."" Must be a prime number. Otherwise will be rounded up to a "" larger prime number"   
)

static void DeleteSpan ( Span span  )  [static]

tcmalloc-0.93/tcmalloc.cc694 行で定義されています。

参照先 PageHeapAllocator< T >::Delete().

static void DLL_Init ( Span list  )  [static]

tcmalloc-0.93/tcmalloc.cc706 行で定義されています。

参照先 Span::next, と Span::prev.

static bool DLL_IsEmpty ( const Span list  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc718 行で定義されています。

参照先 Span::next.

static int DLL_Length ( const Span list  )  [static]

tcmalloc-0.93/tcmalloc.cc722 行で定義されています。

参照先 Span::next.

static void DLL_Prepend ( Span list,
Span span 
) [static]

tcmalloc-0.93/tcmalloc.cc740 行で定義されています。

参照先 ASSERT, Span::next, と Span::prev.

static void DLL_Remove ( Span span  )  [static]

tcmalloc-0.93/tcmalloc.cc711 行で定義されています。

参照先 Span::next, と Span::prev.

static void do_free ( void *  ptr  )  [inline, static]

static void* do_malloc ( size_t  size  )  [inline, static]

static void do_malloc_stats (  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc2777 行で定義されています。

参照先 PrintStats().

参照元 malloc_stats().

static int do_mallopt ( int  cmd,
int  value 
) [inline, static]

tcmalloc-0.93/tcmalloc.cc2781 行で定義されています。

参照元 mallopt().

static void* do_memalign ( size_t  align,
size_t  size 
) [static]

static Span* DoSampledAllocation ( size_t  size  )  [static]

static void** DumpHeapGrowthStackTraces (  )  [static]

tcmalloc-0.93/tcmalloc.cc2409 行で定義されています。

参照先 ASSERT, MESSAGE, と pageheap_lock.

static void** DumpStackTraces (  )  [static]

static void DumpStats ( TCMalloc_Printer out,
int  level 
) [static]

static void ExtractStats ( TCMallocStats r,
uint64_t *  class_count 
) [static]

void free ( void *  ptr  ) 

tcmalloc-0.8/tcmalloc.cc2345 行で定義されています。

参照先 do_free(), と MallocHook::InvokeDeleteHook().

参照元 __libc_free(), と TCMallocGuard::TCMallocGuard().

static void InitSizeClasses (  )  [static]

tcmalloc-0.93/tcmalloc.cc418 行で定義されています。

参照先 ByteSizeForClass(), ClassIndex(), LgFloor(), MESSAGE, NumMoveSize(), PRIuS, と SizeClass().

static int LgFloor ( size_t  n  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc307 行で定義されています。

参照先 ASSERT.

void* malloc ( size_t  size  ) 

tcmalloc-0.8/tcmalloc.cc2339 行で定義されています。

参照先 do_malloc(), と MallocHook::InvokeNewHook().

参照元 __libc_malloc(), と TCMallocGuard::TCMallocGuard().

void malloc_stats ( void   ) 

tcmalloc-0.93/tcmalloc.cc3096 行で定義されています。

参照先 do_malloc_stats().

int mallopt ( int  cmd,
int  value 
)

tcmalloc-0.93/tcmalloc.cc3100 行で定義されています。

参照先 do_mallopt().

void* memalign ( size_t  __alignment,
size_t  __size 
)

tcmalloc-0.8/tcmalloc.cc2495 行で定義されています。

static void * MemalignOverride ( size_t  align,
size_t  size,
const void *  caller 
) [static]

tcmalloc-0.93/tcmalloc.cc3158 行で定義されています。

参照先 do_memalign(), と MallocHook::InvokeNewHook().

static void* MetaDataAlloc ( size_t  bytes  )  [static]

tcmalloc-0.93/tcmalloc.cc548 行で定義されています。

参照先 TCMalloc_SystemAlloc().

static Span* NewSpan ( PageID  p,
Length  len 
) [static]

tcmalloc-0.93/tcmalloc.cc683 行で定義されています。

参照先 Span::length, PageHeapAllocator< T >::New(), と Span::start.

static int NumMoveSize ( size_t  size  )  [static]

tcmalloc-0.93/tcmalloc.cc394 行で定義されています。

void operator delete ( void *  p,
const std::nothrow_t &   
)

tcmalloc-0.8/tcmalloc.cc2472 行で定義されています。

参照先 do_free(), と MallocHook::InvokeDeleteHook().

void operator delete ( void *  p  ) 

tcmalloc-0.8/tcmalloc.cc2467 行で定義されています。

参照先 do_free(), と MallocHook::InvokeDeleteHook().

void operator delete[] ( void *  p,
const std::nothrow_t &   
)

tcmalloc-0.8/tcmalloc.cc2490 行で定義されています。

参照先 do_free(), と MallocHook::InvokeDeleteHook().

void operator delete[] ( void *  p  ) 

tcmalloc-0.8/tcmalloc.cc2485 行で定義されています。

参照先 do_free(), と MallocHook::InvokeDeleteHook().

void* operator new ( size_t  size,
const std::nothrow_t &   
)

tcmalloc-0.8/tcmalloc.cc2463 行で定義されています。

参照先 cpp_alloc().

void* operator new ( size_t  size  ) 

tcmalloc-0.8/tcmalloc.cc2459 行で定義されています。

参照先 cpp_alloc().

void* operator new[] ( size_t  size,
const std::nothrow_t &   
)

tcmalloc-0.8/tcmalloc.cc2481 行で定義されています。

参照先 cpp_alloc().

void* operator new[] ( size_t  size  ) 

tcmalloc-0.8/tcmalloc.cc2477 行で定義されています。

参照先 cpp_alloc().

static Length pages ( size_t  bytes  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc631 行で定義されています。

static double PagesToMB ( uint64_t  pages  )  [static]

tcmalloc-0.93/tcmalloc.cc1186 行で定義されています。

int posix_memalign ( void **  ptr,
size_t  align,
size_t  size 
)

tcmalloc-0.8/tcmalloc.cc2501 行で定義されています。

static void PrintStats ( int  level  )  [static]

tcmalloc-0.93/tcmalloc.cc2358 行で定義されています。

参照先 DumpStats().

void* pvalloc ( size_t  __size  ) 

tcmalloc-0.8/tcmalloc.cc2528 行で定義されています。

void* realloc ( void *  ptr,
size_t  size 
)

static void RecordGrowth ( size_t  growth  )  [static]

static void ReleaseFreeList ( Span list,
Span returned 
) [static]

static int SizeClass ( size_t  size  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc384 行で定義されています。

参照先 ClassIndex().

static void* SLL_Next ( void *  t  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc324 行で定義されています。

static void* SLL_Pop ( void **  list  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc337 行で定義されています。

参照先 SLL_Next().

static void SLL_PopRange ( void **  head,
int  N,
void **  start,
void **  end 
) [inline, static]

tcmalloc-0.93/tcmalloc.cc348 行で定義されています。

参照先 SLL_Next(), と SLL_SetNext().

static void SLL_Push ( void **  list,
void *  element 
) [inline, static]

tcmalloc-0.93/tcmalloc.cc332 行で定義されています。

参照先 SLL_SetNext().

static void SLL_PushRange ( void **  head,
void *  start,
void *  end 
) [inline, static]

tcmalloc-0.93/tcmalloc.cc367 行で定義されています。

参照先 SLL_SetNext().

static void SLL_SetNext ( void *  t,
void *  n 
) [inline, static]

tcmalloc-0.93/tcmalloc.cc328 行で定義されています。

static size_t SLL_Size ( void *  head  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc373 行で定義されています。

参照先 SLL_Next().

static void* SpanToMallocResult ( Span span  )  [inline, static]

tcmalloc-0.93/tcmalloc.cc2636 行で定義されています。

参照先 CheckedMallocResult(), pageheap, と Span::start.

参照元 do_malloc(), と do_memalign().

void* valloc ( size_t  __size  ) 

tcmalloc-0.8/tcmalloc.cc2520 行で定義されています。


変数

void*(* __memalign_hook)(size_t, size_t, const void *) = MemalignOverride

const int add_amount[2] = { 7, 127 + (120 << 7) } [static]

tcmalloc-0.93/tcmalloc.cc276 行で定義されています。

tcmalloc-0.93/tcmalloc.cc1585 行で定義されています。

unsigned char class_array[377] [static]

tcmalloc-0.93/tcmalloc.cc277 行で定義されています。

size_t class_to_pages[kNumClasses] [static]

tcmalloc-0.93/tcmalloc.cc289 行で定義されています。

size_t class_to_size[kNumClasses] [static]

tcmalloc-0.93/tcmalloc.cc286 行で定義されています。

StackTrace* growth_stacks = NULL [static]

tcmalloc-0.93/tcmalloc.cc769 行で定義されています。

pthread_key_t heap_key [static]

tcmalloc-0.93/tcmalloc.cc1612 行で定義されています。

tcmalloc-0.93/tcmalloc.cc1733 行で定義されています。

const size_t kAlignment = 1 << kAlignShift [static]

tcmalloc-0.93/tcmalloc.cc175 行で定義されています。

const size_t kAlignShift = 3 [static]

tcmalloc-0.93/tcmalloc.cc174 行で定義されています。

const size_t kDefaultOverallThreadCacheSize = 16 << 20 [static]

tcmalloc-0.93/tcmalloc.cc209 行で定義されています。

const int kMaxFreeListLength = 256 [static]

tcmalloc-0.93/tcmalloc.cc202 行で定義されています。

const size_t kMaxPages = kMinSystemAlloc [static]

tcmalloc-0.93/tcmalloc.cc213 行で定義されています。

const size_t kMaxSize = 8u * kPageSize [static]

tcmalloc-0.93/tcmalloc.cc173 行で定義されています。

const int kMaxSmallSize = 1024 [static]

tcmalloc-0.93/tcmalloc.cc274 行で定義されています。

const int kMaxStackDepth = 31 [static]

tcmalloc-0.93/tcmalloc.cc756 行で定義されています。

const size_t kMaxThreadCacheSize = 2 << 20 [static]

tcmalloc-0.93/tcmalloc.cc206 行で定義されています。

const Length kMaxValidPages = (~static_cast<Length>(0)) >> kPageShift [static]

tcmalloc-0.93/tcmalloc.cc627 行で定義されています。

const int kMinSystemAlloc = 1 << (20 - kPageShift) [static]

tcmalloc-0.93/tcmalloc.cc188 行で定義されています。

const size_t kMinThreadCacheSize = kMaxSize * 2 [static]

tcmalloc-0.93/tcmalloc.cc205 行で定義されています。

const size_t kNumClasses = 68 [static]

tcmalloc-0.93/tcmalloc.cc176 行で定義されています。

const int kNumTransferEntries = kNumClasses [static]

tcmalloc-0.93/tcmalloc.cc303 行で定義されています。

const size_t kPageMapBigAllocationThreshold = 128 << 20 [static]

tcmalloc-0.93/tcmalloc.cc180 行で定義されています。

const size_t kPageShift = 12 [static]

tcmalloc-0.93/tcmalloc.cc171 行で定義されています。

const size_t kPageSize = 1 << kPageShift [static]

tcmalloc-0.93/tcmalloc.cc172 行で定義されています。

uint64_t metadata_system_bytes = 0 [static]

tcmalloc-0.93/tcmalloc.cc547 行で定義されています。

tcmalloc-0.93/tcmalloc.cc2588 行で定義されています。

tcmalloc-0.93/tcmalloc.cc195 行で定義されています。

tcmalloc-0.93/tcmalloc.cc1622 行で定義されています。

SpinLock pageheap_lock(SpinLock::LINKER_INITIALIZED) [static]

char pageheap_memory[sizeof(TCMalloc_PageHeap)] [static]

tcmalloc-0.93/tcmalloc.cc1589 行で定義されています。

size_t pagesize = 0 [static]

tcmalloc-0.93/tcmalloc.cc3077 行で定義されています。

volatile size_t per_thread_cache_size = kMaxThreadCacheSize [static]

tcmalloc-0.93/tcmalloc.cc1628 行で定義されています。

bool phinited = false [static]

tcmalloc-0.93/tcmalloc.cc1590 行で定義されています。

unsigned int primes_list[] [static]

初期値:

 {
        
        
        
        
        32771, 65537, 131101, 262147, 524309, 1048583,
        2097169, 4194319, 8388617, 16777259, 33554467 }

tcmalloc-0.93/tcmalloc.cc216 行で定義されています。

size_t sample_period = 262147 [static]

tcmalloc-0.93/tcmalloc.cc238 行で定義されています。

SpinLock sample_period_lock(SpinLock::LINKER_INITIALIZED) [static]

tcmalloc-0.93/tcmalloc.cc763 行で定義されています。

SpinLock set_new_handler_lock(SpinLock::LINKER_INITIALIZED) [static]

const int shift_amount[2] = { 3, 7 } [static]

tcmalloc-0.93/tcmalloc.cc275 行で定義されています。

tcmalloc-0.93/tcmalloc.cc682 行で定義されています。

tcmalloc-0.93/tcmalloc.cc762 行で定義されています。

tcmalloc-0.93/tcmalloc.cc1733 行で定義されています。

int thread_heap_count = 0 [static]

tcmalloc-0.93/tcmalloc.cc1619 行で定義されています。

tcmalloc-0.93/tcmalloc.cc1618 行で定義されています。

tcmalloc-0.93/tcmalloc.cc1615 行で定義されています。

bool tsd_inited = false [static]

tcmalloc-0.93/tcmalloc.cc1611 行で定義されています。


Thu Oct 8 05:01:13 2009に生成されました。  doxygen 1.5.6