17#ifndef _RTEMS_SCORE_SMPLOCKSTATS_H
18#define _RTEMS_SCORE_SMPLOCKSTATS_H
20#include <rtems/score/cpu.h>
36#if defined(RTEMS_PROFILING)
41#define SMP_LOCK_STATS_CONTENTION_COUNTS 4
70 CPU_Counter_ticks max_acquire_time;
75 CPU_Counter_ticks max_section_time;
93 uint64_t total_acquire_time;
105 uint64_t contention_counts[SMP_LOCK_STATS_CONTENTION_COUNTS];
115 uint64_t total_section_time;
132 CPU_Counter_ticks acquire_instant;
137 SMP_lock_Stats *stats;
138} SMP_lock_Stats_context;
143#define SMP_LOCK_STATS_INITIALIZER( name ) \
144 { { NULL, NULL }, 0, 0, 0, 0, { 0, 0, 0, 0 }, 0, name }
153static inline void _SMP_lock_Stats_initialize(
154 SMP_lock_Stats *stats,
158 SMP_lock_Stats init = SMP_LOCK_STATS_INITIALIZER( name );
168void _SMP_lock_Stats_destroy( SMP_lock_Stats *stats );
177void _SMP_lock_Stats_register_or_max_section_time(
178 SMP_lock_Stats *stats,
179 CPU_Counter_ticks max_section_time
183 CPU_Counter_ticks first;
184} SMP_lock_Stats_acquire_context;
191static inline void _SMP_lock_Stats_acquire_begin(
192 SMP_lock_Stats_acquire_context *acquire_context
206static inline void _SMP_lock_Stats_acquire_end(
207 const SMP_lock_Stats_acquire_context *acquire_context,
208 SMP_lock_Stats *stats,
209 SMP_lock_Stats_context *stats_context,
210 unsigned int queue_length
213 CPU_Counter_ticks second;
214 CPU_Counter_ticks delta;
217 stats_context->acquire_instant = second;
218 delta = _CPU_Counter_difference( second, acquire_context->first );
220 ++stats->usage_count;
222 stats->total_acquire_time += delta;
224 if ( stats->max_acquire_time < delta ) {
225 stats->max_acquire_time = delta;
228 if ( queue_length >= SMP_LOCK_STATS_CONTENTION_COUNTS ) {
229 queue_length = SMP_LOCK_STATS_CONTENTION_COUNTS - 1;
231 ++stats->contention_counts[ queue_length ];
233 stats_context->stats = stats;
241static inline void _SMP_lock_Stats_release_update(
242 const SMP_lock_Stats_context *stats_context
245 SMP_lock_Stats *stats;
246 CPU_Counter_ticks first;
247 CPU_Counter_ticks second;
248 CPU_Counter_ticks delta;
250 stats = stats_context->stats;
251 first = stats_context->acquire_instant;
253 delta = _CPU_Counter_difference( second, first );
255 stats->total_section_time += delta;
257 if ( stats->max_section_time < delta ) {
258 _SMP_lock_Stats_register_or_max_section_time( stats, delta );
264 SMP_lock_Stats *current;
265} SMP_lock_Stats_iteration_context;
272void _SMP_lock_Stats_iteration_start(
273 SMP_lock_Stats_iteration_context *iteration_context
287bool _SMP_lock_Stats_iteration_next(
288 SMP_lock_Stats_iteration_context *iteration_context,
289 SMP_lock_Stats *snapshot,
299void _SMP_lock_Stats_iteration_stop(
300 SMP_lock_Stats_iteration_context *iteration_context
305#define _SMP_lock_Stats_initialize( stats, name ) do { } while ( 0 )
307#define _SMP_lock_Stats_destroy( stats ) do { } while ( 0 )
CPU_Counter_ticks _CPU_Counter_read(void)
Returns the current CPU counter value.
Definition: system-clocks.c:117