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:
parent
4c6889b751
commit
d3383ad911
2 changed files with 14 additions and 4 deletions
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue