Skip to content

Commit e370e4e

Browse files
committed
Slightly re-factor timing counts back-end
This should make it clearer what the responsibilities for each function are, and fix a bug where conditionally-triggered events could end up with an invalid total time.
1 parent 046f610 commit e370e4e

File tree

2 files changed

+23
-22
lines changed

2 files changed

+23
-22
lines changed

src/timing.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ void jl_timing_block_enter_task(jl_task_t *ct, jl_ptls_t ptls, jl_timing_block_t
156156

157157
ptls->timing_stack = prev_blk;
158158
if (prev_blk != NULL) {
159-
_COUNTS_START(&prev_blk->counts_ctx, cycleclock());
159+
_COUNTS_RESUME(&prev_blk->counts_ctx, cycleclock());
160160
}
161161
}
162162

@@ -189,7 +189,7 @@ jl_timing_block_t *jl_timing_block_exit_task(jl_task_t *ct, jl_ptls_t ptls)
189189
ptls->timing_stack = NULL;
190190

191191
if (blk != NULL) {
192-
_COUNTS_STOP(&blk->counts_ctx, cycleclock());
192+
_COUNTS_PAUSE(&blk->counts_ctx, cycleclock());
193193
}
194194
return blk;
195195
}

src/timing.h

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -233,16 +233,16 @@ enum jl_timing_counter_types {
233233

234234
#ifdef USE_TIMING_COUNTS
235235
#define _COUNTS_CTX_MEMBER jl_timing_counts_t counts_ctx;
236-
#define _COUNTS_CTOR(block) _jl_timing_counts_ctor(block)
237-
#define _COUNTS_DESTROY(block, event, t) _jl_timing_counts_destroy(block, event, t)
238236
#define _COUNTS_START(block, t) _jl_timing_counts_start(block, t)
239-
#define _COUNTS_STOP(block, t) _jl_timing_counts_stop(block, t)
237+
#define _COUNTS_STOP(block, event, t) _jl_timing_counts_stop(block, event, t)
238+
#define _COUNTS_PAUSE(block, t) _jl_timing_counts_pause(block, t)
239+
#define _COUNTS_RESUME(block, t) _jl_timing_counts_resume(block, t)
240240
#else
241241
#define _COUNTS_CTX_MEMBER
242-
#define _COUNTS_CTOR(block)
243-
#define _COUNTS_DESTROY(block, event, t)
244242
#define _COUNTS_START(block, t)
245-
#define _COUNTS_STOP(block, t)
243+
#define _COUNTS_STOP(block, event, t)
244+
#define _COUNTS_PAUSE(block, t)
245+
#define _COUNTS_RESUME(block, t)
246246
#endif
247247

248248
/**
@@ -297,30 +297,37 @@ typedef struct _jl_timing_counts_t {
297297
#endif
298298
} jl_timing_counts_t;
299299

300-
STATIC_INLINE void _jl_timing_counts_stop(jl_timing_counts_t *block, uint64_t t) JL_NOTSAFEPOINT {
300+
STATIC_INLINE void _jl_timing_counts_pause(jl_timing_counts_t *block, uint64_t t) JL_NOTSAFEPOINT {
301301
#ifdef JL_DEBUG_BUILD
302302
assert(block->running);
303303
block->running = 0;
304304
#endif
305305
block->total += t - block->start;
306306
}
307307

308-
STATIC_INLINE void _jl_timing_counts_start(jl_timing_counts_t *block, uint64_t t) JL_NOTSAFEPOINT {
308+
STATIC_INLINE void _jl_timing_counts_resume(jl_timing_counts_t *block, uint64_t t) JL_NOTSAFEPOINT {
309309
#ifdef JL_DEBUG_BUILD
310310
assert(!block->running);
311311
block->running = 1;
312312
#endif
313313
block->start = t;
314314
}
315315

316-
STATIC_INLINE void _jl_timing_counts_ctor(jl_timing_counts_t *block) JL_NOTSAFEPOINT {
316+
STATIC_INLINE void _jl_timing_counts_start(jl_timing_counts_t *block, uint64_t t) JL_NOTSAFEPOINT {
317317
block->total = 0;
318+
block->start = t;
319+
block->t0 = t;
318320
#ifdef JL_DEBUG_BUILD
319-
block->running = 0;
321+
block->running = 1;
320322
#endif
321323
}
322324

323-
STATIC_INLINE void _jl_timing_counts_destroy(jl_timing_counts_t *block, int event, uint64_t t) JL_NOTSAFEPOINT {
325+
STATIC_INLINE void _jl_timing_counts_stop(jl_timing_counts_t *block, int event, uint64_t t) JL_NOTSAFEPOINT {
326+
#ifdef JL_DEBUG_BUILD
327+
assert(block->running);
328+
block->running = 0;
329+
#endif
330+
block->total += t - block->start;
324331
jl_atomic_fetch_add_relaxed(jl_timing_self_counts + event, block->total);
325332
jl_atomic_fetch_add_relaxed(jl_timing_full_counts + event, t - block->t0);
326333
}
@@ -353,17 +360,14 @@ STATIC_INLINE void jl_timing_block_start(jl_timing_block_t *block) {
353360

354361
uint64_t t = cycleclock(); (void)t;
355362
_COUNTS_START(&block->counts_ctx, t);
356-
#ifdef USE_TIMING_COUNTS
357-
block->counts_ctx.t0 = t;
358-
#endif
359363
_ITTAPI_START(block);
360364
_TRACY_START(block);
361365

362366
jl_timing_block_t **prevp = &jl_current_task->ptls->timing_stack;
363367
block->prev = *prevp;
364368
block->is_running = 1;
365369
if (block->prev) {
366-
_COUNTS_STOP(&block->prev->counts_ctx, t);
370+
_COUNTS_PAUSE(&block->prev->counts_ctx, t);
367371
}
368372
*prevp = block;
369373
}
@@ -372,26 +376,23 @@ STATIC_INLINE void _jl_timing_block_ctor(jl_timing_block_t *block, int subsystem
372376
block->subsystem = subsystem;
373377
block->event = event;
374378
block->is_running = 0;
375-
_COUNTS_CTOR(&block->counts_ctx);
376379
}
377380

378381
STATIC_INLINE void _jl_timing_block_destroy(jl_timing_block_t *block) JL_NOTSAFEPOINT {
379382
if (block->is_running) {
380383
uint64_t t = cycleclock(); (void)t;
381384
_ITTAPI_STOP(block);
382-
_COUNTS_STOP(&block->counts_ctx, t);
383385
_TRACY_STOP(block->tracy_ctx);
386+
_COUNTS_STOP(&block->counts_ctx, block->event, cycleclock());
384387

385388
jl_task_t *ct = jl_current_task;
386389
jl_timing_block_t **pcur = &ct->ptls->timing_stack;
387390
assert(*pcur == block);
388391
*pcur = block->prev;
389392
if (block->prev) {
390-
_COUNTS_START(&block->prev->counts_ctx, t);
393+
_COUNTS_RESUME(&block->prev->counts_ctx, t);
391394
}
392395
}
393-
394-
_COUNTS_DESTROY(&block->counts_ctx, block->event, cycleclock());
395396
}
396397

397398
typedef struct _jl_timing_suspend_t {

0 commit comments

Comments
 (0)