diff options
Diffstat (limited to 'cpukit/include/rtems/record.h')
-rw-r--r-- | cpukit/include/rtems/record.h | 65 |
1 files changed, 24 insertions, 41 deletions
diff --git a/cpukit/include/rtems/record.h b/cpukit/include/rtems/record.h index 8535ce4d06..57b1eaeb8b 100644 --- a/cpukit/include/rtems/record.h +++ b/cpukit/include/rtems/record.h @@ -56,8 +56,6 @@ typedef struct Record_Configured_control Record_Configured_control; typedef struct { Record_Control *control; unsigned int head; - unsigned int increment; - unsigned int final_head; uint32_t now; rtems_interrupt_level level; } rtems_record_context; @@ -106,13 +104,12 @@ static inline unsigned int _Record_Capacity( return ( tail - head - 1U ) & control->mask; } -static inline unsigned int _Record_Increment( +static inline unsigned int _Record_Index( const Record_Control *control, - unsigned int index, - unsigned int increment + unsigned int index ) { - return ( index + increment ) & control->mask; + return index & control->mask; } static inline unsigned int _Record_Head( const Record_Control *control ) @@ -125,22 +122,25 @@ static inline unsigned int _Record_Tail( const Record_Control *control ) return _Atomic_Load_uint( &control->tail, ATOMIC_ORDER_RELAXED ); } +static inline bool _Record_Is_overflow( + const Record_Control *control, + unsigned int tail +) +{ + return _Record_Head( control ) - tail >= ( control->mask + 1U ); +} + static inline rtems_counter_ticks _Record_Now( void ) { return rtems_counter_read(); } -static inline void rtems_record_prepare_inline( - rtems_record_context *context, - unsigned int count -) +static inline void rtems_record_prepare_inline( rtems_record_context *context ) { rtems_interrupt_level level; const Per_CPU_Control *cpu_self; Record_Control *control; unsigned int head; - unsigned int tail; - unsigned int capacity; rtems_interrupt_local_disable( level ); context->now = RTEMS_RECORD_TIME_EVENT( _Record_Now(), 0 ); @@ -149,18 +149,7 @@ static inline void rtems_record_prepare_inline( control = cpu_self->record; context->control = control; head = _Record_Head( control ); - tail = _Record_Tail( control ); - capacity = _Record_Capacity( control, head, tail ); context->head = head; - - if ( RTEMS_PREDICT_TRUE( capacity > count ) ) { - context->increment = 1; - } else { - context->increment = 0; - count = capacity > 0 ? 1U : 0U; - } - - context->final_head = _Record_Increment( control, head, count ); } static inline void rtems_record_add_inline( @@ -175,13 +164,10 @@ static inline void rtems_record_add_inline( control = context->control; head = context->head; - item = &control->Items[ head ]; - context->head = _Record_Increment( control, head, context->increment ); + item = &control->Items[ _Record_Index( control, head ) ]; + context->head = head + 1; - item->event = RTEMS_RECORD_TIME_EVENT( - context->now, - event & -( (uint32_t) context->increment ) - ); + item->event = RTEMS_RECORD_TIME_EVENT( context->now, event ); item->data = data; } @@ -194,23 +180,13 @@ static inline void rtems_record_commit_inline( rtems_record_add_inline( context, event, data ); _Atomic_Store_uint( &context->control->head, - context->final_head, + context->head, ATOMIC_ORDER_RELEASE ); rtems_interrupt_local_enable( context->level ); } -static inline bool rtems_record_is_overflow( - const rtems_record_context *context -) -{ - return context->increment == 0; -} - -rtems_record_context *rtems_record_prepare( - rtems_record_context *context, - unsigned int count -); +rtems_record_context *rtems_record_prepare( rtems_record_context *context ); rtems_record_context *rtems_record_add( rtems_record_context *context, @@ -226,6 +202,13 @@ void rtems_record_commit( void rtems_record_produce( rtems_record_event event, rtems_record_data data ); +void rtems_record_produce_2( + rtems_record_event event_0, + rtems_record_data data_0, + rtems_record_event event_1, + rtems_record_data data_1 +); + typedef void ( *rtems_record_visitor )( const rtems_record_item *items, size_t count, |