kernel: Implement realloc_etc and make use of it.

This commit is contained in:
Augustin Cavalier 2023-06-19 16:33:22 -04:00
parent f96456d863
commit 70e8eacb35
5 changed files with 42 additions and 21 deletions

View File

@ -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);

View File

@ -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);
}

View File

@ -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

View File

@ -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

View File

@ -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);
}