tcmalloc.cc

#include "config.h"
#include <new>
#include <stdio.h>
#include <stddef.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <errno.h>
#include <stdarg.h>
#include "base/commandlineflags.h"
#include "google/malloc_hook.h"
#include "google/malloc_extension.h"
#include "internal_logging.h"
#include "internal_spinlock.h"
#include "pagemap.h"
#include "system-alloc.h"
#include "maybe_threads.h"
#include <inttypes.h>

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

ソースコードを見る。

構成

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

マクロ定義

#define __STDC_FORMAT_MACROS
#define LLU   PRIu64
#define Event(s, o, v)   ((void) 0)
#define pageheap   ((TCMalloc_PageHeap*) pageheap_memory)
#define OP_THROWNOTHING
#define OP_THROWBADALLOC

型定義

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")
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 void DLL_InsertOrdered (Span *list, Span *span)
static void RecordGrowth (size_t growth)
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 void * do_malloc (size_t size)
static void do_free (void *ptr)
static void * do_memalign (size_t align, size_t size)
void * malloc (size_t size)
void free (void *ptr)
void * calloc (size_t n, size_t elem_size)
void cfree (void *ptr)
void * realloc (void *old_ptr, size_t new_size)
static void * cpp_alloc (size_t size, bool nothrow)
void * operator new (size_t size) OP_THROWBADALLOC
void * operator new (size_t size, const std::nothrow_t &) OP_THROWNOTHING
void operator delete (void *p) OP_THROWNOTHING
void operator delete (void *p, const std::nothrow_t &) OP_THROWNOTHING
void * operator new[] (size_t size) OP_THROWBADALLOC
void * operator new[] (size_t size, const std::nothrow_t &) OP_THROWNOTHING
void operator delete[] (void *p) OP_THROWNOTHING
void operator delete[] (void *p, const std::nothrow_t &) OP_THROWNOTHING
void * memalign (size_t align, size_t size)
int posix_memalign (void **result_ptr, size_t align, size_t size)
void * valloc (size_t size)
void * pvalloc (size_t size)
void malloc_stats (void)
int mallopt (int cmd, int value)
void * __libc_malloc (size_t size)
void __libc_free (void *ptr)
void * __libc_realloc (void *ptr, size_t size)
void * __libc_calloc (size_t n, size_t size)
void __libc_cfree (void *ptr)
void * __libc_memalign (size_t align, size_t s)
void * __libc_valloc (size_t size)
void * __libc_pvalloc (size_t size)
int __posix_memalign (void **r, size_t a, size_t s)
static void * MemalignOverride (size_t align, size_t size, const void *caller)

変数

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 = 170
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_INITIALIZER
static const int kSizeBits = 8 * sizeof(size_t)
static unsigned char size_base [kSizeBits]
static unsigned char size_shift [kSizeBits]
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 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_INITIALIZER
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_INITIALIZER
static size_t pagesize = 0
void *(* __memalign_hook )(size_t, size_t, const void *) = MemalignOverride


マクロ定義

#define __STDC_FORMAT_MACROS

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

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

#define LLU   PRIu64

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

参照元 DumpStats().

#define OP_THROWBADALLOC

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

#define OP_THROWNOTHING

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

#define pageheap   ((TCMalloc_PageHeap*) pageheap_memory)


型定義

typedef uintptr_t Length

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

typedef uintptr_t PageID

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


関数

void* __libc_calloc ( size_t  n,
size_t  size 
)

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

参照先 calloc().

void __libc_cfree ( void *  ptr  ) 

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

参照先 cfree().

void __libc_free ( void *  ptr  ) 

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

参照先 free().

void* __libc_malloc ( size_t  size  ) 

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

参照先 malloc().

void* __libc_memalign ( size_t  align,
size_t  s 
)

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

参照先 memalign().

void* __libc_pvalloc ( size_t  size  ) 

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

参照先 pvalloc().

void* __libc_realloc ( void *  ptr,
size_t  size 
)

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

参照先 realloc().

void* __libc_valloc ( size_t  size  ) 

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

参照先 valloc().

int __posix_memalign ( void **  r,
size_t  a,
size_t  s 
)

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

参照先 posix_memalign().

static size_t AllocationSize ( size_t  bytes  )  [static]

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

参照先 ByteSizeForClass(), kMaxSize, kPageShift, pages(), と SizeClass().

参照元 realloc().

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

void * calloc ( size_t  n,
size_t  elem_size 
)

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

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

参照元 __libc_calloc().

void cfree ( void *  ptr  ) 

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

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

参照元 __libc_cfree().

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

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

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

参照元 operator new(), と operator new[]().

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.8/tcmalloc.cc567 行で定義されています。

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

参照元 TCMalloc_PageHeap::Delete().

static void DLL_Init ( Span list  )  [static]

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

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

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

参照元 TCMalloc_PageHeap::Carve(), と TCMalloc_PageHeap::Delete().

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

static int DLL_Length ( const Span list  )  [static]

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

参照先 Span::next.

参照元 TCMalloc_PageHeap::Dump().

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

static void DLL_Remove ( Span span  )  [static]

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

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

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

static Span* DoSampledAllocation ( size_t  size  )  [static]

static void** DumpHeapGrowthStackTraces (  )  [static]

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]

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

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

参照先 ASSERT.

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

void * malloc ( size_t  size  ) 

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

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

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

void malloc_stats ( void   ) 

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

参照先 PrintStats().

int mallopt ( int  cmd,
int  value 
)

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

void * memalign ( size_t  align,
size_t  size 
)

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

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

参照元 __libc_memalign().

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

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

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

static void* MetaDataAlloc ( size_t  bytes  )  [static]

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

参照先 metadata_system_bytes, と TCMalloc_SystemAlloc().

参照元 PageHeapAllocator< T >::New().

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

static int NumMoveSize ( size_t  size  )  [static]

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

参照先 kMaxFreeListLength.

参照元 InitSizeClasses().

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.8/tcmalloc.cc506 行で定義されています。

参照先 kPageShift, と kPageSize.

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

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

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

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

参照元 __posix_memalign().

static void PrintStats ( int  level  )  [static]

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

参照先 DumpStats().

参照元 do_malloc_stats(), malloc_stats(), と TCMallocGuard::~TCMallocGuard().

void * pvalloc ( size_t  size  ) 

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

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

参照元 __libc_pvalloc().

void * realloc ( void *  old_ptr,
size_t  new_size 
)

static void RecordGrowth ( size_t  growth  )  [static]

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

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

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

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

参照先 SLL_Next().

参照元 TCMalloc_ThreadCache_FreeList::Pop().

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

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

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

参照元 TCMalloc_ThreadCache_FreeList::PopRange().

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

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

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

参照先 SLL_SetNext().

参照元 TCMalloc_ThreadCache_FreeList::PushRange().

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

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

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

参照先 SLL_Next().

void * valloc ( size_t  size  ) 

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

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

参照元 __libc_valloc().


変数

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

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

size_t class_to_pages[kNumClasses] [static]

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

参照元 InitSizeClasses(), と TCMalloc_Central_FreeList::Populate().

size_t class_to_size[kNumClasses] [static]

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

参照元 ByteSizeForClass(), do_memalign(), と InitSizeClasses().

StackTrace* growth_stacks = NULL [static]

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

参照元 DumpHeapGrowthStackTraces().

pthread_key_t heap_key [static]

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

const size_t kAlignment = 1 << kAlignShift [static]

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

参照元 InitSizeClasses().

const size_t kAlignShift = 3 [static]

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

参照元 InitSizeClasses().

const size_t kDefaultOverallThreadCacheSize = 16 << 20 [static]

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

const int kMaxFreeListLength = 256 [static]

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

参照元 TCMalloc_ThreadCache::Deallocate(), と NumMoveSize().

const size_t kMaxPages = kMinSystemAlloc [static]

const size_t kMaxSize = 8u * kPageSize [static]

const int kMaxStackDepth = 31 [static]

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

参照元 DumpHeapGrowthStackTraces().

const size_t kMaxThreadCacheSize = 2 << 20 [static]

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

参照元 TCMalloc_ThreadCache::RecomputeThreadCacheSize().

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

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

参照元 TCMalloc_PageHeap::GrowHeap().

const size_t kMinThreadCacheSize = kMaxSize * 2 [static]

const size_t kNumClasses = 170 [static]

const int kNumTransferEntries = kNumClasses [static]

const size_t kPageMapBigAllocationThreshold = 128 << 20 [static]

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

参照元 TCMalloc_PageHeap::GrowHeap().

const size_t kPageShift = 12 [static]

const size_t kPageSize = 1 << kPageShift [static]

const int kSizeBits = 8 * sizeof(size_t) [static]

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

uint64_t metadata_system_bytes = 0 [static]

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

参照元 ExtractStats(), と MetaDataAlloc().

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

SpinLock pageheap_lock = SPINLOCK_INITIALIZER [static]

char pageheap_memory[sizeof(TCMalloc_PageHeap)] [static]

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

参照元 TCMalloc_ThreadCache::InitModule().

size_t pagesize = 0 [static]

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

volatile size_t per_thread_cache_size = kMaxThreadCacheSize [static]

bool phinited = false [static]

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

参照元 TCMalloc_ThreadCache::InitModule().

unsigned int primes_list[] [static]

初期値:

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

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

参照元 TCMalloc_ThreadCache::PickNextSample().

size_t sample_period = 262147 [static]

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

参照元 TCMalloc_ThreadCache::PickNextSample().

SpinLock sample_period_lock = SPINLOCK_INITIALIZER [static]

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

参照元 TCMalloc_ThreadCache::PickNextSample().

SpinLock set_new_handler_lock = SPINLOCK_INITIALIZER [static]

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

参照元 cpp_alloc().

unsigned char size_base[kSizeBits] [static]

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

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

unsigned char size_shift[kSizeBits] [static]

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

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

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

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

参照元 do_free(), DoSampledAllocation(), と TCMalloc_ThreadCache::InitModule().

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

int thread_heap_count = 0 [static]

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

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

bool tsd_inited = false [static]


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