1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-12 06:41:13 +02:00

Rework large_object_space_alloc to also map if needed

Also fix a bug in which objects reclaimed from freelists were not
zeroed.
This commit is contained in:
Andy Wingo 2025-03-07 10:47:41 +01:00
parent 6c444b33f1
commit 5bddd522cf
4 changed files with 22 additions and 33 deletions

View file

@ -444,28 +444,21 @@ large_object_space_alloc(struct large_object_space *space, size_t npages) {
space->free_pages -= npages;
ret = (void*)node->key.addr;
memset(ret, 0, size);
break;
}
}
pthread_mutex_unlock(&space->lock);
return ret;
}
static void*
large_object_space_obtain_and_alloc(struct large_object_space *space,
size_t npages) {
size_t bytes = npages * space->page_size;
void *ret = gc_platform_acquire_memory(bytes, 0);
if (!ret)
return NULL;
// If we didn't find anything in the quarantine, get fresh pages from the OS.
if (!ret) {
ret = gc_platform_acquire_memory(size, 0);
if (ret) {
uintptr_t addr = (uintptr_t)ret;
struct large_object k = { addr, bytes };
struct large_object k = { addr, size };
struct large_object_data v = {0,};
v.is_live = 1;
v.live.mark = LARGE_OBJECT_NURSERY;
pthread_mutex_lock(&space->lock);
pthread_mutex_lock(&space->object_tree_lock);
struct large_object_node *node =
large_object_tree_insert(&space->object_tree, k, v);
@ -473,8 +466,10 @@ large_object_space_obtain_and_alloc(struct large_object_space *space,
address_map_add(&space->object_map, addr, node_bits);
space->total_pages += npages;
pthread_mutex_unlock(&space->object_tree_lock);
pthread_mutex_unlock(&space->lock);
}
}
pthread_mutex_unlock(&space->lock);
return ret;
}

View file

@ -876,8 +876,6 @@ allocate_large(struct gc_mutator *mut, size_t size) {
atomic_fetch_add(&heap->large_object_pages, npages);
void *ret = large_object_space_alloc(lospace, npages);
if (!ret)
ret = large_object_space_obtain_and_alloc(lospace, npages);
if (!ret) {
perror("weird: we have the space but mmap didn't work");

View file

@ -965,8 +965,6 @@ static void* allocate_large(struct gc_mutator *mut, size_t size) {
atomic_fetch_add(&heap->large_object_pages, npages);
void *ret = large_object_space_alloc(space, npages);
if (!ret)
ret = large_object_space_obtain_and_alloc(space, npages);
if (!ret) {
perror("weird: we have the space but mmap didn't work");

View file

@ -496,8 +496,6 @@ static void* allocate_large(struct gc_mutator *mut, size_t size) {
collect_for_large_alloc(mut, npages);
void *ret = large_object_space_alloc(space, npages);
if (!ret)
ret = large_object_space_obtain_and_alloc(space, npages);
if (!ret) {
perror("weird: we have the space but mmap didn't work");