void* TCMalloc_SystemAlloc(size_t size, size_t *actual_size, size_t alignment) { // Discard requests that overflow if (size + alignment < size) return NULL; SpinLockHolder lock_holder(&spinlock); // Enforce minimum alignment if (alignment < sizeof(MemoryAligner)) alignment = sizeof(MemoryAligner); // Try twice, once avoiding allocators that failed before, and once // more trying all allocators even if they failed before. for (int i = 0; i < 2; i++) { #ifndef WTF_CHANGES if (use_devmem && !devmem_failure) { void* result = TryDevMem(size, actual_size, alignment); if (result != NULL) return result; } #endif #if HAVE(SBRK) if (use_sbrk && !sbrk_failure) { void* result = TrySbrk(size, actual_size, alignment); if (result != NULL) return result; } #endif #if HAVE(MMAP) if (use_mmap && !mmap_failure) { void* result = TryMmap(size, actual_size, alignment); if (result != NULL) return result; } #endif #if HAVE(VIRTUALALLOC) if (use_VirtualAlloc && !VirtualAlloc_failure) { void* result = TryVirtualAlloc(size, actual_size, alignment); if (result != NULL) return result; } #endif // nothing worked - reset failure flags and try again devmem_failure = false; sbrk_failure = false; mmap_failure = false; VirtualAlloc_failure = false; } return NULL; }
void* TCMalloc_SystemAlloc(size_t size, size_t alignment) { #ifndef WTF_CHANGES if (TCMallocDebug::level >= TCMallocDebug::kVerbose) { MESSAGE("TCMalloc_SystemAlloc(%" PRIuS ", %" PRIuS")\n", size, alignment); } #endif SpinLockHolder lock_holder(&spinlock); // Enforce minimum alignment if (alignment < sizeof(MemoryAligner)) alignment = sizeof(MemoryAligner); // Try twice, once avoiding allocators that failed before, and once // more trying all allocators even if they failed before. for (int i = 0; i < 2; i++) { #ifndef WTF_CHANGES if (use_devmem && !devmem_failure) { void* result = TryDevMem(size, alignment); if (result != NULL) return result; } #endif #if HAVE(SBRK) if (use_sbrk && !sbrk_failure) { void* result = TrySbrk(size, alignment); if (result != NULL) return result; } #endif #if HAVE(MMAP) if (use_mmap && !mmap_failure) { void* result = TryMmap(size, alignment); if (result != NULL) return result; } #endif // nothing worked - reset failure flags and try again devmem_failure = false; sbrk_failure = false; mmap_failure = false; } return NULL; }