Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions darray.h
Original file line number Diff line number Diff line change
Expand Up @@ -161,14 +161,12 @@ rb_darray_free(void *ary)
xfree(ary);
}

void ruby_sized_xfree(void *x, size_t size);

static inline void
rb_darray_free_sized0(void *ary, size_t element_size)
{
const rb_darray_meta_t *meta = ary;
if (meta) {
ruby_sized_xfree(ary, sizeof(*meta) + (element_size * meta->capa));
ruby_xfree_sized(ary, sizeof(*meta) + (element_size * meta->capa));
}
}
#define rb_darray_free_sized(ary, T) rb_darray_free_sized0((ary), sizeof(T))
Expand Down Expand Up @@ -203,7 +201,7 @@ rb_darray_calloc_mul_add_without_gc(size_t x, size_t y, size_t z)
return ptr;
}

void *ruby_sized_xrealloc(void *ptr, size_t new_size, size_t old_size);
void *ruby_xrealloc_sized(void *ptr, size_t new_size, size_t old_size);

/* Internal function. Like rb_xrealloc_mul_add. */
static inline void *
Expand All @@ -212,7 +210,7 @@ rb_darray_realloc_mul_add(void *orig_ptr, size_t capa, size_t element_size, size
size_t size = rbimpl_size_add_or_raise(rbimpl_size_mul_or_raise(capa, element_size), header_size);
size_t old_size = (rb_darray_capa(orig_ptr) * element_size) + header_size; // We know it won't overflow

void *ptr = ruby_sized_xrealloc(orig_ptr, size, old_size);
void *ptr = ruby_xrealloc_sized(orig_ptr, size, old_size);
RUBY_ASSERT(ptr != NULL);

return ptr;
Expand Down
19 changes: 13 additions & 6 deletions gc/mmtk/mmtk.c
Original file line number Diff line number Diff line change
Expand Up @@ -635,22 +635,29 @@ void rb_gc_impl_set_params(void *objspace_ptr) { }

static VALUE gc_verify_internal_consistency(VALUE self) { return Qnil; }

#define MMTK_HEAP_COUNT 6
#define MMTK_MAX_OBJ_SIZE 640

#if SIZEOF_VALUE >= 8
#define MMTK_HEAP_COUNT 12
#define MMTK_MAX_OBJ_SIZE 1024
static size_t heap_sizes[MMTK_HEAP_COUNT + 1] = {
32, 40, 80, 160, 320, MMTK_MAX_OBJ_SIZE, 0
32, 40, 64, 80, 96, 128, 160, 256, 512, 640, 768, MMTK_MAX_OBJ_SIZE, 0
};
#else
#define MMTK_HEAP_COUNT 5
#define MMTK_MAX_OBJ_SIZE 512
static size_t heap_sizes[MMTK_HEAP_COUNT + 1] = {
32, 64, 128, 256, MMTK_MAX_OBJ_SIZE, 0
};
#endif

void
rb_gc_impl_init(void)
{
VALUE gc_constants = rb_hash_new();
rb_hash_aset(gc_constants, ID2SYM(rb_intern("RVALUE_SIZE")), SIZET2NUM(SIZEOF_VALUE >= 8 ? 64 : 32));
rb_hash_aset(gc_constants, ID2SYM(rb_intern("RBASIC_SIZE")), SIZET2NUM(sizeof(struct RBasic)));
rb_hash_aset(gc_constants, ID2SYM(rb_intern("RVALUE_OVERHEAD")), INT2NUM(0));
rb_hash_aset(gc_constants, ID2SYM(rb_intern("RVARGC_MAX_ALLOCATE_SIZE")), LONG2FIX(MMTK_MAX_OBJ_SIZE));
// Pretend we have 5 size pools
rb_hash_aset(gc_constants, ID2SYM(rb_intern("SIZE_POOL_COUNT")), LONG2FIX(MMTK_HEAP_COUNT));
rb_hash_aset(gc_constants, ID2SYM(rb_intern("HEAP_COUNT")), LONG2FIX(MMTK_HEAP_COUNT));
// TODO: correctly set RVALUE_OLD_AGE when we have generational GC support
rb_hash_aset(gc_constants, ID2SYM(rb_intern("RVALUE_OLD_AGE")), INT2FIX(0));
OBJ_FREEZE(gc_constants);
Expand Down
1 change: 0 additions & 1 deletion test/.excludes-mmtk/TestObjSpace.rb
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
exclude(:test_dump_all_full, "testing behaviour specific to default GC")
exclude(:test_dump_flag_age, "testing behaviour specific to default GC")
exclude(:test_dump_flags, "testing behaviour specific to default GC")
exclude(:test_dump_includes_slot_size, "can be removed when pool 0 slot size is 32 bytes")
exclude(:test_dump_objects_dumps_page_slot_sizes, "testing behaviour specific to default GC")
Loading