Index: base/allocator/allocator_shim.cc |
diff --git a/base/allocator/allocator_shim.cc b/base/allocator/allocator_shim.cc |
index bad8fc6e281e2789841ae9edb6a844f9bc1df946..4de1a8b3b9e368730337a8a1378772ebae38d33a 100644 |
--- a/base/allocator/allocator_shim.cc |
+++ b/base/allocator/allocator_shim.cc |
@@ -21,6 +21,10 @@ |
#include "base/allocator/winheap_stubs_win.h" |
#endif |
+#if defined(OS_MACOSX) |
+#include <malloc/malloc.h> |
+#endif |
+ |
// No calls to malloc / new in this file. They would would cause re-entrancy of |
// the shim, which is hard to deal with. Keep this code as simple as possible |
// and don't use any external C++ object here, not even //base ones. Even if |
@@ -96,7 +100,7 @@ void SetCallNewHandlerOnMallocFailure(bool value) { |
void* UncheckedAlloc(size_t size) { |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
- return chain_head->alloc_function(chain_head, size); |
+ return chain_head->alloc_function(chain_head, size, nullptr); |
} |
void InsertAllocatorDispatch(AllocatorDispatch* dispatch) { |
@@ -158,53 +162,63 @@ void* ShimCppNew(size_t size) { |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
void* ptr; |
do { |
- ptr = chain_head->alloc_function(chain_head, size); |
+ void* context = nullptr; |
+#if defined(OS_MACOSX) |
+ context = malloc_default_zone(); |
+#endif |
+ ptr = chain_head->alloc_function(chain_head, size, context); |
} while (!ptr && CallNewHandler(size)); |
return ptr; |
} |
void ShimCppDelete(void* address) { |
+ void* context = nullptr; |
+#if defined(OS_MACOSX) |
+ context = malloc_default_zone(); |
+#endif |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
- return chain_head->free_function(chain_head, address); |
+ return chain_head->free_function(chain_head, address, context); |
} |
-void* ShimMalloc(size_t size) { |
+void* ShimMalloc(size_t size, void* context) { |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
void* ptr; |
do { |
- ptr = chain_head->alloc_function(chain_head, size); |
+ ptr = chain_head->alloc_function(chain_head, size, context); |
} while (!ptr && g_call_new_handler_on_malloc_failure && |
CallNewHandler(size)); |
return ptr; |
} |
-void* ShimCalloc(size_t n, size_t size) { |
+void* ShimCalloc(size_t n, size_t size, void* context) { |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
void* ptr; |
do { |
- ptr = chain_head->alloc_zero_initialized_function(chain_head, n, size); |
+ ptr = chain_head->alloc_zero_initialized_function(chain_head, n, size, |
+ context); |
} while (!ptr && g_call_new_handler_on_malloc_failure && |
CallNewHandler(size)); |
return ptr; |
} |
-void* ShimRealloc(void* address, size_t size) { |
+void* ShimRealloc(void* address, size_t size, void* context) { |
// realloc(size == 0) means free() and might return a nullptr. We should |
// not call the std::new_handler in that case, though. |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
void* ptr; |
do { |
- ptr = chain_head->realloc_function(chain_head, address, size); |
+ ptr = chain_head->realloc_function(chain_head, address, size, context); |
} while (!ptr && size && g_call_new_handler_on_malloc_failure && |
CallNewHandler(size)); |
return ptr; |
} |
-void* ShimMemalign(size_t alignment, size_t size) { |
+void* ShimMemalign(size_t alignment, size_t size, void* context) { |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
void* ptr; |
do { |
- ptr = chain_head->alloc_aligned_function(chain_head, alignment, size); |
+ ptr = chain_head->alloc_aligned_function(chain_head, alignment, size, |
+ context); |
} while (!ptr && g_call_new_handler_on_malloc_failure && |
CallNewHandler(size)); |
return ptr; |
@@ -217,13 +231,13 @@ int ShimPosixMemalign(void** res, size_t alignment, size_t size) { |
((alignment & (alignment - 1)) != 0) || (alignment == 0)) { |
return EINVAL; |
} |
- void* ptr = ShimMemalign(alignment, size); |
+ void* ptr = ShimMemalign(alignment, size, nullptr); |
*res = ptr; |
return ptr ? 0 : ENOMEM; |
} |
-void* ShimValloc(size_t size) { |
- return ShimMemalign(GetCachedPageSize(), size); |
+void* ShimValloc(size_t size, void* context) { |
+ return ShimMemalign(GetCachedPageSize(), size, context); |
} |
void* ShimPvalloc(size_t size) { |
@@ -233,35 +247,41 @@ void* ShimPvalloc(size_t size) { |
} else { |
size = (size + GetCachedPageSize() - 1) & ~(GetCachedPageSize() - 1); |
} |
- return ShimMemalign(GetCachedPageSize(), size); |
+ return ShimMemalign(GetCachedPageSize(), size, nullptr); |
Primiano Tucci (use gerrit)
2017/02/20 10:33:05
add a comment saying that this is nullptr because
|
} |
-void ShimFree(void* address) { |
+void ShimFree(void* address, void* context) { |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
- return chain_head->free_function(chain_head, address); |
+ return chain_head->free_function(chain_head, address, context); |
} |
-size_t ShimGetSizeEstimate(const void* address) { |
+size_t ShimGetSizeEstimate(const void* address, void* context) { |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
- return chain_head->get_size_estimate_function(chain_head, |
- const_cast<void*>(address)); |
+ return chain_head->get_size_estimate_function( |
+ chain_head, const_cast<void*>(address), context); |
} |
-unsigned ShimBatchMalloc(size_t size, void** results, unsigned num_requested) { |
+unsigned ShimBatchMalloc(size_t size, |
+ void** results, |
+ unsigned num_requested, |
+ void* context) { |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
return chain_head->batch_malloc_function(chain_head, size, results, |
- num_requested); |
+ num_requested, context); |
} |
-void ShimBatchFree(void** to_be_freed, unsigned num_to_be_freed) { |
+void ShimBatchFree(void** to_be_freed, |
+ unsigned num_to_be_freed, |
+ void* context) { |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
return chain_head->batch_free_function(chain_head, to_be_freed, |
- num_to_be_freed); |
+ num_to_be_freed, context); |
} |
-void ShimFreeDefiniteSize(void* ptr, size_t size) { |
+void ShimFreeDefiniteSize(void* ptr, size_t size, void* context) { |
const allocator::AllocatorDispatch* const chain_head = GetChainHead(); |
- return chain_head->free_definite_size_function(chain_head, ptr, size); |
+ return chain_head->free_definite_size_function(chain_head, ptr, size, |
+ context); |
} |
} // extern "C" |