record: Add rtems_record_dump()

Add rtems_record_dump_base64() and rtems_record_dump_base64_zlib().

Add CONFIGURE_RECORD_FATAL_DUMP_BASE64 and
CONFIGURE_RECORD_FATAL_DUMP_BASE64_ZLIB configuration options.

Update #3904.
This commit is contained in:
Sebastian Huber
2020-03-12 18:29:48 +01:00
parent c584d4eda4
commit ab42b3e100
12 changed files with 664 additions and 29 deletions

View File

@@ -471,6 +471,11 @@ librtemscpu_a_SOURCES += libstdthreads/thrd.c
librtemscpu_a_SOURCES += libstdthreads/tss.c
librtemscpu_a_SOURCES += libtrace/record/record.c
librtemscpu_a_SOURCES += libtrace/record/record-client.c
librtemscpu_a_SOURCES += libtrace/record/record-dump.c
librtemscpu_a_SOURCES += libtrace/record/record-dump-fatal.c
librtemscpu_a_SOURCES += libtrace/record/record-dump-zfatal.c
librtemscpu_a_SOURCES += libtrace/record/record-dump-base64.c
librtemscpu_a_SOURCES += libtrace/record/record-dump-zbase64.c
librtemscpu_a_SOURCES += libtrace/record/record-server.c
librtemscpu_a_SOURCES += libtrace/record/record-sysinit.c
librtemscpu_a_SOURCES += libtrace/record/record-text.c

View File

@@ -139,6 +139,7 @@ include_rtems_HEADERS += include/rtems/rbtree.h
include_rtems_HEADERS += include/rtems/record.h
include_rtems_HEADERS += include/rtems/recordclient.h
include_rtems_HEADERS += include/rtems/recorddata.h
include_rtems_HEADERS += include/rtems/recorddump.h
include_rtems_HEADERS += include/rtems/recordserver.h
include_rtems_HEADERS += include/rtems/ringbuf.h
include_rtems_HEADERS += include/rtems/rtc.h

View File

@@ -79,7 +79,23 @@ extern "C" {
const User_extensions_Table _User_extensions_Initial_extensions[] = {
#if CONFIGURE_RECORD_PER_PROCESSOR_ITEMS > 0 \
&& defined(CONFIGURE_RECORD_EXTENSIONS_ENABLED)
RECORD_EXTENSION,
{
_Record_Thread_create,
_Record_Thread_start,
_Record_Thread_restart,
_Record_Thread_delete,
_Record_Thread_switch,
_Record_Thread_begin,
_Record_Thread_exitted,
#ifdef CONFIGURE_RECORD_FATAL_DUMP_BASE64_ZLIB
_Record_Fatal_dump_base64_zlib,
#elif defined(CONFIGURE_RECORD_FATAL_DUMP_BASE64)
_Record_Fatal_dump_base64,
#else
NULL,
#endif
_Record_Thread_terminate
},
#endif
#ifdef _CONFIGURE_ENABLE_NEWLIB_REENTRANCY
RTEMS_NEWLIB_EXTENSION,

View File

@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (C) 2018, 2019 embedded brains GmbH
* Copyright (C) 2018, 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -32,6 +32,7 @@
#include <rtems/score/atomic.h>
#include <rtems/score/cpu.h>
#include <rtems/score/interr.h>
#include <rtems/score/percpu.h>
#include <rtems/score/watchdog.h>
#include <rtems/counter.h>
@@ -95,23 +96,22 @@ void _Record_Thread_begin( struct _Thread_Control *executing );
void _Record_Thread_exitted( struct _Thread_Control *executing );
void _Record_Fatal_dump_base64(
Internal_errors_Source source,
bool always_set_to_false,
Internal_errors_t code
);
void _Record_Fatal_dump_base64_zlib(
Internal_errors_Source source,
bool always_set_to_false,
Internal_errors_t code
);
void _Record_Thread_terminate(
struct _Thread_Control *executing
);
#define RECORD_EXTENSION \
{ \
_Record_Thread_create, \
_Record_Thread_start, \
_Record_Thread_restart, \
_Record_Thread_delete, \
_Record_Thread_switch, \
_Record_Thread_begin, \
_Record_Thread_exitted, \
NULL, \
_Record_Thread_terminate \
}
RTEMS_INLINE_ROUTINE unsigned int _Record_Index(
const Record_Control *control,
unsigned int index

View File

@@ -0,0 +1,118 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef _RTEMS_RECORDDUMP_H
#define _RTEMS_RECORDDUMP_H
#include <rtems/record.h>
#include <zlib.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/**
* @addtogroup RTEMSRecord
*
* @{
*/
/**
* @brief Handler for record dumps to output a chunk of data.
*
* @param arg The argument passed to rtems_record_dump().
* @param data The begin of the data chunk.
* @param length The length in bytes of the data chunk.
*/
typedef void ( *rtems_record_dump_chunk )(
void *arg,
const void *data,
size_t length
);
/**
* @brief Dumps the record header, the thread names, and all items of all
* processors.
*
* @param chunk Handler to dump a chunk of data.
* @param flush Handler to flush the data.
* @param arg The argument for the handlers.
*/
void rtems_record_dump(
rtems_record_dump_chunk chunk,
void *arg
);
/**
* @brief Dumps the event records in base64 encoding.
*
* @param put_char The put char handler.
* @param arg The argument for the put char handler.
*
* @see rtems_record_dump().
*/
void rtems_record_dump_base64( void ( *put_char )( int, void * ), void *arg );
/**
* @brief The context for record dumps with zlib compression and base64
* encoding.
*/
typedef struct {
void ( *put_char )( int, void * );
void *arg;
int out;
unsigned char buf[ 57 ];
z_stream stream;
char *mem_begin;
size_t mem_available;
char mem[ 0x80000 ];
} rtems_record_dump_base64_zlib_context;
/**
* @brief Dumps the event records compressed with zlib in base64 encoding.
*
* @param ctx The context to perform the record dump with zlib compression and
* base64 encoding. This context is too large for normal stack sizes.
* @param put_char The put char handler.
* @param arg The argument for the put char handler.
*
* @see rtems_record_dump().
*/
void rtems_record_dump_zlib_base64(
rtems_record_dump_base64_zlib_context *ctx,
void ( *put_char )( int, void * ),
void *arg
);
/** @} */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _RTEMS_RECORDDUMP_H */

View File

@@ -0,0 +1,110 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/recorddump.h>
#include <rtems/score/io.h>
#include <limits.h>
#include <string.h>
typedef struct {
IO_Put_char put_char;
void *arg;
int out;
size_t index;
char buf[ 57 ];
} dump_context;
static void put_char( int c, void *arg )
{
dump_context *ctx;
ctx = arg;
( *ctx->put_char )( c, ctx->arg );
++ctx->out;
if ( ctx->out >= 76 ) {
ctx->out = 0;
( *ctx->put_char )( '\n', ctx->arg );
}
}
static void chunk( void *arg, const void *data, size_t length )
{
dump_context *ctx;
size_t index;
const char *in;
const void *end;
ctx = arg;
index = ctx->index;
in = data;
end = in + length;
while ( in != end ) {
ctx->buf[ index ] = *in;
++in;
if ( index == RTEMS_ARRAY_SIZE( ctx->buf ) - 1 ) {
index = 0;
_IO_Base64(
put_char,
ctx,
ctx->buf,
sizeof( ctx->buf ),
NULL,
INT_MAX
);
} else {
++index;
}
}
ctx->index = index;
}
static void flush( dump_context *ctx )
{
_IO_Base64( put_char, ctx, ctx->buf, ctx->index, NULL, INT_MAX );
}
void rtems_record_dump_base64( IO_Put_char put_char, void *arg )
{
dump_context ctx;
memset( &ctx, 0, sizeof( ctx ) );
ctx.put_char = put_char;
ctx.arg = arg;
rtems_record_dump( chunk, &ctx );
flush( &ctx );
}

View File

@@ -0,0 +1,50 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/recorddump.h>
#include <rtems/bspIo.h>
void _Record_Fatal_dump_base64(
Internal_errors_Source source,
bool always_set_to_false,
Internal_errors_t code
)
{
rtems_record_produce_2(
RTEMS_RECORD_FATAL_SOURCE,
source,
RTEMS_RECORD_FATAL_CODE,
code
);
printk( "\n*** BEGIN OF RECORDS BASE64 ***\n" );
rtems_record_dump_base64( rtems_put_char, NULL );
printk( "\n*** END OF RECORDS BASE64 ***\n" );
}

View File

@@ -0,0 +1,160 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/recorddump.h>
#include <rtems/score/io.h>
#include <limits.h>
#include <string.h>
static void *dump_zalloc( void *opaque, unsigned items, unsigned size )
{
rtems_record_dump_base64_zlib_context *ctx;
char *mem_begin;
size_t mem_available;
ctx = opaque;
size *= items;
mem_available = ctx->mem_available;
if ( mem_available < size ) {
return NULL;
}
mem_begin = ctx->mem_begin;
ctx->mem_begin = mem_begin + size;
ctx->mem_available = mem_available - size;
return mem_begin;
}
static void dump_zfree( void *opaque, void *ptr )
{
(void) opaque;
(void) ptr;
}
static void put_char( int c, void *arg )
{
rtems_record_dump_base64_zlib_context *ctx;
ctx = arg;
( *ctx->put_char )( c, ctx->arg );
++ctx->out;
if ( ctx->out >= 76 ) {
ctx->out = 0;
( *ctx->put_char )( '\n', ctx->arg );
}
}
static void chunk( void *arg, const void *data, size_t length )
{
rtems_record_dump_base64_zlib_context *ctx;
ctx = arg;
ctx->stream.next_in = RTEMS_DECONST( void *, data );
ctx->stream.avail_in = length;
while ( ctx->stream.avail_in > 0 ) {
int err;
err = deflate( &ctx->stream, Z_NO_FLUSH );
if ( err != Z_OK ) {
return;
}
if ( ctx->stream.avail_out == 0 ) {
ctx->stream.next_out = &ctx->buf[ 0 ];
ctx->stream.avail_out = sizeof( ctx->buf );
_IO_Base64( put_char, ctx, ctx->buf, sizeof( ctx->buf ), NULL, INT_MAX );
}
}
}
static void flush( rtems_record_dump_base64_zlib_context *ctx )
{
while ( true ) {
int err;
err = deflate( &ctx->stream, Z_FINISH );
if ( err != Z_OK ) {
break;
}
if ( ctx->stream.avail_out == 0 ) {
ctx->stream.next_out = &ctx->buf[ 0 ];
ctx->stream.avail_out = sizeof( ctx->buf );
_IO_Base64( put_char, ctx, ctx->buf, sizeof( ctx->buf ), NULL, INT_MAX );
}
}
_IO_Base64(
put_char,
ctx,
ctx->buf,
sizeof( ctx->buf ) - ctx->stream.avail_out,
NULL,
INT_MAX
);
}
void rtems_record_dump_zlib_base64(
rtems_record_dump_base64_zlib_context *ctx,
void ( *put_char )( int, void * ),
void *arg
)
{
int err;
ctx->put_char = put_char;
ctx->arg = arg;
ctx->out = 0;
ctx->stream.zalloc = dump_zalloc;
ctx->stream.zfree = dump_zfree;
ctx->stream.opaque = ctx;
ctx->mem_begin = &ctx->mem[ 0 ];
ctx->mem_available = sizeof( ctx->mem );
err = deflateInit( &ctx->stream, Z_BEST_COMPRESSION );
if (err != Z_OK) {
return;
}
ctx->stream.next_out = &ctx->buf[ 0 ];
ctx->stream.avail_out = sizeof( ctx->buf );
rtems_record_dump( chunk, ctx );
flush( ctx );
deflateEnd( &ctx->stream );
}

View File

@@ -0,0 +1,52 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/recorddump.h>
#include <rtems/bspIo.h>
static rtems_record_dump_base64_zlib_context context;
void _Record_Fatal_dump_base64_zlib(
Internal_errors_Source source,
bool always_set_to_false,
Internal_errors_t code
)
{
rtems_record_produce_2(
RTEMS_RECORD_FATAL_SOURCE,
source,
RTEMS_RECORD_FATAL_CODE,
code
);
printk( "\n*** BEGIN OF RECORDS BASE64 ZLIB ***\n" );
rtems_record_dump_zlib_base64( &context, rtems_put_char, NULL );
printk( "\n*** END OF RECORDS BASE64 ZLIB ***\n" );
}

View File

@@ -0,0 +1,108 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* Copyright (C) 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
#if HAVE_CONFIG_H
#include "config.h"
#endif
#include <rtems/recorddump.h>
#include <rtems/score/threadimpl.h>
typedef struct {
rtems_record_dump_chunk chunk;
void *arg;
} dump_context;
static void dump_chunk( dump_context *ctx, const void *data, size_t length )
{
( *ctx->chunk )( ctx->arg, data, length );
}
static bool thread_names_visitor( rtems_tcb *tcb, void *arg )
{
dump_context *ctx;
char name[ 2 * THREAD_DEFAULT_MAXIMUM_NAME_SIZE ];
size_t n;
size_t i;
rtems_record_item item;
rtems_record_data data;
ctx = arg;
item.event = RTEMS_RECORD_THREAD_ID;
item.data = tcb->Object.id;
dump_chunk( ctx, &item, sizeof( item ) );
n = _Thread_Get_name( tcb, name, sizeof( name ) );
i = 0;
while ( i < n ) {
size_t j;
data = 0;
for ( j = 0; i < n && j < sizeof( data ); ++j ) {
rtems_record_data c;
c = (unsigned char) name[ i ];
data |= c << ( j * 8 );
++i;
}
item.event = RTEMS_RECORD_THREAD_NAME;
item.data = data;
dump_chunk( ctx, &item, sizeof( item ) );
}
return false;
}
static void drain_visitor(
const rtems_record_item *items,
size_t count,
void *arg
)
{
dump_chunk( arg, items, count * sizeof( *items ) );
}
void rtems_record_dump(
rtems_record_dump_chunk chunk,
void *arg
)
{
Record_Stream_header header;
size_t size;
dump_context ctx;
ctx.chunk = chunk;
ctx.arg = arg;
size = _Record_Stream_header_initialize( &header );
dump_chunk( &ctx, &header, size );
rtems_task_iterate( thread_names_visitor, &ctx );
rtems_record_drain( drain_visitor, &ctx );
}

View File

@@ -1124,6 +1124,7 @@ lib_docs += record02/record02.doc
record02_SOURCES = record02/init.c
record02_CPPFLAGS = $(AM_CPPFLAGS) $(TEST_FLAGS_record02) \
$(support_includes)
record02_LDADD = $(RTEMS_ROOT)cpukit/librtemscpu.a $(RTEMS_ROOT)cpukit/libz.a $(LDADD)
endif
if TEST_rtmonuse

View File

@@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-2-Clause */
/*
* SPDX-License-Identifier: BSD-2-Clause
*
* Copyright (C) 2018, 2019 embedded brains GmbH
* Copyright (C) 2018, 2020 embedded brains GmbH (http://www.embedded-brains.de)
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -94,18 +94,11 @@ static void drain_visitor(
rtems_test_assert(cs == RTEMS_RECORD_CLIENT_SUCCESS);
}
static void Init(rtems_task_argument arg)
static void generate_events(void)
{
test_context *ctx;
Record_Stream_header header;
size_t size;
rtems_record_client_status cs;
int i;
uint32_t level;
TEST_BEGIN();
ctx = &test_instance;
for (i = 0; i < 10; ++i) {
rtems_task_wake_after(1);
}
@@ -160,6 +153,19 @@ static void Init(rtems_task_argument arg)
rtems_record_exit_10(RTEMS_RECORD_USER_4, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
level = rtems_record_interrupt_disable();
rtems_record_interrupt_enable(level);
}
static void Init(rtems_task_argument arg)
{
test_context *ctx;
Record_Stream_header header;
size_t size;
rtems_record_client_status cs;
TEST_BEGIN();
ctx = &test_instance;
generate_events();
rtems_record_client_init(&ctx->client, client_handler, NULL);
size = _Record_Stream_header_initialize(&header);
@@ -168,6 +174,12 @@ static void Init(rtems_task_argument arg)
rtems_record_drain(drain_visitor, ctx);
rtems_record_client_destroy(&ctx->client);
generate_events();
_Record_Fatal_dump_base64(RTEMS_FATAL_SOURCE_APPLICATION, false, 123);
generate_events();
TEST_END();
rtems_test_exit(0);
}
@@ -182,10 +194,12 @@ static void Init(rtems_task_argument arg)
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
#define CONFIGURE_RECORD_PER_PROCESSOR_ITEMS 256
#define CONFIGURE_RECORD_PER_PROCESSOR_ITEMS 512
#define CONFIGURE_RECORD_EXTENSIONS_ENABLED
#define CONFIGURE_RECORD_FATAL_DUMP_BASE64_ZLIB
#define CONFIGURE_INIT
#include <rtems/confdefs.h>