File indexing completed on 2025-05-11 08:24:21
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifdef HAVE_CONFIG_H
0029 #include "config.h"
0030 #endif
0031
0032 #include <rtems/recorddump.h>
0033 #include <rtems/score/threadimpl.h>
0034
0035 typedef struct {
0036 rtems_record_dump_chunk chunk;
0037 void *arg;
0038 } dump_context;
0039
0040 static void dump_chunk( dump_context *ctx, const void *data, size_t length )
0041 {
0042 ( *ctx->chunk )( ctx->arg, data, length );
0043 }
0044
0045 static bool thread_names_visitor( rtems_tcb *tcb, void *arg )
0046 {
0047 dump_context *ctx;
0048 char name[ 2 * THREAD_DEFAULT_MAXIMUM_NAME_SIZE ];
0049 size_t n;
0050 size_t i;
0051 rtems_record_item item;
0052 rtems_record_data data;
0053
0054 ctx = arg;
0055 item.event = RTEMS_RECORD_THREAD_ID;
0056 item.data = tcb->Object.id;
0057 dump_chunk( ctx, &item, sizeof( item ) );
0058
0059 n = _Thread_Get_name( tcb, name, sizeof( name ) );
0060 i = 0;
0061
0062 while ( i < n ) {
0063 size_t j;
0064
0065 data = 0;
0066
0067 for ( j = 0; i < n && j < sizeof( data ); ++j ) {
0068 rtems_record_data c;
0069
0070 c = (unsigned char) name[ i ];
0071 data |= c << ( j * 8 );
0072 ++i;
0073 }
0074
0075 item.event = RTEMS_RECORD_THREAD_NAME;
0076 item.data = data;
0077 dump_chunk( ctx, &item, sizeof( item ) );
0078 }
0079
0080 return false;
0081 }
0082
0083 void rtems_record_dump(
0084 rtems_record_dump_chunk chunk,
0085 void *arg
0086 )
0087 {
0088 Record_Stream_header header;
0089 size_t size;
0090 dump_context ctx;
0091 rtems_record_fetch_control control;
0092 rtems_record_item items[ 128 ];
0093 rtems_record_fetch_status status;
0094
0095 ctx.chunk = chunk;
0096 ctx.arg = arg;
0097
0098 size = _Record_Stream_header_initialize( &header );
0099 dump_chunk( &ctx, &header, size );
0100 _Thread_Iterate( thread_names_visitor, &ctx );
0101 rtems_record_fetch_initialize(
0102 &control,
0103 &items[ 0 ],
0104 RTEMS_ARRAY_SIZE( items )
0105 );
0106
0107 do {
0108 status = rtems_record_fetch( &control );
0109 dump_chunk(
0110 &ctx,
0111 control.fetched_items,
0112 control.fetched_count * sizeof( *control.fetched_items )
0113 );
0114 } while ( status == RTEMS_RECORD_FETCH_CONTINUE );
0115 }