record: Dump only once in fatal handling

This commit is contained in:
Sebastian Huber
2024-10-21 02:21:54 +02:00
committed by Chris Johns
parent e72ee949a0
commit 0f2721c832
3 changed files with 91 additions and 16 deletions

View File

@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2020 embedded brains GmbH & Co. KG
* Copyright (C) 2020, 2024 embedded brains GmbH & Co. KG
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -30,7 +30,17 @@
#endif
#include <rtems/recorddump.h>
#include <rtems/bspIo.h>
#include <rtems/score/isrlock.h>
#include <rtems/score/smpimpl.h>
#if ISR_LOCK_NEEDS_OBJECT
static ISR_lock_Control _Record_Dump_base64_lock =
ISR_LOCK_INITIALIZER( "Record Dump base64" );
#endif
static bool _Record_Dump_base64_done;
void _Record_Fatal_dump_base64(
Internal_errors_Source source,
@@ -38,13 +48,36 @@ void _Record_Fatal_dump_base64(
Internal_errors_t code
)
{
ISR_lock_Context lock_context;
rtems_record_produce_2(
RTEMS_RECORD_FATAL_SOURCE,
source,
RTEMS_RECORD_FATAL_CODE,
code
);
#if defined(RTEMS_SMP)
if (
source == RTEMS_FATAL_SOURCE_SMP &&
code == SMP_FATAL_SHUTDOWN_RESPONSE
) {
return;
}
/* Request other online processors to shutdown to stop event generation */
_SMP_Request_shutdown();
#endif
_ISR_lock_Acquire( &_Record_Dump_base64_lock, &lock_context );
if ( !_Record_Dump_base64_done ) {
_Record_Dump_base64_done = true;
printk( "\n*** BEGIN OF RECORDS BASE64 ***\n" );
rtems_record_dump_base64( rtems_put_char, NULL );
printk( "\n*** END OF RECORDS BASE64 ***\n" );
}
_ISR_lock_Release( &_Record_Dump_base64_lock, &lock_context );
}

View File

@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2020 embedded brains GmbH & Co. KG
* Copyright (C) 2020, 2024 embedded brains GmbH & Co. KG
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -30,9 +30,19 @@
#endif
#include <rtems/recorddump.h>
#include <rtems/bspIo.h>
static rtems_record_dump_base64_zlib_context context;
#include <rtems/bspIo.h>
#include <rtems/score/isrlock.h>
#include <rtems/score/smpimpl.h>
#if ISR_LOCK_NEEDS_OBJECT
static ISR_lock_Control _Record_Dump_base64_zlib_lock =
ISR_LOCK_INITIALIZER( "Record Dump base64 zlib" );
#endif
static bool _Record_Dump_base64_zlib_done;
static rtems_record_dump_base64_zlib_context _Record_Dump_base64_zlib_context;
void _Record_Fatal_dump_base64_zlib(
Internal_errors_Source source,
@@ -40,13 +50,40 @@ void _Record_Fatal_dump_base64_zlib(
Internal_errors_t code
)
{
ISR_lock_Context lock_context;
rtems_record_produce_2(
RTEMS_RECORD_FATAL_SOURCE,
source,
RTEMS_RECORD_FATAL_CODE,
code
);
#if defined(RTEMS_SMP)
if (
source == RTEMS_FATAL_SOURCE_SMP &&
code == SMP_FATAL_SHUTDOWN_RESPONSE
) {
return;
}
/* Request other online processors to shutdown to stop event generation */
_SMP_Request_shutdown();
#endif
_ISR_lock_Acquire( &_Record_Dump_base64_zlib_lock, &lock_context );
if ( !_Record_Dump_base64_zlib_done ) {
_Record_Dump_base64_zlib_done = true;
printk( "\n*** BEGIN OF RECORDS BASE64 ZLIB ***\n" );
rtems_record_dump_zlib_base64( &context, rtems_put_char, NULL );
rtems_record_dump_zlib_base64(
&_Record_Dump_base64_zlib_context,
rtems_put_char,
NULL
);
printk( "\n*** END OF RECORDS BASE64 ZLIB ***\n" );
}
_ISR_lock_Release( &_Record_Dump_base64_zlib_lock, &lock_context );
}

View File

@@ -80,14 +80,18 @@ static rtems_record_client_status client_handler(
return RTEMS_RECORD_CLIENT_SUCCESS;
}
static void generate_events(void)
static void wait(void)
{
int i;
uint32_t level;
for (i = 0; i < 10; ++i) {
rtems_task_wake_after(1);
}
}
static void generate_events(void)
{
uint32_t level;
rtems_record_line();
rtems_record_line_2(RTEMS_RECORD_USER_0, 0);
@@ -187,6 +191,7 @@ static void Init(rtems_task_argument arg)
TEST_BEGIN();
ctx = &test_instance;
wait();
generate_events();
cs = rtems_record_client_init(&ctx->client, client_handler, NULL);
@@ -203,11 +208,9 @@ static void Init(rtems_task_argument arg)
rtems_record_client_destroy(&ctx->client);
wait();
generate_events();
_Record_Fatal_dump_base64(RTEMS_FATAL_SOURCE_APPLICATION, false, 123);
generate_events();
rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, 0 );
}
static void fatal_extension(
@@ -216,6 +219,8 @@ static void fatal_extension(
rtems_fatal_code code
)
{
generate_events();
_Record_Fatal_dump_base64(source, always_set_to_false, code);
TEST_END();
}