@@ -1095,6 +1095,7 @@ JL_DLLEXPORT int* jl_gc_get_have_pending_finalizers(void) {
1095
1095
// ========================================================================= //
1096
1096
1097
1097
#define MMTK_DEFAULT_IMMIX_ALLOCATOR (0)
1098
+ #define MMTK_NONMOVING_ALLOCATOR (1)
1098
1099
#define MMTK_IMMORTAL_BUMP_ALLOCATOR (0)
1099
1100
1100
1101
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*
1149
1150
}
1150
1151
}
1151
1152
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
+
1152
1164
STATIC_INLINE void * mmtk_immortal_alloc_fast (MMTkMutatorContext * mutator , size_t size , size_t align , size_t offset ) {
1153
1165
BumpAllocator * allocator = & mutator -> allocators .bump_pointer [MMTK_IMMORTAL_BUMP_ALLOCATOR ];
1154
1166
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
1186
1198
return v ;
1187
1199
}
1188
1200
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
+
1189
1227
JL_DLLEXPORT jl_value_t * jl_mmtk_gc_alloc_big (jl_ptls_t ptls , size_t sz )
1190
1228
{
1191
1229
// safepoint
@@ -1258,10 +1296,18 @@ inline jl_value_t *jl_gc_alloc_(jl_ptls_t ptls, size_t sz, void *ty)
1258
1296
1259
1297
inline jl_value_t * jl_gc_alloc_nonmoving_ (jl_ptls_t ptls , size_t sz , void * ty )
1260
1298
{
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 );
1265
1311
return v ;
1266
1312
}
1267
1313
0 commit comments