Skip to content

Commit 331b616

Browse files
committed
Use Immix as non moving space
1 parent 890c002 commit 331b616

File tree

1 file changed

+50
-4
lines changed

1 file changed

+50
-4
lines changed

src/gc-mmtk.c

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,6 +1095,7 @@ JL_DLLEXPORT int* jl_gc_get_have_pending_finalizers(void) {
10951095
// ========================================================================= //
10961096

10971097
#define MMTK_DEFAULT_IMMIX_ALLOCATOR (0)
1098+
#define MMTK_NONMOVING_ALLOCATOR (1)
10981099
#define MMTK_IMMORTAL_BUMP_ALLOCATOR (0)
10991100

11001101
int jl_gc_classify_pools(size_t sz, int *osize)
@@ -1149,6 +1150,17 @@ STATIC_INLINE void mmtk_immix_post_alloc_fast(MMTkMutatorContext* mutator, void*
11491150
}
11501151
}
11511152

1153+
STATIC_INLINE void* mmtk_nonmoving_alloc_fast(MMTkMutatorContext* mutator, size_t size, size_t align, size_t offset) {
1154+
ImmixAllocator* allocator = &mutator->allocators.immix[MMTK_NONMOVING_ALLOCATOR];
1155+
return bump_alloc_fast(mutator, (uintptr_t*)&allocator->cursor, (intptr_t)allocator->limit, size, align, offset, 6);
1156+
}
1157+
1158+
STATIC_INLINE void mmtk_nonmoving_post_alloc_fast(MMTkMutatorContext* mutator, void* obj, size_t size) {
1159+
if (MMTK_NEEDS_VO_BIT) {
1160+
mmtk_set_side_metadata(MMTK_SIDE_VO_BIT_BASE_ADDRESS, obj);
1161+
}
1162+
}
1163+
11521164
STATIC_INLINE void* mmtk_immortal_alloc_fast(MMTkMutatorContext* mutator, size_t size, size_t align, size_t offset) {
11531165
BumpAllocator* allocator = &mutator->allocators.bump_pointer[MMTK_IMMORTAL_BUMP_ALLOCATOR];
11541166
return bump_alloc_fast(mutator, (uintptr_t*)&allocator->cursor, (uintptr_t)allocator->limit, size, align, offset, 1);
@@ -1186,6 +1198,32 @@ JL_DLLEXPORT jl_value_t *jl_mmtk_gc_alloc_default(jl_ptls_t ptls, int osize, siz
11861198
return v;
11871199
}
11881200

1201+
JL_DLLEXPORT jl_value_t *jl_mmtk_gc_alloc_nonmoving(jl_ptls_t ptls, int osize, size_t align, void *ty)
1202+
{
1203+
// safepoint
1204+
jl_gc_safepoint_(ptls);
1205+
1206+
jl_value_t *v;
1207+
if ((uintptr_t)ty != jl_buff_tag) {
1208+
// v needs to be 16 byte aligned, therefore v_tagged needs to be offset accordingly to consider the size of header
1209+
jl_taggedvalue_t *v_tagged = (jl_taggedvalue_t *)mmtk_nonmoving_alloc_fast(&ptls->gc_tls.mmtk_mutator, LLT_ALIGN(osize, align), align, sizeof(jl_taggedvalue_t));
1210+
v = jl_valueof(v_tagged);
1211+
mmtk_nonmoving_post_alloc_fast(&ptls->gc_tls.mmtk_mutator, v, LLT_ALIGN(osize, align));
1212+
} else {
1213+
// allocating an extra word to store the size of buffer objects
1214+
jl_taggedvalue_t *v_tagged = (jl_taggedvalue_t *)mmtk_nonmoving_alloc_fast(&ptls->gc_tls.mmtk_mutator, LLT_ALIGN(osize+sizeof(jl_taggedvalue_t), align), align, 0);
1215+
jl_value_t* v_tagged_aligned = ((jl_value_t*)((char*)(v_tagged) + sizeof(jl_taggedvalue_t)));
1216+
v = jl_valueof(v_tagged_aligned);
1217+
mmtk_store_obj_size_c(v, LLT_ALIGN(osize+sizeof(jl_taggedvalue_t), align));
1218+
mmtk_nonmoving_post_alloc_fast(&ptls->gc_tls.mmtk_mutator, v, LLT_ALIGN(osize+sizeof(jl_taggedvalue_t), align));
1219+
}
1220+
1221+
ptls->gc_tls_common.gc_num.allocd += osize;
1222+
ptls->gc_tls_common.gc_num.poolalloc++;
1223+
1224+
return v;
1225+
}
1226+
11891227
JL_DLLEXPORT jl_value_t *jl_mmtk_gc_alloc_big(jl_ptls_t ptls, size_t sz)
11901228
{
11911229
// safepoint
@@ -1258,10 +1296,18 @@ inline jl_value_t *jl_gc_alloc_(jl_ptls_t ptls, size_t sz, void *ty)
12581296

12591297
inline jl_value_t *jl_gc_alloc_nonmoving_(jl_ptls_t ptls, size_t sz, void *ty)
12601298
{
1261-
// TODO: Currently we just alloc and pin the object. We may use a
1262-
// different non moving allocator instead.
1263-
jl_value_t *v = jl_gc_alloc_(ptls, sz, ty);
1264-
OBJ_PIN(v);
1299+
jl_value_t *v;
1300+
const size_t allocsz = sz + sizeof(jl_taggedvalue_t);
1301+
if (sz <= GC_MAX_SZCLASS) {
1302+
v = jl_mmtk_gc_alloc_nonmoving(ptls, allocsz, 16, ty);
1303+
}
1304+
else {
1305+
if (allocsz < sz) // overflow in adding offs, size was "negative"
1306+
jl_throw(jl_memory_exception);
1307+
v = jl_mmtk_gc_alloc_big(ptls, allocsz);
1308+
}
1309+
jl_set_typeof(v, ty);
1310+
maybe_record_alloc_to_profile(v, sz, (jl_datatype_t*)ty);
12651311
return v;
12661312
}
12671313

0 commit comments

Comments
 (0)