summaryrefslogtreecommitdiffstats
path: root/cpukit/sapi/src/profilingiterate.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-03-07 14:36:22 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-03-14 08:46:49 +0100
commit53ad908a646eb6fd67f9b4586f4b484e8255b9d3 (patch)
tree7dd408879d01a507e6052f375ec6e14ab3f8965d /cpukit/sapi/src/profilingiterate.c
parentscore: Add per-CPU profiling (diff)
downloadrtems-53ad908a646eb6fd67f9b4586f4b484e8255b9d3.tar.bz2
score: Add SMP lock profiling support
Diffstat (limited to 'cpukit/sapi/src/profilingiterate.c')
-rw-r--r--cpukit/sapi/src/profilingiterate.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/cpukit/sapi/src/profilingiterate.c b/cpukit/sapi/src/profilingiterate.c
index 28c06a4689..956dbde887 100644
--- a/cpukit/sapi/src/profilingiterate.c
+++ b/cpukit/sapi/src/profilingiterate.c
@@ -18,6 +18,7 @@
#include <rtems/profiling.h>
#include <rtems/counter.h>
+#include <rtems/score/smplock.h>
#include <rtems.h>
#include <string.h>
@@ -76,6 +77,66 @@ static void per_cpu_stats_iterate(
#endif
}
+#if defined(RTEMS_PROFILING) && defined(RTEMS_SMP)
+RTEMS_STATIC_ASSERT(
+ RTEMS_PROFILING_SMP_LOCK_CONTENTION_COUNTS
+ == SMP_LOCK_STATS_CONTENTION_COUNTS,
+ smp_lock_contention_counts
+);
+#endif
+
+static void smp_lock_stats_iterate(
+ rtems_profiling_visitor visitor,
+ void *visitor_arg,
+ rtems_profiling_data *data
+)
+{
+#if defined(RTEMS_PROFILING) && defined(RTEMS_SMP)
+ SMP_lock_Stats_iteration_context iteration_context;
+ SMP_lock_Stats snapshot;
+ char name[64];
+
+ memset(data, 0, sizeof(*data));
+ data->header.type = RTEMS_PROFILING_SMP_LOCK;
+
+ _SMP_lock_Stats_iteration_start(&iteration_context);
+ while (
+ _SMP_lock_Stats_iteration_next(
+ &iteration_context,
+ &snapshot,
+ &name[0],
+ sizeof(name)
+ )
+ ) {
+ rtems_profiling_smp_lock *smp_lock_data = &data->smp_lock;
+
+ smp_lock_data->name = name;
+ smp_lock_data->max_acquire_time =
+ rtems_counter_ticks_to_nanoseconds(snapshot.max_acquire_time);
+ smp_lock_data->max_section_time =
+ rtems_counter_ticks_to_nanoseconds(snapshot.max_section_time);
+ smp_lock_data->usage_count = snapshot.usage_count;
+ smp_lock_data->total_acquire_time =
+ rtems_counter_ticks_to_nanoseconds(snapshot.total_acquire_time);
+ smp_lock_data->total_section_time =
+ rtems_counter_ticks_to_nanoseconds(snapshot.total_section_time);
+
+ memcpy(
+ &smp_lock_data->contention_counts[0],
+ &snapshot.contention_counts[0],
+ sizeof(smp_lock_data->contention_counts)
+ );
+
+ (*visitor)(visitor_arg, data);
+ }
+ _SMP_lock_Stats_iteration_stop(&iteration_context);
+#else
+ (void) visitor;
+ (void) visitor_arg;
+ (void) data;
+#endif
+}
+
void rtems_profiling_iterate(
rtems_profiling_visitor visitor,
void *visitor_arg
@@ -84,4 +145,5 @@ void rtems_profiling_iterate(
rtems_profiling_data data;
per_cpu_stats_iterate(visitor, visitor_arg, &data);
+ smp_lock_stats_iterate(visitor, visitor_arg, &data);
}