| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "base/allocator/allocator_shim.h" | 5 #include "base/allocator/allocator_shim.h" |
| 6 | 6 |
| 7 #include <config.h> | 7 #include <config.h> |
| 8 #include "base/allocator/allocator_extension_thunks.h" | 8 #include "base/allocator/allocator_extension_thunks.h" |
| 9 #include "base/profiler/alternate_timer.h" | 9 #include "base/profiler/alternate_timer.h" |
| 10 #include "base/sysinfo.h" | 10 #include "base/sysinfo.h" |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 58 #include "tcmalloc.cc" | 58 #include "tcmalloc.cc" |
| 59 #include "win_allocator.cc" | 59 #include "win_allocator.cc" |
| 60 | 60 |
| 61 // Forward declarations from jemalloc. | 61 // Forward declarations from jemalloc. |
| 62 extern "C" { | 62 extern "C" { |
| 63 void* je_malloc(size_t s); | 63 void* je_malloc(size_t s); |
| 64 void* je_realloc(void* p, size_t s); | 64 void* je_realloc(void* p, size_t s); |
| 65 void je_free(void* s); | 65 void je_free(void* s); |
| 66 size_t je_msize(void* p); | 66 size_t je_msize(void* p); |
| 67 bool je_malloc_init_hard(); | 67 bool je_malloc_init_hard(); |
| 68 void* je_memalign(size_t a, size_t s); |
| 68 } | 69 } |
| 69 | 70 |
| 70 extern "C" { | 71 extern "C" { |
| 71 | 72 |
| 72 // Call the new handler, if one has been set. | 73 // Call the new handler, if one has been set. |
| 73 // Returns true on successfully calling the handler, false otherwise. | 74 // Returns true on successfully calling the handler, false otherwise. |
| 74 inline bool call_new_handler(bool nothrow) { | 75 inline bool call_new_handler(bool nothrow) { |
| 75 // Get the current new handler. NB: this function is not | 76 // Get the current new handler. NB: this function is not |
| 76 // thread-safe. We make a feeble stab at making it so here, but | 77 // thread-safe. We make a feeble stab at making it so here, but |
| 77 // this lock only protects against tcmalloc interfering with | 78 // this lock only protects against tcmalloc interfering with |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 | 293 |
| 293 // The CRT heap cleanup stub. | 294 // The CRT heap cleanup stub. |
| 294 extern "C" void _heap_term() {} | 295 extern "C" void _heap_term() {} |
| 295 | 296 |
| 296 // We set this to 1 because part of the CRT uses a check of _crtheap != 0 | 297 // We set this to 1 because part of the CRT uses a check of _crtheap != 0 |
| 297 // to test whether the CRT has been initialized. Once we've ripped out | 298 // to test whether the CRT has been initialized. Once we've ripped out |
| 298 // the allocators from libcmt, we need to provide this definition so that | 299 // the allocators from libcmt, we need to provide this definition so that |
| 299 // the rest of the CRT is still usable. | 300 // the rest of the CRT is still usable. |
| 300 extern "C" void* _crtheap = reinterpret_cast<void*>(1); | 301 extern "C" void* _crtheap = reinterpret_cast<void*>(1); |
| 301 | 302 |
| 303 // Provide support for aligned memory through Windows only _aligned_malloc(). |
| 304 void* _aligned_malloc(size_t size, size_t alignment) { |
| 305 void* ptr; |
| 306 for (;;) { |
| 307 #ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
| 308 switch (allocator) { |
| 309 case JEMALLOC: |
| 310 ptr = je_memalign(alignment, size); |
| 311 break; |
| 312 case WINHEAP: |
| 313 case WINLFH: |
| 314 ptr = win_heap_memalign(alignment, size); |
| 315 break; |
| 316 case TCMALLOC: |
| 317 default: |
| 318 ptr = tc_memalign(alignment, size); |
| 319 break; |
| 320 } |
| 321 #else |
| 322 // TCMalloc case. |
| 323 ptr = tc_memalign(alignment, size); |
| 324 #endif |
| 325 if (ptr) |
| 326 return ptr; |
| 327 |
| 328 if (!new_mode || !call_new_handler(true)) |
| 329 break; |
| 330 } |
| 331 return ptr; |
| 332 } |
| 333 |
| 334 void _aligned_free(void* p) { |
| 335 #ifdef ENABLE_DYNAMIC_ALLOCATOR_SWITCHING |
| 336 switch (allocator) { |
| 337 case JEMALLOC: |
| 338 je_free(p); |
| 339 return; |
| 340 case WINHEAP: |
| 341 case WINLFH: |
| 342 win_heap_memalign_free(p); |
| 343 return; |
| 344 } |
| 345 #endif |
| 346 // TCMalloc case. |
| 347 do_free(p); |
| 348 } |
| 349 |
| 302 #endif // WIN32 | 350 #endif // WIN32 |
| 303 | 351 |
| 304 #include "generic_allocators.cc" | 352 #include "generic_allocators.cc" |
| 305 | 353 |
| 306 } // extern C | 354 } // extern C |
| 307 | 355 |
| 308 namespace base { | 356 namespace base { |
| 309 namespace allocator { | 357 namespace allocator { |
| 310 | 358 |
| 311 void SetupSubprocessAllocator() { | 359 void SetupSubprocessAllocator() { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 335 void TCMallocDoFreeForTest(void* ptr) { | 383 void TCMallocDoFreeForTest(void* ptr) { |
| 336 do_free(ptr); | 384 do_free(ptr); |
| 337 } | 385 } |
| 338 | 386 |
| 339 size_t ExcludeSpaceForMarkForTest(size_t size) { | 387 size_t ExcludeSpaceForMarkForTest(size_t size) { |
| 340 return ExcludeSpaceForMark(size); | 388 return ExcludeSpaceForMark(size); |
| 341 } | 389 } |
| 342 | 390 |
| 343 } // namespace allocator. | 391 } // namespace allocator. |
| 344 } // namespace base. | 392 } // namespace base. |
| OLD | NEW |