source: rtems/cpukit/score/src/profilingsmplock.c @ 21275b58

5
Last change on this file since 21275b58 was 5fc727f, checked in by Sebastian Huber <sebastian.huber@…>, on 11/26/18 at 07:25:36

score: <rtems/score/smplockstats.h>

Remove <rtems/score/chainimpl.h> include from
<rtems/score/smplockstats.h>.

Close #3598.

  • Property mode set to 100644
File size: 4.9 KB
Line 
1/*
2 * Copyright (c) 2014, 2018 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.org/license/LICENSE.
13 */
14
15#ifdef HAVE_CONFIG_H
16  #include "config.h"
17#endif
18
19#include <rtems/score/smplock.h>
20#include <rtems/score/chainimpl.h>
21
22#include <string.h>
23
24#if defined(RTEMS_SMP) && defined(RTEMS_PROFILING)
25
26typedef struct {
27  SMP_lock_Control Lock;
28  Chain_Control Stats_chain;
29  Chain_Control Iterator_chain;
30} SMP_lock_Stats_control;
31
32static SMP_lock_Stats_control _SMP_lock_Stats_control = {
33  .Lock = {
34    .Ticket_lock = {
35      .next_ticket = ATOMIC_INITIALIZER_UINT( 0U ),
36      .now_serving = ATOMIC_INITIALIZER_UINT( 0U )
37    },
38    .Stats = {
39      .Node = CHAIN_NODE_INITIALIZER_ONE_NODE_CHAIN(
40        &_SMP_lock_Stats_control.Stats_chain
41      ),
42      .name = "SMP Lock Stats"
43    }
44  },
45  .Stats_chain = CHAIN_INITIALIZER_ONE_NODE(
46    &_SMP_lock_Stats_control.Lock.Stats.Node
47  ),
48  .Iterator_chain = CHAIN_INITIALIZER_EMPTY(
49    _SMP_lock_Stats_control.Iterator_chain
50  )
51};
52
53void _SMP_lock_Stats_destroy( SMP_lock_Stats *stats )
54{
55  if ( !_Chain_Is_node_off_chain( &stats->Node ) ) {
56    SMP_lock_Stats_control *control = &_SMP_lock_Stats_control;
57    SMP_lock_Context lock_context;
58    SMP_lock_Stats_iteration_context *iteration_context;
59    SMP_lock_Stats_iteration_context *iteration_context_tail;
60    SMP_lock_Stats *next_stats;
61
62    _SMP_lock_ISR_disable_and_acquire( &control->Lock, &lock_context );
63
64    next_stats = (SMP_lock_Stats *) _Chain_Next( &stats->Node );
65    _Chain_Extract_unprotected( &stats->Node );
66
67    iteration_context = (SMP_lock_Stats_iteration_context *)
68      _Chain_First( &control->Iterator_chain );
69    iteration_context_tail = (SMP_lock_Stats_iteration_context *)
70      _Chain_Tail( &control->Iterator_chain );
71
72    while ( iteration_context != iteration_context_tail ) {
73      if ( iteration_context->current == stats ) {
74        iteration_context->current = next_stats;
75      }
76
77      iteration_context = (SMP_lock_Stats_iteration_context *)
78        _Chain_Next( &iteration_context->Node );
79    }
80
81    _SMP_lock_Release_and_ISR_enable( &control->Lock, &lock_context );
82  }
83}
84
85void _SMP_lock_Stats_register_or_max_section_time(
86  SMP_lock_Stats    *stats,
87  CPU_Counter_ticks  max_section_time
88)
89{
90  stats->max_section_time = max_section_time;
91
92  if ( _Chain_Is_node_off_chain( &stats->Node ) ) {
93    SMP_lock_Stats_control *control;
94    SMP_lock_Context        lock_context;
95
96    control = &_SMP_lock_Stats_control;
97    _SMP_lock_ISR_disable_and_acquire( &control->Lock, &lock_context );
98    _Chain_Append_unprotected( &control->Stats_chain, &stats->Node );
99    _SMP_lock_Release_and_ISR_enable( &control->Lock, &lock_context );
100  }
101}
102
103void _SMP_lock_Stats_iteration_start(
104  SMP_lock_Stats_iteration_context *iteration_context
105)
106{
107  SMP_lock_Stats_control *control = &_SMP_lock_Stats_control;
108  SMP_lock_Context lock_context;
109
110  _SMP_lock_ISR_disable_and_acquire( &control->Lock, &lock_context );
111
112  _Chain_Initialize_node( &iteration_context->Node );
113  _Chain_Append_unprotected(
114    &control->Iterator_chain,
115    &iteration_context->Node
116  );
117  iteration_context->current =
118    (SMP_lock_Stats *) _Chain_First( &control->Stats_chain );
119
120  _SMP_lock_Release_and_ISR_enable( &control->Lock, &lock_context );
121}
122
123bool _SMP_lock_Stats_iteration_next(
124  SMP_lock_Stats_iteration_context *iteration_context,
125  SMP_lock_Stats                   *snapshot,
126  char                             *name,
127  size_t                            name_size
128)
129{
130  SMP_lock_Stats_control *control = &_SMP_lock_Stats_control;
131  SMP_lock_Context lock_context;
132  SMP_lock_Stats *current;
133  bool valid;
134
135  _SMP_lock_ISR_disable_and_acquire( &control->Lock, &lock_context );
136
137  current = iteration_context->current;
138  if ( !_Chain_Is_tail( &control->Stats_chain, &current->Node ) ) {
139    size_t name_len = current->name != NULL ? strlen(current->name) : 0;
140
141    valid = true;
142
143    iteration_context->current = (SMP_lock_Stats *)
144      _Chain_Next( &current->Node );
145
146    *snapshot = *current;
147    snapshot->name = name;
148
149    if ( name_len >= name_size ) {
150      name_len = name_size - 1;
151    }
152
153    name[name_len] = '\0';
154    memcpy(name, current->name, name_len);
155  } else {
156    valid = false;
157  }
158
159  _SMP_lock_Release_and_ISR_enable( &control->Lock, &lock_context );
160
161  return valid;
162}
163
164void _SMP_lock_Stats_iteration_stop(
165  SMP_lock_Stats_iteration_context *iteration_context
166)
167{
168  SMP_lock_Stats_control *control = &_SMP_lock_Stats_control;
169  SMP_lock_Context lock_context;
170
171  _SMP_lock_ISR_disable_and_acquire( &control->Lock, &lock_context );
172  _Chain_Extract_unprotected( &iteration_context->Node );
173  _SMP_lock_Release_and_ISR_enable( &control->Lock, &lock_context );
174}
175
176#endif /* RTEMS_SMP && RTEMS_PROFILING */
Note: See TracBrowser for help on using the repository browser.