| 963 | } |
| 964 | |
| 965 | static void* DoSampledAllocation(size_t size) { |
| 966 | // Grab the stack trace outside the heap lock |
| 967 | tcmalloc::StackTrace tmp; |
| 968 | tmp.depth = GetStackTrace(tmp.stack, tcmalloc::kMaxStackDepth, 1); |
| 969 | tmp.size = size; |
| 970 | |
| 971 | SpinLockHolder h(Static::pageheap_lock()); |
| 972 | // Allocate span |
| 973 | Span *span = Static::pageheap()->New(tcmalloc::pages(size == 0 ? 1 : size)); |
| 974 | if (UNLIKELY(span == NULL)) { |
| 975 | return NULL; |
| 976 | } |
| 977 | |
| 978 | // Allocate stack trace |
| 979 | tcmalloc::StackTrace *stack = Static::stacktrace_allocator()->New(); |
| 980 | if (UNLIKELY(stack == NULL)) { |
| 981 | // Sampling failed because of lack of memory |
| 982 | return span; |
| 983 | } |
| 984 | *stack = tmp; |
| 985 | span->sample = 1; |
| 986 | span->objects = stack; |
| 987 | tcmalloc::DLL_Prepend(Static::sampled_objects(), span); |
| 988 | |
| 989 | return SpanToMallocResult(span); |
| 990 | } |
| 991 | |
| 992 | namespace { |
| 993 |
no test coverage detected