Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68166
  • 博文数量: 19
  • 博客积分: 425
  • 博客等级: 下士
  • 技术积分: 239
  • 用 户 组: 普通用户
  • 注册时间: 2011-10-08 15:35
文章分类

全部博文(19)

文章存档

2012年(2)

2011年(17)

我的朋友

分类: LINUX

2011-10-08 16:07:42

解释到这里基本完成了sizemalloc过程,下面我们继续回到do_malloc分析当size>=kMaxSize的情况,这时候do_malloc调用do_malloc_pages函数。do_malloc_pages首先将size通过tcmalloc::pages转换为num_pages。然后再通过num_pages获取需要分配的size,这里面和do_malloc一样都需要判断是否需要sample,我们继续看非sample的情况。

inline void* do_malloc_pages(ThreadCache* heap, size_t size) {

  void* result;

  bool report_large;

 

  Length num_pages = tcmalloc::pages(size);

  size = num_pages << kPageShift;

 

  if ((FLAGS_tcmalloc_sample_parameter > 0) && heap->SampleAllocation(size)) {

    result = DoSampledAllocation(size);

 

    SpinLockHolder h(Static::pageheap_lock());

    report_large = should_report_large(num_pages);

  } else {

    SpinLockHolder h(Static::pageheap_lock());

    Span* span = Static::pageheap()->New(num_pages);

    result = (span == NULL ? NULL : SpanToMallocResult(span));

    report_large = should_report_large(num_pages);

  }

  if (report_large) {

    ReportLargeAlloc(num_pages, result);

  }

  return result;

}

在非sample的情况下,首先获取pageheaplock,然后通过调用Static::pageheap()->Newnum_pages的空间。

DoSampledAllocation函数比较简单,主要是通过GetStackTrace获取一个StackTrace然后调用Static::pageheap()->New来分配内存,只是在最后将分配出来的span加入sampled_objects中。

static void* DoSampledAllocation(size_t size) {

  // Grab the stack trace outside the heap lock

  StackTrace tmp;

  tmp.depth = GetStackTrace(tmp.stack, tcmalloc::kMaxStackDepth, 1);

  tmp.size = size;

 

  SpinLockHolder h(Static::pageheap_lock());

  // Allocate span

  Span *span = Static::pageheap()->New(tcmalloc::pages(size == 0 ? 1 : size));

  if (span == NULL) {

    return NULL;

  }

 

  // Allocate stack trace

  StackTrace *stack = Static::stacktrace_allocator()->New();

  if (stack == NULL) {

    // Sampling failed because of lack of memory

    return span;

  }

 

  *stack = tmp;

  span->sample = 1;

  span->objects = stack;

  tcmalloc::DLL_Prepend(Static::sampled_objects(), span);

 

  return SpanToMallocResult(span);

}

 

阅读(886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~