Skip to content

Commit c84f170

Browse files
committed
WIP: pass type of allocated value to GC functions.
Maybe makes it possible to get rid of set_typeof call in generated code.
1 parent efbe3fa commit c84f170

File tree

4 files changed

+31
-32
lines changed

4 files changed

+31
-32
lines changed

src/array.c

+2-4
Original file line numberDiff line numberDiff line change
@@ -337,9 +337,8 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array_1d(jl_value_t *atype, void *data,
337337
if (own_buffer) {
338338
a->flags.how = 2;
339339
jl_gc_track_malloced_array(ptls, a);
340-
jl_gc_count_allocd(a, nel*elsz + (elsz == 1 ? 1 : 0),
340+
jl_gc_count_allocd(a, nel*elsz + (elsz == 1 ? 1 : 0), atype,
341341
JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_STDALLOC);
342-
jl_memprofile_set_typeof(a, atype);
343342
}
344343
else {
345344
a->flags.how = 0;
@@ -406,9 +405,8 @@ JL_DLLEXPORT jl_array_t *jl_ptr_to_array(jl_value_t *atype, void *data,
406405
if (own_buffer) {
407406
a->flags.how = 2;
408407
jl_gc_track_malloced_array(ptls, a);
409-
jl_gc_count_allocd(a, nel*elsz + (elsz == 1 ? 1 : 0),
408+
jl_gc_count_allocd(a, nel*elsz + (elsz == 1 ? 1 : 0), atype,
410409
JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_STDALLOC);
411-
jl_memprofile_set_typeof(a, atype);
412410
}
413411
else {
414412
a->flags.how = 0;

src/gc.c

+17-16
Original file line numberDiff line numberDiff line change
@@ -878,7 +878,7 @@ static void sweep_weak_refs(void)
878878
// big value list
879879

880880
// Size includes the tag and the tag is not cleared!!
881-
JL_DLLEXPORT jl_value_t *jl_gc_big_alloc(jl_ptls_t ptls, size_t sz)
881+
JL_DLLEXPORT jl_value_t *jl_gc_big_alloc(jl_ptls_t ptls, size_t sz, void *ty)
882882
{
883883
maybe_collect(ptls);
884884
size_t offs = offsetof(bigval_t, header);
@@ -893,8 +893,8 @@ JL_DLLEXPORT jl_value_t *jl_gc_big_alloc(jl_ptls_t ptls, size_t sz)
893893
jl_throw(jl_memory_exception);
894894
gc_invoke_callbacks(jl_gc_cb_notify_external_alloc_t,
895895
gc_cblist_notify_external_alloc, (v, allocsz));
896-
jl_gc_count_allocd(jl_valueof(&v->header), allocsz, JL_MEMPROF_TAG_DOMAIN_CPU |
897-
JL_MEMPROF_TAG_ALLOC_BIGALLOC);
896+
jl_gc_count_allocd(jl_valueof(&v->header), allocsz, ty,
897+
JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_BIGALLOC);
898898
ptls->gc_num.bigalloc++;
899899
#ifdef MEMDEBUG
900900
memset(v, 0xee, allocsz);
@@ -986,13 +986,13 @@ void jl_gc_track_malloced_array(jl_ptls_t ptls, jl_array_t *a) JL_NOTSAFEPOINT
986986
ptls->heap.mallocarrays = ma;
987987
}
988988

989-
void jl_gc_count_allocd(void * addr, size_t sz, uint16_t tag) JL_NOTSAFEPOINT
989+
void jl_gc_count_allocd(void * addr, size_t sz, void *ty, uint16_t tag) JL_NOTSAFEPOINT
990990
{
991991
jl_ptls_t ptls = jl_get_ptls_states();
992992
ptls->gc_num.allocd += sz;
993993

994994
if (__unlikely(jl_memprofile_is_running())) {
995-
jl_memprofile_track_alloc(addr, tag, sz);
995+
jl_memprofile_track_alloc(addr, tag, sz, ty);
996996
}
997997
}
998998

@@ -1006,7 +1006,8 @@ void jl_gc_count_freed(void * addr, size_t sz, uint16_t tag) JL_NOTSAFEPOINT
10061006
}
10071007
}
10081008

1009-
void jl_gc_count_reallocd(void * oldaddr, size_t oldsz, void * newaddr, size_t newsz, uint16_t tag) JL_NOTSAFEPOINT
1009+
void jl_gc_count_reallocd(void * oldaddr, size_t oldsz, void * newaddr, size_t newsz,
1010+
void *newty, uint16_t tag) JL_NOTSAFEPOINT
10101011
{
10111012
jl_ptls_t ptls = jl_get_ptls_states();
10121013
if (oldsz < newsz) {
@@ -1022,7 +1023,7 @@ void jl_gc_count_reallocd(void * oldaddr, size_t oldsz, void * newaddr, size_t n
10221023
// the two values when realloc'ing.
10231024
if (__unlikely(jl_memprofile_is_running())) {
10241025
jl_memprofile_track_dealloc(oldaddr, tag);
1025-
jl_memprofile_track_alloc(newaddr, tag, newsz);
1026+
jl_memprofile_track_alloc(newaddr, tag, newsz, newty);
10261027
}
10271028
}
10281029

@@ -1165,15 +1166,15 @@ static NOINLINE jl_taggedvalue_t *add_page(jl_gc_pool_t *p) JL_NOTSAFEPOINT
11651166

11661167
// Size includes the tag and the tag is not cleared!!
11671168
JL_DLLEXPORT jl_value_t *jl_gc_pool_alloc(jl_ptls_t ptls, int pool_offset,
1168-
int osize)
1169+
int osize, void *ty)
11691170
{
11701171
// Use the pool offset instead of the pool address as the argument
11711172
// to workaround a llvm bug.
11721173
// Ref https://llvm.org/bugs/show_bug.cgi?id=27190
11731174
jl_gc_pool_t *p = (jl_gc_pool_t*)((char*)ptls + pool_offset);
11741175
assert(ptls->gc_state == 0);
11751176
#ifdef MEMDEBUG
1176-
return jl_gc_big_alloc(ptls, osize);
1177+
return jl_gc_big_alloc(ptls, osize, ty);
11771178
#endif
11781179
maybe_collect(ptls);
11791180
ptls->gc_num.poolalloc++;
@@ -1190,7 +1191,7 @@ JL_DLLEXPORT jl_value_t *jl_gc_pool_alloc(jl_ptls_t ptls, int pool_offset,
11901191
pg->nfree = 0;
11911192
pg->has_young = 1;
11921193
}
1193-
jl_gc_count_allocd(jl_valueof(v), osize, JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_POOLALLOC);
1194+
jl_gc_count_allocd(jl_valueof(v), osize, ty, JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_POOLALLOC);
11941195
return jl_valueof(v);
11951196
}
11961197
// if the freelist is empty we reuse empty but not freed pages
@@ -1215,7 +1216,7 @@ JL_DLLEXPORT jl_value_t *jl_gc_pool_alloc(jl_ptls_t ptls, int pool_offset,
12151216
next = (jl_taggedvalue_t*)((char*)v + osize);
12161217
}
12171218
p->newpages = next;
1218-
jl_gc_count_allocd(jl_valueof(v), osize, JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_POOLALLOC);
1219+
jl_gc_count_allocd(jl_valueof(v), osize, ty, JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_POOLALLOC);
12191220
return jl_valueof(v);
12201221
}
12211222

@@ -3172,7 +3173,7 @@ JL_DLLEXPORT void *jl_gc_counted_malloc(size_t sz)
31723173
maybe_collect(ptls);
31733174
void *b = malloc(sz);
31743175
if (ptls && ptls->world_age) {
3175-
jl_gc_count_allocd(b, sz, JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_STDALLOC);
3176+
jl_gc_count_allocd(b, sz, NULL, JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_STDALLOC);
31763177
ptls->gc_num.malloc++;
31773178
}
31783179
return b;
@@ -3185,7 +3186,7 @@ JL_DLLEXPORT void *jl_gc_counted_calloc(size_t nm, size_t sz)
31853186
maybe_collect(ptls);
31863187
void *b = calloc(nm, sz);
31873188
if (ptls && ptls->world_age) {
3188-
jl_gc_count_allocd(b, nm*sz, JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_STDALLOC);
3189+
jl_gc_count_allocd(b, nm*sz, NULL, JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_STDALLOC);
31893190
ptls->gc_num.malloc++;
31903191
}
31913192
return b;
@@ -3208,7 +3209,7 @@ JL_DLLEXPORT void *jl_gc_counted_realloc_with_old_size(void *p, size_t old, size
32083209
maybe_collect(ptls);
32093210
void *b = realloc(p, sz);
32103211
if (ptls && ptls->world_age) {
3211-
jl_gc_count_reallocd(p, old, b, sz, JL_MEMPROF_TAG_DOMAIN_CPU);
3212+
jl_gc_count_reallocd(p, old, b, sz, NULL, JL_MEMPROF_TAG_DOMAIN_CPU);
32123213
ptls->gc_num.realloc++;
32133214
}
32143215
return b;
@@ -3280,7 +3281,7 @@ JL_DLLEXPORT void *jl_gc_managed_malloc(size_t sz)
32803281
void *b = malloc_cache_align(allocsz);
32813282
if (b == NULL)
32823283
jl_throw(jl_memory_exception);
3283-
jl_gc_count_allocd(b, allocsz, JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_STDALLOC);
3284+
jl_gc_count_allocd(b, allocsz, NULL, JL_MEMPROF_TAG_DOMAIN_CPU | JL_MEMPROF_TAG_ALLOC_STDALLOC);
32843285
ptls->gc_num.malloc++;
32853286
#ifdef _OS_WINDOWS_
32863287
SetLastError(last_error);
@@ -3319,7 +3320,7 @@ static void *gc_managed_realloc_(jl_ptls_t ptls, void *d, size_t sz, size_t olds
33193320
live_bytes += allocsz - oldsz;
33203321
}
33213322
else
3322-
jl_gc_count_reallocd(d, oldsz, b, allocsz, JL_MEMPROF_TAG_DOMAIN_CPU);
3323+
jl_gc_count_reallocd(d, oldsz, b, allocsz, NULL, JL_MEMPROF_TAG_DOMAIN_CPU);
33233324
ptls->gc_num.realloc++;
33243325

33253326
#ifdef _OS_WINDOWS_

src/julia_internal.h

+8-7
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ JL_DLLEXPORT extern int jl_lineno;
135135
JL_DLLEXPORT extern const char *jl_filename;
136136

137137
JL_DLLEXPORT jl_value_t *jl_gc_pool_alloc(jl_ptls_t ptls, int pool_offset,
138-
int osize);
139-
JL_DLLEXPORT jl_value_t *jl_gc_big_alloc(jl_ptls_t ptls, size_t allocsz);
138+
int osize, void *ty);
139+
JL_DLLEXPORT jl_value_t *jl_gc_big_alloc(jl_ptls_t ptls, size_t allocsz, void *ty);
140140
int jl_gc_classify_pools(size_t sz, int *osize);
141141
extern jl_mutex_t gc_perm_lock;
142142
void *jl_gc_perm_alloc_nolock(size_t sz, int zero,
@@ -252,7 +252,7 @@ STATIC_INLINE uint8_t JL_CONST_FUNC jl_gc_szclass(unsigned sz)
252252
#define JL_MEMPROF_TAG_DEALLOC 0x8000
253253

254254
// Necessary memory profiler prototypes
255-
JL_DLLEXPORT void jl_memprofile_track_alloc(void *v, uint16_t tag, size_t allocsz) JL_NOTSAFEPOINT;
255+
JL_DLLEXPORT void jl_memprofile_track_alloc(void *v, uint16_t tag, size_t allocsz, void *ty) JL_NOTSAFEPOINT;
256256
JL_DLLEXPORT void jl_memprofile_track_dealloc(void *v, uint16_t tag) JL_NOTSAFEPOINT;
257257
JL_DLLEXPORT int jl_memprofile_is_running(void) JL_NOTSAFEPOINT;
258258
JL_DLLEXPORT void jl_memprofile_set_typeof(void * v, void * ty) JL_NOTSAFEPOINT;
@@ -275,12 +275,12 @@ STATIC_INLINE jl_value_t *jl_gc_alloc_(jl_ptls_t ptls, size_t sz, void *ty)
275275
int pool_id = jl_gc_szclass(allocsz);
276276
jl_gc_pool_t *p = &ptls->heap.norm_pools[pool_id];
277277
int osize = jl_gc_sizeclasses[pool_id];
278-
v = jl_gc_pool_alloc(ptls, (char*)p - (char*)ptls, osize);
278+
v = jl_gc_pool_alloc(ptls, (char*)p - (char*)ptls, osize, ty);
279279
}
280280
else {
281281
if (allocsz < sz) // overflow in adding offs, size was "negative"
282282
jl_throw(jl_memory_exception);
283-
v = jl_gc_big_alloc(ptls, allocsz);
283+
v = jl_gc_big_alloc(ptls, allocsz, ty);
284284
}
285285
jl_set_typeof(v, ty);
286286
jl_memprofile_set_typeof(v, ty);
@@ -348,9 +348,10 @@ JL_DLLEXPORT void JL_NORETURN jl_throw_out_of_memory_error(void);
348348
JL_DLLEXPORT int64_t jl_gc_diff_total_bytes(void);
349349
void jl_gc_sync_total_bytes(void);
350350
void jl_gc_track_malloced_array(jl_ptls_t ptls, jl_array_t *a) JL_NOTSAFEPOINT;
351-
void jl_gc_count_allocd(void * addr, size_t sz, uint16_t tag) JL_NOTSAFEPOINT;
351+
void jl_gc_count_allocd(void * addr, size_t sz, void *ty, uint16_t tag) JL_NOTSAFEPOINT;
352352
void jl_gc_count_freed(void * addr, size_t sz, uint16_t tag) JL_NOTSAFEPOINT;
353-
void jl_gc_count_reallocd(void * oldaddr, size_t oldsz, void * newaddr, size_t newsz, uint16_t tag) JL_NOTSAFEPOINT;
353+
void jl_gc_count_reallocd(void * oldaddr, size_t oldsz, void * newaddr, size_t newsz,
354+
void *newty, uint16_t tag) JL_NOTSAFEPOINT;
354355
void jl_gc_run_all_finalizers(jl_ptls_t ptls);
355356

356357
void gc_queue_binding(jl_binding_t *bnd) JL_NOTSAFEPOINT;

src/profile.c

+4-5
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ JL_DLLEXPORT jl_array_t * jl_memprofile_find_malloc_array(void * adata)
143143
return NULL;
144144
}
145145

146-
JL_DLLEXPORT void jl_memprofile_track_alloc(void *v, uint16_t tag, size_t allocsz) JL_NOTSAFEPOINT
146+
JL_DLLEXPORT void jl_memprofile_track_alloc(void *v, uint16_t tag, size_t allocsz, void *ty) JL_NOTSAFEPOINT
147147
{
148148
// Filter out this call with our tag filter
149149
if ((tag & memprof_tag_filter) != tag)
@@ -171,9 +171,8 @@ JL_DLLEXPORT void jl_memprofile_track_alloc(void *v, uint16_t tag, size_t allocs
171171
jl_bt_element_t *bt_entry = (jl_bt_element_t*) bt_data_prof + bt_size_cur + bt_size_step;
172172
bt_entry[0].uintptr = JL_BT_NON_PTR_ENTRY;
173173
bt_entry[1].uintptr = entry_tags;
174-
// The location of the type information for this chunk of memory (tracked value).
175-
// Initially set to nothing, populated later by `jl_memprofile_set_typeof()`
176-
bt_entry[2].jlvalue = (jl_value_t*)jl_nothing;
174+
// The location of the type information for this chunk of memory (tracked value)
175+
bt_entry[2].jlvalue = (jl_value_t*)(ty ? ty : jl_nothing);
177176
// The location of the data in memory, used to match allocations with deallocations.
178177
bt_entry[3].uintptr = (uintptr_t) v;
179178
// The time at which this happened
@@ -207,5 +206,5 @@ JL_DLLEXPORT void jl_memprofile_set_typeof(void * v, void * ty) JL_NOTSAFEPOINT
207206

208207
JL_DLLEXPORT void jl_memprofile_track_dealloc(void *v, uint16_t tag) JL_NOTSAFEPOINT
209208
{
210-
jl_memprofile_track_alloc(v, tag | JL_MEMPROF_TAG_DEALLOC, 0);
209+
jl_memprofile_track_alloc(v, tag | JL_MEMPROF_TAG_DEALLOC, 0, NULL);
211210
}

0 commit comments

Comments
 (0)