summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2019-08-17 13:25:57 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2019-08-17 19:01:14 +0200
commit2ef2c14f8ae87bc97aee48247987f0c2edc5dcd6 (patch)
tree9dffcc8ba1e2e53730ce3dbda6b55c0bfcf448ce
parentrecord: Improve overflow handling (diff)
downloadrtems-2ef2c14f8ae87bc97aee48247987f0c2edc5dcd6.tar.bz2
record: Increase client robustness
Do nothing after errors.
-rw-r--r--cpukit/include/rtems/recordclient.h1
-rw-r--r--cpukit/libtrace/record/record-client.c43
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 );