From a0da06c306f4c106136909ad149204005fe82ab1 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Sat, 3 May 2014 18:25:19 +0100 Subject: [profile] Provide methods for profiling individual stages of operations Signed-off-by: Michael Brown --- src/include/ipxe/profile.h | 42 +++++++++++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 7 deletions(-) (limited to 'src/include') diff --git a/src/include/ipxe/profile.h b/src/include/ipxe/profile.h index 0b15fe545..d4fc4f90f 100644 --- a/src/include/ipxe/profile.h +++ b/src/include/ipxe/profile.h @@ -9,7 +9,6 @@ FILE_LICENCE ( GPL2_OR_LATER ); -#include #include #include @@ -26,7 +25,9 @@ struct profiler { /** Name */ const char *name; /** Start timestamp */ - uint64_t started; + unsigned long started; + /** Stop timestamp */ + unsigned long stopped; /** Number of samples */ unsigned int count; /** Mean sample value (scaled) */ @@ -62,6 +63,20 @@ extern unsigned long profile_mean ( struct profiler *profiler ); extern unsigned long profile_variance ( struct profiler *profiler ); extern unsigned long profile_stddev ( struct profiler *profiler ); +/** + * Start profiling + * + * @v profiler Profiler + * @v started Start timestamp + */ +static inline __attribute__ (( always_inline )) void +profile_start_at ( struct profiler *profiler, unsigned long started ) { + + /* If profiling is active then record start timestamp */ + if ( PROFILING ) + profiler->started = started; +} + /** * Start profiling * @@ -72,23 +87,36 @@ profile_start ( struct profiler *profiler ) { /* If profiling is active then record start timestamp */ if ( PROFILING ) - profiler->started = profile_timestamp(); + profile_start_at ( profiler, profile_timestamp() ); } /** * Record profiling result * * @v profiler Profiler + * @v stopped Stop timestamp */ static inline __attribute__ (( always_inline )) void -profile_stop ( struct profiler *profiler ) { - uint64_t ended; +profile_stop_at ( struct profiler *profiler, unsigned long stopped ) { /* If profiling is active then record end timestamp and update stats */ if ( PROFILING ) { - ended = profile_timestamp(); - profile_update ( profiler, ( ended - profiler->started ) ); + profiler->stopped = stopped; + profile_update ( profiler, ( stopped - profiler->started ) ); } } +/** + * Record profiling result + * + * @v profiler Profiler + */ +static inline __attribute__ (( always_inline )) void +profile_stop ( struct profiler *profiler ) { + + /* If profiling is active then record end timestamp and update stats */ + if ( PROFILING ) + profile_stop_at ( profiler, profile_timestamp() ); +} + #endif /* _IPXE_PROFILE_H */ -- cgit v1.2.3-55-g7522