From 2ef2c14f8ae87bc97aee48247987f0c2edc5dcd6 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Sat, 17 Aug 2019 13:25:57 +0200 Subject: record: Increase client robustness Do nothing after errors. --- cpukit/include/rtems/recordclient.h | 1 + cpukit/libtrace/record/record-client.c | 43 ++++++++++++++++++++++++++-------- 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/cpukit/include/rtems/recordclient.h b/cpukit/include/rtems/recordclient.h index d6fe5b8056..35963bd87c 100644 --- a/cpukit/include/rtems/recordclient.h +++ b/cpukit/include/rtems/recordclient.h @@ -152,6 +152,7 @@ typedef struct rtems_record_client_context { rtems_record_client_handler handler; void *handler_arg; uint32_t header[ 2 ]; + rtems_record_client_status status; } rtems_record_client_context; /** diff --git a/cpukit/libtrace/record/record-client.c b/cpukit/libtrace/record/record-client.c index d97fe51b03..4cf88c6edf 100644 --- a/cpukit/libtrace/record/record-client.c +++ b/cpukit/libtrace/record/record-client.c @@ -47,6 +47,29 @@ static rtems_record_client_status visit( uint64_t data ); +static rtems_record_client_status consume_error( + rtems_record_client_context *ctx, + const void *buf, + size_t n +) +{ + (void) buf; + (void) n; + + return ctx->status; +} + +static rtems_record_client_status error( + rtems_record_client_context *ctx, + rtems_record_client_status status +) +{ + ctx->status = status; + ctx->consume = consume_error; + + return status; +} + static void set_to_bt_scaler( rtems_record_client_context *ctx, uint32_t frequency @@ -220,11 +243,11 @@ static rtems_record_client_status process_per_cpu_count( uint32_t cpu; if ( ctx->count != 0 ) { - return RTEMS_RECORD_CLIENT_ERROR_DOUBLE_PER_CPU_COUNT; + return error( ctx, RTEMS_RECORD_CLIENT_ERROR_DOUBLE_PER_CPU_COUNT ); } if ( ctx->cpu_count == 0 ) { - return RTEMS_RECORD_CLIENT_ERROR_NO_CPU_MAX; + return error( ctx, RTEMS_RECORD_CLIENT_ERROR_NO_CPU_MAX ); } ctx->count = (uint32_t) data; @@ -238,7 +261,7 @@ static rtems_record_client_status process_per_cpu_count( items = malloc( per_cpu_items * ctx->cpu_count * sizeof( *items ) ); if ( items == NULL ) { - return RTEMS_RECORD_CLIENT_ERROR_NO_MEMORY; + return error( ctx, RTEMS_RECORD_CLIENT_ERROR_NO_MEMORY ); } for ( cpu = 0; cpu < ctx->cpu_count; ++cpu ) { @@ -267,7 +290,7 @@ static rtems_record_client_status hold_back( per_cpu->items[ item_index ].data = data; per_cpu->item_index = item_index + 1; } else { - return RTEMS_RECORD_CLIENT_ERROR_PER_CPU_ITEMS_OVERFLOW; + return error( ctx, RTEMS_RECORD_CLIENT_ERROR_PER_CPU_ITEMS_OVERFLOW ); } } else { return call_handler( ctx, 0, RTEMS_RECORD_GET_EVENT( time_event ), data ); @@ -295,7 +318,7 @@ static rtems_record_client_status visit( switch ( event ) { case RTEMS_RECORD_PROCESSOR: if ( data >= ctx->cpu_count ) { - return RTEMS_RECORD_CLIENT_ERROR_UNSUPPORTED_CPU; + return error( ctx, RTEMS_RECORD_CLIENT_ERROR_UNSUPPORTED_CPU ); } ctx->cpu = (uint32_t) data; @@ -320,11 +343,11 @@ static rtems_record_client_status visit( break; case RTEMS_RECORD_PROCESSOR_MAXIMUM: if ( data >= RTEMS_RECORD_CLIENT_MAXIMUM_CPU_COUNT ) { - return RTEMS_RECORD_CLIENT_ERROR_UNSUPPORTED_CPU_MAX; + return error( ctx, RTEMS_RECORD_CLIENT_ERROR_UNSUPPORTED_CPU_MAX ); } if ( ctx->cpu_count != 0 ) { - return RTEMS_RECORD_CLIENT_ERROR_DOUBLE_CPU_MAX; + return error( ctx, RTEMS_RECORD_CLIENT_ERROR_DOUBLE_CPU_MAX ); } ctx->cpu_count = (uint32_t) data + 1; @@ -342,7 +365,7 @@ static rtems_record_client_status visit( break; case RTEMS_RECORD_VERSION: if ( data != RTEMS_RECORD_THE_VERSION ) { - return RTEMS_RECORD_CLIENT_ERROR_UNSUPPORTED_VERSION; + return error( ctx, RTEMS_RECORD_CLIENT_ERROR_UNSUPPORTED_VERSION ); } break; @@ -601,11 +624,11 @@ static rtems_record_client_status consume_init( #error "unexpected __BYTE_ORDER__" #endif default: - return RTEMS_RECORD_CLIENT_ERROR_UNKNOWN_FORMAT; + return error( ctx, RTEMS_RECORD_CLIENT_ERROR_UNKNOWN_FORMAT ); } if ( magic != RTEMS_RECORD_MAGIC ) { - return RTEMS_RECORD_CLIENT_ERROR_INVALID_MAGIC; + return error( ctx, RTEMS_RECORD_CLIENT_ERROR_INVALID_MAGIC ); } return rtems_record_client_run( ctx, buf, n ); -- cgit v1.2.3