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:
parent
6c444b33f1
commit
5bddd522cf
4 changed files with 22 additions and 33 deletions
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -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");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue