diff --git a/headers/private/kernel/heap.h b/headers/private/kernel/heap.h index d0c0ea3b1c..9a6dea6fc8 100644 --- a/headers/private/kernel/heap.h +++ b/headers/private/kernel/heap.h @@ -60,6 +60,7 @@ extern "C" { void* memalign_etc(size_t alignment, size_t size, uint32 flags) _ALIGNED_BY_ARG(1); +void* realloc_etc(void* address, size_t newSize, uint32 flags); void free_etc(void* address, uint32 flags); void* memalign(size_t alignment, size_t size) _ALIGNED_BY_ARG(1); diff --git a/src/system/kernel/guarded_heap.cpp b/src/system/kernel/guarded_heap.cpp index 20b1f7dc40..c4bcf60bf6 100644 --- a/src/system/kernel/guarded_heap.cpp +++ b/src/system/kernel/guarded_heap.cpp @@ -542,7 +542,7 @@ guarded_heap_free(void* address, uint32 flags) static void* -guarded_heap_realloc(void* address, size_t newSize) +guarded_heap_realloc(void* address, size_t newSize, uint32 flags) { guarded_heap_area* area = guarded_heap_get_locked_area_for(sGuardedHeap, address); @@ -562,13 +562,13 @@ guarded_heap_realloc(void* address, size_t newSize) if (oldSize == newSize) return address; - void* newBlock = malloc(newSize); + void* newBlock = malloc_etc(newSize, flags); if (newBlock == NULL) return NULL; memcpy(newBlock, address, min_c(oldSize, newSize)); - free(address); + free_etc(address, flags); return newBlock; } @@ -966,17 +966,24 @@ free(void* address) void* -realloc(void* address, size_t newSize) +realloc_etc(void* address, size_t newSize, uint32 flags) { if (newSize == 0) { - free(address); + free_etc(address, flags); return NULL; } if (address == NULL) - return malloc(newSize); + return malloc_etc(newSize, flags); - return guarded_heap_realloc(address, newSize); + return guarded_heap_realloc(address, newSize, flags); +} + + +void* +realloc(void* address, size_t newSize) +{ + return realloc_etc(address, newSize, 0); } diff --git a/src/system/kernel/heap.cpp b/src/system/kernel/heap.cpp index 7036574cce..41015e6c2e 100644 --- a/src/system/kernel/heap.cpp +++ b/src/system/kernel/heap.cpp @@ -1773,7 +1773,7 @@ heap_set_get_caller(heap_allocator* heap, addr_t (*getCaller)()) static status_t heap_realloc(heap_allocator *heap, void *address, void **newAddress, - size_t newSize) + size_t newSize, uint32 flags) { ReadLocker areaReadLocker(heap->area_lock); heap_area *area = heap->all_areas; @@ -1864,7 +1864,7 @@ heap_realloc(heap_allocator *heap, void *address, void **newAddress, #endif // if not, allocate a new chunk of memory - *newAddress = malloc(newSize); + *newAddress = malloc_etc(newSize, flags); T(Reallocate((addr_t)address, (addr_t)*newAddress, newSize)); if (*newAddress == NULL) { // we tried but it didn't work out, but still the operation is done @@ -2402,7 +2402,7 @@ free(void *address) void * -realloc(void *address, size_t newSize) +realloc_etc(void *address, size_t newSize, uint32 flags) { if (!gKernelStartup && !are_interrupts_enabled()) { panic("realloc(): called with interrupts disabled\n"); @@ -2410,10 +2410,10 @@ realloc(void *address, size_t newSize) } if (address == NULL) - return malloc(newSize); + return malloc_etc(newSize, flags); if (newSize == 0) { - free(address); + free_etc(address, flags); return NULL; } @@ -2421,7 +2421,7 @@ realloc(void *address, size_t newSize) int32 offset = smp_get_current_cpu() * HEAP_CLASS_COUNT; for (uint32 i = 0; i < sHeapCount; i++) { heap_allocator *heap = sHeaps[(i + offset) % sHeapCount]; - if (heap_realloc(heap, address, &newAddress, newSize) == B_OK) { + if (heap_realloc(heap, address, &newAddress, newSize, flags) == B_OK) { #if PARANOID_HEAP_VALIDATION heap_validate_heap(heap); #endif @@ -2430,7 +2430,7 @@ realloc(void *address, size_t newSize) } // maybe it was allocated from the dedicated grow heap - if (heap_realloc(sGrowHeap, address, &newAddress, newSize) == B_OK) + if (heap_realloc(sGrowHeap, address, &newAddress, newSize, flags) == B_OK) return newAddress; // or maybe it was a huge allocation using an area @@ -2476,6 +2476,13 @@ realloc(void *address, size_t newSize) } +void * +realloc(void *address, size_t newSize) +{ + return realloc_etc(address, newSize, 0); +} + + #endif // USE_DEBUG_HEAP_FOR_MALLOC diff --git a/src/system/kernel/slab/allocator.cpp b/src/system/kernel/slab/allocator.cpp index 5141439e42..cdcbc62546 100644 --- a/src/system/kernel/slab/allocator.cpp +++ b/src/system/kernel/slab/allocator.cpp @@ -256,15 +256,15 @@ free(void* address) void* -realloc(void* address, size_t newSize) +realloc_etc(void* address, size_t newSize, uint32 flags) { if (newSize == 0) { - block_free(address, 0); + block_free(address, flags); return NULL; } if (address == NULL) - return block_alloc(newSize, 0, 0); + return block_alloc(newSize, 0, flags); size_t oldSize; ObjectCache* cache = MemoryManager::GetAllocationInfo(address, oldSize); @@ -276,18 +276,25 @@ realloc(void* address, size_t newSize) if (oldSize == newSize) return address; - void* newBlock = block_alloc(newSize, 0, 0); + void* newBlock = block_alloc(newSize, 0, flags); if (newBlock == NULL) return NULL; memcpy(newBlock, address, std::min(oldSize, newSize)); - block_free(address, 0); + block_free(address, flags); return newBlock; } +void* +realloc(void* address, size_t newSize) +{ + return realloc_etc(address, newSize, 0); +} + + #endif // USE_SLAB_ALLOCATOR_FOR_MALLOC diff --git a/src/system/kernel/vm/vm.cpp b/src/system/kernel/vm/vm.cpp index 348c3af458..1a201ff5c4 100644 --- a/src/system/kernel/vm/vm.cpp +++ b/src/system/kernel/vm/vm.cpp @@ -541,8 +541,7 @@ realloc_page_protections(uint8* pageProtections, size_t areaSize, uint32 allocationFlags) { size_t bytes = area_page_protections_size(areaSize); - // TODO: Implement realloc_etc and pass allocationFlags. - return (uint8*)realloc(pageProtections, bytes); + return (uint8*)realloc_etc(pageProtections, bytes, allocationFlags); }