diff options
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/include/rtems/record.h | 65 | ||||
-rw-r--r-- | cpukit/include/rtems/recorddata.h | 2 | ||||
-rw-r--r-- | cpukit/libmisc/capture/record-static.c | 13 | ||||
-rw-r--r-- | cpukit/libmisc/capture/record-userext.c | 36 | ||||
-rw-r--r-- | cpukit/libmisc/capture/record.c | 23 |
5 files changed, 55 insertions, 84 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, diff --git a/cpukit/include/rtems/recorddata.h b/cpukit/include/rtems/recorddata.h index 39d465aa7b..4f14984c51 100644 --- a/cpukit/include/rtems/recorddata.h +++ b/cpukit/include/rtems/recorddata.h @@ -46,7 +46,7 @@ extern "C" { typedef enum { /* There are 512 events reserved for the system */ - RTEMS_RECORD_EVENT_OVERFLOW, + RTEMS_RECORD_EVENT_EMPTY, RTEMS_RECORD_EVENT_VERSION, /* Keep in lexicographical order */ diff --git a/cpukit/libmisc/capture/record-static.c b/cpukit/libmisc/capture/record-static.c index f6dfd8b000..825c4412b5 100644 --- a/cpukit/libmisc/capture/record-static.c +++ b/cpukit/libmisc/capture/record-static.c @@ -56,9 +56,7 @@ static void _Record_Watchdog( Per_CPU_Control *cpu ) { - rtems_record_context context_storage; - rtems_record_context *context; - sbintime_t now; + sbintime_t now; _Watchdog_Per_CPU_reinsert_ticks( watchdog, @@ -66,15 +64,10 @@ static void _Record_Watchdog( _Watchdog_Ticks_per_second ); - context = rtems_record_prepare( &context_storage, 2 ); now = _Timecounter_Sbinuptime(); - context = rtems_record_add( - context, + rtems_record_produce_2( RTEMS_RECORD_EVENT_UPTIME_LOW, - (uint32_t) ( now >> 0 ) - ); - rtems_record_commit( - context, + (uint32_t) ( now >> 0 ), RTEMS_RECORD_EVENT_UPTIME_HIGH, (uint32_t) ( now >> 32 ) ); diff --git a/cpukit/libmisc/capture/record-userext.c b/cpukit/libmisc/capture/record-userext.c index 39f61eace8..3a91f64693 100644 --- a/cpukit/libmisc/capture/record-userext.c +++ b/cpukit/libmisc/capture/record-userext.c @@ -33,28 +33,20 @@ bool _Record_Thread_create( struct _Thread_Control *created ) { - rtems_record_context context_storage; - rtems_record_context *context; - Objects_Id id; - - context = rtems_record_prepare( &context_storage, 2 ); - context = rtems_record_add( - context, - RTEMS_RECORD_EVENT_THREAD_CREATED, - created->Object.id - ); + Objects_Id created_by; /* The idle threads are created without an executing thread */ if ( executing != NULL ) { - id = executing->Object.id; + created_by = executing->Object.id; } else { - id = 0; + created_by = 0; } - rtems_record_commit( - context, + rtems_record_produce_2( + RTEMS_RECORD_EVENT_THREAD_CREATED, + created->Object.id, RTEMS_RECORD_EVENT_THREAD_CREATED_BY, - id + created_by ); return true; @@ -65,17 +57,9 @@ void _Record_Thread_delete( struct _Thread_Control *deleted ) { - rtems_record_context context_storage; - rtems_record_context *context; - - context = rtems_record_prepare( &context_storage, 2 ); - context = rtems_record_add( - context, + rtems_record_produce_2( RTEMS_RECORD_EVENT_THREAD_DELETED, - deleted->Object.id - ); - rtems_record_commit( - context, + deleted->Object.id, RTEMS_RECORD_EVENT_THREAD_DELETED_BY, executing->Object.id ); @@ -89,7 +73,7 @@ void _Record_Thread_switch( rtems_record_context context_storage; rtems_record_context *context; - context = rtems_record_prepare( &context_storage, 3 ); + context = rtems_record_prepare( &context_storage ); context = rtems_record_add( context, RTEMS_RECORD_EVENT_THREAD_SWITCH_OUT, diff --git a/cpukit/libmisc/capture/record.c b/cpukit/libmisc/capture/record.c index b87043fbbc..ed9185a300 100644 --- a/cpukit/libmisc/capture/record.c +++ b/cpukit/libmisc/capture/record.c @@ -30,12 +30,9 @@ #include <string.h> -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_prepare_inline( context, count ); + rtems_record_prepare_inline( context ); return context; } @@ -62,10 +59,24 @@ void rtems_record_produce( rtems_record_event event, rtems_record_data data ) { rtems_record_context context; - rtems_record_prepare_inline( &context, 1 ); + rtems_record_prepare_inline( &context ); rtems_record_commit_inline( &context, event, 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 +) +{ + rtems_record_context context; + + rtems_record_prepare_inline( &context ); + rtems_record_add_inline( &context, event_0, data_0 ); + rtems_record_commit_inline( &context, event_1, data_1 ); +} + void rtems_record_drain( rtems_record_visitor visitor, void *arg ) { rtems_record_item item; |