@@ -16,6 +16,13 @@ static inline const char *gnu_basename(const char *path)
1616 return base ? base + 1 : path ;
1717}
1818
19+ #ifdef USE_TRACY
20+ typedef struct {
21+ _Atomic (int64_t ) val ;
22+ char * name ;
23+ } jl_tracy_counter_t ;
24+ #endif
25+
1926#ifdef __cplusplus
2027extern "C" {
2128#endif
@@ -78,6 +85,9 @@ extern JL_DLLEXPORT uint32_t jl_timing_print_limit;
7885#define jl_timing_block_exit_task (ct , ptls ) ((jl_timing_block_t *)NULL)
7986#define jl_pop_timing_block (blk )
8087
88+ #define jl_timing_counter_inc (counter , value )
89+ #define jl_timing_counter_dec (counter , value )
90+
8191#define jl_profile_lock_init (lock , name )
8292#define jl_profile_lock_start_wait (lock )
8393#define jl_profile_lock_acquired (lock )
@@ -181,6 +191,15 @@ JL_DLLEXPORT void jl_timing_puts(jl_timing_block_t *cur_block, const char *str);
181191 X(NATIVE_Create) \
182192
183193
194+ #define JL_TIMING_COUNTERS \
195+ X(Invalidations) \
196+ X(HeapSize) \
197+ X(JITSize) \
198+ X(JITCodeSize) \
199+ X(JITDataSize) \
200+ X(ImageSize) \
201+
202+
184203enum jl_timing_owners {
185204#define X(name) JL_TIMING_ ## name,
186205 JL_TIMING_OWNERS
@@ -195,6 +214,13 @@ enum jl_timing_events {
195214 JL_TIMING_EVENT_LAST
196215};
197216
217+ enum jl_timing_counter_types {
218+ #define X(name) JL_TIMING_COUNTER_ ## name,
219+ JL_TIMING_COUNTERS
220+ #undef X
221+ JL_TIMING_COUNTER_LAST
222+ };
223+
198224/**
199225 * Timing back-ends differ in terms of whether they support nested
200226 * and asynchronous events.
@@ -404,6 +430,61 @@ struct jl_timing_suspend_cpp_t {
404430 _jl_timing_suspend_ctor(&__timing_suspend, #subsystem, ct)
405431#endif
406432
433+ // Counting
434+ #ifdef USE_ITTAPI
435+ #define _ITTAPI_COUNTER_MEMBER __itt_counter ittapi_counter;
436+ #else
437+ #define _ITTAPI_COUNTER_MEMBER
438+ #endif
439+
440+ #ifdef USE_TRACY
441+ # define _TRACY_COUNTER_MEMBER jl_tracy_counter_t tracy_counter;
442+ # else
443+ # define _TRACY_COUNTER_MEMBER
444+ #endif
445+
446+ #ifdef USE_TIMING_COUNTS
447+ #define _COUNTS_MEMBER _Atomic(uint64_t) basic_counter;
448+ #else
449+ #define _COUNTS_MEMBER
450+ #endif
451+
452+ typedef struct {
453+ _ITTAPI_COUNTER_MEMBER
454+ _TRACY_COUNTER_MEMBER
455+ _COUNTS_MEMBER
456+ } jl_timing_counter_t ;
457+
458+ JL_DLLEXPORT extern jl_timing_counter_t jl_timing_counters [JL_TIMING_COUNTER_LAST ];
459+
460+ static inline void jl_timing_counter_inc (int counter , uint64_t val ) JL_NOTSAFEPOINT {
461+ #ifdef USE_ITTAPI
462+ __itt_counter_inc_delta (jl_timing_counters [counter ].ittapi_counter , val );
463+ #endif
464+ #ifdef USE_TRACY
465+ jl_tracy_counter_t * tracy_counter = & jl_timing_counters [counter ].tracy_counter ;
466+ uint64_t oldval = jl_atomic_fetch_add_relaxed (& tracy_counter -> val , val );
467+ TracyCPlotI (tracy_counter -> name , oldval + val );
468+ #endif
469+ #ifdef USE_TIMING_COUNTS
470+ jl_atomic_fetch_add_relaxed (& jl_timing_counters [counter ].basic_counter , val );
471+ #endif
472+ }
473+
474+ static inline void jl_timing_counter_dec (int counter , uint64_t val ) JL_NOTSAFEPOINT {
475+ #ifdef USE_ITTAPI
476+ __itt_counter_dec_delta (jl_timing_counters [counter ].ittapi_counter , val );
477+ #endif
478+ #ifdef USE_TRACY
479+ jl_tracy_counter_t * tracy_counter = & jl_timing_counters [counter ].tracy_counter ;
480+ uint64_t oldval = jl_atomic_fetch_add_relaxed (& tracy_counter -> val , - val );
481+ TracyCPlotI (tracy_counter -> name , oldval - val );
482+ #endif
483+ #ifdef USE_TIMING_COUNTS
484+ jl_atomic_fetch_add_relaxed (& jl_timing_counters [counter ].basic_counter , - (int64_t )val );
485+ #endif
486+ }
487+
407488// Locking profiling
408489static inline void jl_profile_lock_init (jl_mutex_t * lock , const char * name ) {
409490#ifdef USE_ITTAPI
0 commit comments