1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-09 21:40:33 +02:00

Bulk-zero copy-space blocks

This commit is contained in:
Andy Wingo 2024-08-05 11:48:25 +02:00
parent 4c6889b751
commit d3383ad911
2 changed files with 14 additions and 4 deletions

View file

@ -40,7 +40,7 @@ static inline uint8_t gc_allocator_alloc_table_end_pattern(void) {
} }
static inline int gc_allocator_needs_clear(void) { static inline int gc_allocator_needs_clear(void) {
return 1; return 0;
} }
static inline enum gc_write_barrier_kind gc_write_barrier_kind(size_t obj_size) { static inline enum gc_write_barrier_kind gc_write_barrier_kind(size_t obj_size) {

View file

@ -51,6 +51,7 @@ struct copy_space_block {
struct { struct {
struct copy_space_block *next; struct copy_space_block *next;
uint8_t in_core; uint8_t in_core;
uint8_t all_zeroes[2];
size_t allocated; // For partly-empty blocks. size_t allocated; // For partly-empty blocks.
}; };
uint8_t padding[COPY_SPACE_HEADER_BYTES_PER_BLOCK]; uint8_t padding[COPY_SPACE_HEADER_BYTES_PER_BLOCK];
@ -203,6 +204,7 @@ static void
copy_space_page_out_block(struct copy_space *space, copy_space_page_out_block(struct copy_space *space,
struct copy_space_block *block) { struct copy_space_block *block) {
block->in_core = 0; block->in_core = 0;
block->all_zeroes[0] = block->all_zeroes[1] = 1;
madvise(copy_space_block_payload(block), COPY_SPACE_BLOCK_SIZE, MADV_DONTNEED); madvise(copy_space_block_payload(block), COPY_SPACE_BLOCK_SIZE, MADV_DONTNEED);
copy_space_push_paged_out_block(space, block); copy_space_push_paged_out_block(space, block);
} }
@ -270,9 +272,16 @@ copy_space_allocator_acquire_block(struct copy_space_allocator *alloc,
static int static int
copy_space_allocator_acquire_empty_block(struct copy_space_allocator *alloc, copy_space_allocator_acquire_empty_block(struct copy_space_allocator *alloc,
struct copy_space *space) { struct copy_space *space) {
return copy_space_allocator_acquire_block(alloc, if (copy_space_allocator_acquire_block(alloc,
copy_space_pop_empty_block(space), copy_space_pop_empty_block(space),
space->active_region); space->active_region)) {
if (alloc->block->all_zeroes[space->active_region])
alloc->block->all_zeroes[space->active_region] = 0;
else
memset((char*)alloc->hp, 0, COPY_SPACE_REGION_SIZE);
return 1;
}
return 0;
} }
static int static int
@ -550,6 +559,7 @@ copy_space_init(struct copy_space *space, size_t size) {
for (size_t slab = 0; slab < nslabs; slab++) { for (size_t slab = 0; slab < nslabs; slab++) {
for (size_t idx = 0; idx < COPY_SPACE_NONHEADER_BLOCKS_PER_SLAB; idx++) { for (size_t idx = 0; idx < COPY_SPACE_NONHEADER_BLOCKS_PER_SLAB; idx++) {
struct copy_space_block *block = &slabs[slab].headers[idx]; struct copy_space_block *block = &slabs[slab].headers[idx];
block->all_zeroes[0] = block->all_zeroes[1] = 1;
if (reserved > size) { if (reserved > size) {
block->in_core = 0; block->in_core = 0;
copy_space_push_paged_out_block(space, block); copy_space_push_paged_out_block(space, block);