Skip to content

Commit 9d0850b

Browse files
committed
count bytes allocated through malloc more precisely
1 parent 59074fa commit 9d0850b

File tree

3 files changed

+24
-13
lines changed

3 files changed

+24
-13
lines changed

src/gc.c

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66
#include "julia_atomics.h"
77
#include "julia_gcext.h"
88
#include "julia_assert.h"
9-
#ifdef __GLIBC__
9+
10+
#if defined(_OS_DARWIN_)
11+
#include <malloc/malloc.h>
12+
#else
1013
#include <malloc.h> // for malloc_trim
1114
#endif
1215

@@ -231,6 +234,7 @@ void jl_gc_wait_for_the_world(jl_ptls_t* gc_all_tls_states, int gc_n_threads);
231234
#if defined(_OS_WINDOWS_)
232235
STATIC_INLINE void *jl_malloc_aligned(size_t sz, size_t align)
233236
{
237+
assert(align == JL_CACHE_BYTE_ALIGNMENT);
234238
return _aligned_malloc(sz ? sz : 1, align);
235239
}
236240
STATIC_INLINE void jl_free_aligned(void *p) JL_NOTSAFEPOINT
@@ -240,6 +244,7 @@ STATIC_INLINE void jl_free_aligned(void *p) JL_NOTSAFEPOINT
240244
#else
241245
STATIC_INLINE void *jl_malloc_aligned(size_t sz, size_t align)
242246
{
247+
assert(align == JL_CACHE_BYTE_ALIGNMENT);
243248
#if defined(_P64) || defined(__APPLE__)
244249
if (align <= 16)
245250
return malloc(sz);
@@ -254,6 +259,16 @@ STATIC_INLINE void jl_free_aligned(void *p) JL_NOTSAFEPOINT
254259
free(p);
255260
}
256261
#endif
262+
size_t memory_block_usable_size(void *p) JL_NOTSAFEPOINT
263+
{
264+
#if defined(_OS_WINDOWS_)
265+
return _aligned_msize(p, JL_CACHE_BYTE_ALIGNMENT, 0);
266+
#elif defined(_OS_DARWIN_)
267+
return malloc_size(p);
268+
#else
269+
return malloc_usable_size(p);
270+
#endif
271+
}
257272
#define malloc_cache_align(sz) jl_malloc_aligned(sz, JL_CACHE_BYTE_ALIGNMENT)
258273

259274
static void schedule_finalization(void *o, void *f) JL_NOTSAFEPOINT
@@ -1097,11 +1112,6 @@ void jl_gc_count_allocd(size_t sz) JL_NOTSAFEPOINT
10971112
jl_batch_accum_heap_size(ptls, sz);
10981113
}
10991114

1100-
void jl_gc_count_freed(size_t sz) JL_NOTSAFEPOINT
1101-
{
1102-
jl_batch_accum_free_size(jl_current_task->ptls, sz);
1103-
}
1104-
11051115
// Only safe to update the heap inside the GC
11061116
static void combine_thread_gc_counts(jl_gc_num_t *dest, int update_heap) JL_NOTSAFEPOINT
11071117
{
@@ -1182,13 +1192,14 @@ static void jl_gc_free_memory(jl_value_t *v, int isaligned) JL_NOTSAFEPOINT
11821192
jl_genericmemory_t *m = (jl_genericmemory_t*)v;
11831193
assert(jl_genericmemory_how(m) == 1 || jl_genericmemory_how(m) == 2);
11841194
char *d = (char*)m->ptr;
1195+
size_t freed_bytes = memory_block_usable_size(d);
11851196
if (isaligned)
11861197
jl_free_aligned(d);
11871198
else
11881199
free(d);
11891200
jl_atomic_store_relaxed(&gc_heap_stats.heap_size,
1190-
jl_atomic_load_relaxed(&gc_heap_stats.heap_size) - jl_genericmemory_nbytes(m));
1191-
gc_num.freed += jl_genericmemory_nbytes(m);
1201+
jl_atomic_load_relaxed(&gc_heap_stats.heap_size) - freed_bytes);
1202+
gc_num.freed += freed_bytes;
11921203
gc_num.freecall++;
11931204
}
11941205

@@ -4191,8 +4202,9 @@ JL_DLLEXPORT void *jl_gc_managed_malloc(size_t sz)
41914202
if (b == NULL)
41924203
jl_throw(jl_memory_exception);
41934204

4205+
size_t allocated_bytes = memory_block_usable_size(b);
41944206
jl_atomic_store_relaxed(&ptls->gc_tls.gc_num.allocd,
4195-
jl_atomic_load_relaxed(&ptls->gc_tls.gc_num.allocd) + allocsz);
4207+
jl_atomic_load_relaxed(&ptls->gc_tls.gc_num.allocd) + allocated_bytes);
41964208
jl_atomic_store_relaxed(&ptls->gc_tls.gc_num.malloc,
41974209
jl_atomic_load_relaxed(&ptls->gc_tls.gc_num.malloc) + 1);
41984210
jl_batch_accum_heap_size(ptls, allocsz);

src/genericmemory.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,8 @@ JL_DLLEXPORT jl_genericmemory_t *jl_ptr_to_genericmemory(jl_value_t *mtype, void
165165
if (own_buffer) {
166166
int isaligned = 0; // TODO: allow passing memalign'd buffers
167167
jl_gc_track_malloced_genericmemory(ct->ptls, m, isaligned);
168-
jl_gc_count_allocd(nel*elsz);
168+
size_t allocated_bytes = memory_block_usable_size(data);
169+
jl_gc_count_allocd(allocated_bytes);
169170
}
170171
return m;
171172
}
@@ -208,8 +209,6 @@ JL_DLLEXPORT jl_value_t *jl_genericmemory_to_string(jl_genericmemory_t *m, size_
208209
JL_GC_PUSH1(&o);
209210
jl_value_t *str = jl_pchar_to_string((const char*)m->ptr, len);
210211
JL_GC_POP();
211-
if (how == 1) // TODO: we might like to early-call jl_gc_free_memory here instead actually, but hopefully `m` will die soon
212-
jl_gc_count_freed(mlength);
213212
return str;
214213
}
215214
// n.b. how == 0 is always pool-allocated, so the freed bytes are computed from the pool not the object

src/julia_internal.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,8 +603,8 @@ JL_DLLEXPORT int64_t jl_gc_sync_total_bytes(int64_t offset) JL_NOTSAFEPOINT;
603603
void jl_gc_track_malloced_array(jl_ptls_t ptls, jl_array_t *a) JL_NOTSAFEPOINT;
604604
void jl_gc_track_malloced_genericmemory(jl_ptls_t ptls, jl_genericmemory_t *m, int isaligned) JL_NOTSAFEPOINT;
605605
size_t jl_genericmemory_nbytes(jl_genericmemory_t *a) JL_NOTSAFEPOINT;
606+
size_t memory_block_usable_size(void *mem) JL_NOTSAFEPOINT;
606607
void jl_gc_count_allocd(size_t sz) JL_NOTSAFEPOINT;
607-
void jl_gc_count_freed(size_t sz) JL_NOTSAFEPOINT;
608608
void jl_gc_run_all_finalizers(jl_task_t *ct);
609609
void jl_release_task_stack(jl_ptls_t ptls, jl_task_t *task);
610610
void jl_gc_add_finalizer_(jl_ptls_t ptls, void *v, void *f) JL_NOTSAFEPOINT;

0 commit comments

Comments
 (0)