diff options
Diffstat (limited to 'testsuites')
243 files changed, 10149 insertions, 9459 deletions
diff --git a/testsuites/ada/tmtests/tm01/init.c b/testsuites/ada/tmtests/tm01/init.c index 6c9ec3ff44..3154b15062 100644 --- a/testsuites/ada/tmtests/tm01/init.c +++ b/testsuites/ada/tmtests/tm01/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 1" #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm02/init.c b/testsuites/ada/tmtests/tm02/init.c index 84fc053e17..f393301465 100644 --- a/testsuites/ada/tmtests/tm02/init.c +++ b/testsuites/ada/tmtests/tm02/init.c @@ -42,7 +42,6 @@ #define ADA_TEST_NAME "ADA TM 2" #define CONFIGURE_MAXIMUM_TIMERS 110 #define CONFIGURE_MAXIMUM_SEMAPHORES 101 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm03/init.c b/testsuites/ada/tmtests/tm03/init.c index 9e88b1cb55..5db2cc861e 100644 --- a/testsuites/ada/tmtests/tm03/init.c +++ b/testsuites/ada/tmtests/tm03/init.c @@ -42,7 +42,6 @@ #define ADA_TEST_NAME "ADA TM 3" #define CONFIGURE_MAXIMUM_TIMERS 110 #define CONFIGURE_MAXIMUM_SEMAPHORES 101 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm04/init.c b/testsuites/ada/tmtests/tm04/init.c index 826795e729..2f4312d1f9 100644 --- a/testsuites/ada/tmtests/tm04/init.c +++ b/testsuites/ada/tmtests/tm04/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 4" #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm05/init.c b/testsuites/ada/tmtests/tm05/init.c index 9e0036e809..206e20af07 100644 --- a/testsuites/ada/tmtests/tm05/init.c +++ b/testsuites/ada/tmtests/tm05/init.c @@ -42,7 +42,6 @@ #define ADA_TEST_NAME "ADA TM 5" #define CONFIGURE_MAXIMUM_TIMERS 110 #define CONFIGURE_MAXIMUM_SEMAPHORES 101 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm06/init.c b/testsuites/ada/tmtests/tm06/init.c index e7da9b9a48..42c701d01a 100644 --- a/testsuites/ada/tmtests/tm06/init.c +++ b/testsuites/ada/tmtests/tm06/init.c @@ -42,7 +42,6 @@ #define ADA_TEST_NAME "ADA TM 6" #define CONFIGURE_MAXIMUM_TIMERS 110 #define CONFIGURE_MAXIMUM_SEMAPHORES 101 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm07/init.c b/testsuites/ada/tmtests/tm07/init.c index e2b2e476f9..582d4f2a77 100644 --- a/testsuites/ada/tmtests/tm07/init.c +++ b/testsuites/ada/tmtests/tm07/init.c @@ -42,7 +42,6 @@ #define ADA_TEST_NAME "ADA TM 7" #define CONFIGURE_MAXIMUM_TIMERS 110 #define CONFIGURE_MAXIMUM_SEMAPHORES 101 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm08/init.c b/testsuites/ada/tmtests/tm08/init.c index d7a38a816b..4f8baa894c 100644 --- a/testsuites/ada/tmtests/tm08/init.c +++ b/testsuites/ada/tmtests/tm08/init.c @@ -42,7 +42,6 @@ #define ADA_TEST_NAME "ADA TM 8" #define CONFIGURE_MAXIMUM_TIMERS 110 #define CONFIGURE_MAXIMUM_SEMAPHORES 101 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm09/init.c b/testsuites/ada/tmtests/tm09/init.c index 42482a2f69..6e881dde7c 100644 --- a/testsuites/ada/tmtests/tm09/init.c +++ b/testsuites/ada/tmtests/tm09/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 9" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm10/init.c b/testsuites/ada/tmtests/tm10/init.c index 2102a33243..dad2ddbe21 100644 --- a/testsuites/ada/tmtests/tm10/init.c +++ b/testsuites/ada/tmtests/tm10/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 10" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm11/init.c b/testsuites/ada/tmtests/tm11/init.c index fe34ddf192..588f315dc2 100644 --- a/testsuites/ada/tmtests/tm11/init.c +++ b/testsuites/ada/tmtests/tm11/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 11" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm12/init.c b/testsuites/ada/tmtests/tm12/init.c index 7ac3debe6c..7f20fae43b 100644 --- a/testsuites/ada/tmtests/tm12/init.c +++ b/testsuites/ada/tmtests/tm12/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 12" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm13/init.c b/testsuites/ada/tmtests/tm13/init.c index 66a79607b6..e979602297 100644 --- a/testsuites/ada/tmtests/tm13/init.c +++ b/testsuites/ada/tmtests/tm13/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 13" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm14/init.c b/testsuites/ada/tmtests/tm14/init.c index c9ecdd5826..03d99d081a 100644 --- a/testsuites/ada/tmtests/tm14/init.c +++ b/testsuites/ada/tmtests/tm14/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 14" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm15/init.c b/testsuites/ada/tmtests/tm15/init.c index 710599245a..53e380d0a6 100644 --- a/testsuites/ada/tmtests/tm15/init.c +++ b/testsuites/ada/tmtests/tm15/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 15" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm16/init.c b/testsuites/ada/tmtests/tm16/init.c index b54f3559b5..aa7d907c66 100644 --- a/testsuites/ada/tmtests/tm16/init.c +++ b/testsuites/ada/tmtests/tm16/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 16" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm17/init.c b/testsuites/ada/tmtests/tm17/init.c index e9252771cb..c3ba070e1c 100644 --- a/testsuites/ada/tmtests/tm17/init.c +++ b/testsuites/ada/tmtests/tm17/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 17" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm18/init.c b/testsuites/ada/tmtests/tm18/init.c index 104134d726..29dc4f23e6 100644 --- a/testsuites/ada/tmtests/tm18/init.c +++ b/testsuites/ada/tmtests/tm18/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 18" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm19/init.c b/testsuites/ada/tmtests/tm19/init.c index 1961769118..634f2e0f2b 100644 --- a/testsuites/ada/tmtests/tm19/init.c +++ b/testsuites/ada/tmtests/tm19/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 19" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm20/init.c b/testsuites/ada/tmtests/tm20/init.c index 5f252c2f34..e9ae7d17d7 100644 --- a/testsuites/ada/tmtests/tm20/init.c +++ b/testsuites/ada/tmtests/tm20/init.c @@ -42,7 +42,6 @@ #define CONFIGURE_MAXIMUM_TASKS 3 #define ADA_TEST_NAME "ADA TM 20" -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm21/init.c b/testsuites/ada/tmtests/tm21/init.c index 06abc7b7f6..cc7de913f4 100644 --- a/testsuites/ada/tmtests/tm21/init.c +++ b/testsuites/ada/tmtests/tm21/init.c @@ -47,7 +47,6 @@ #define CONFIGURE_MAXIMUM_REGIONS 100 #define CONFIGURE_MAXIMUM_PORTS 100 #define CONFIGURE_MAXIMUM_PERIODS 100 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_MESSAGE_BUFFER_MEMORY \ (CONFIGURE_MAXIMUM_MESSAGE_QUEUES \ diff --git a/testsuites/ada/tmtests/tm22/init.c b/testsuites/ada/tmtests/tm22/init.c index 929bf75b53..9ad7875a5f 100644 --- a/testsuites/ada/tmtests/tm22/init.c +++ b/testsuites/ada/tmtests/tm22/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 22" #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm23/init.c b/testsuites/ada/tmtests/tm23/init.c index 951933f1f4..768bd95df8 100644 --- a/testsuites/ada/tmtests/tm23/init.c +++ b/testsuites/ada/tmtests/tm23/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 23" #define CONFIGURE_MAXIMUM_TIMERS 110 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm24/init.c b/testsuites/ada/tmtests/tm24/init.c index b90daf0738..8b25ab46bd 100644 --- a/testsuites/ada/tmtests/tm24/init.c +++ b/testsuites/ada/tmtests/tm24/init.c @@ -40,7 +40,6 @@ #define CONFIGURE_MAXIMUM_TASKS 111 #define ADA_TEST_NAME "ADA TM 24" -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm25/init.c b/testsuites/ada/tmtests/tm25/init.c index 0ebf5a934b..e0bb5bf4f3 100644 --- a/testsuites/ada/tmtests/tm25/init.c +++ b/testsuites/ada/tmtests/tm25/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 25" #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm28/init.c b/testsuites/ada/tmtests/tm28/init.c index 484756174c..542135b84e 100644 --- a/testsuites/ada/tmtests/tm28/init.c +++ b/testsuites/ada/tmtests/tm28/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 28" #define CONFIGURE_MAXIMUM_PORTS 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tm29/init.c b/testsuites/ada/tmtests/tm29/init.c index 3f12731be8..f0c509c9b0 100644 --- a/testsuites/ada/tmtests/tm29/init.c +++ b/testsuites/ada/tmtests/tm29/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TM 29" #define CONFIGURE_MAXIMUM_PERIODS 111 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/ada/tmtests/tmck/init.c b/testsuites/ada/tmtests/tmck/init.c index ae32bcc9e7..8c0682be41 100644 --- a/testsuites/ada/tmtests/tmck/init.c +++ b/testsuites/ada/tmtests/tmck/init.c @@ -41,7 +41,6 @@ #define ADA_TEST_NAME "ADA TMCK" #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/benchmarks/dhrystone/dhry_1.c b/testsuites/benchmarks/dhrystone/dhry_1.c index 3ad2e7f204..ef6ecf9251 100644 --- a/testsuites/benchmarks/dhrystone/dhry_1.c +++ b/testsuites/benchmarks/dhrystone/dhry_1.c @@ -133,6 +133,7 @@ execution_start: #ifdef __rtems__ /* avoid used uninitialized warning */ + Int_1_Loc = 0; Int_2_Loc = 0; #endif diff --git a/testsuites/benchmarks/linpack/linpack-pc.c b/testsuites/benchmarks/linpack/linpack-pc.c index 1fef18eb96..5f00df1d7c 100644 --- a/testsuites/benchmarks/linpack/linpack-pc.c +++ b/testsuites/benchmarks/linpack/linpack-pc.c @@ -224,7 +224,7 @@ #include <math.h> #include <stdlib.h> #ifdef __rtems__ -#include <tmacros.h> +#include <rtems/test-printer.h> #undef print_time #define fprintf(f, ...) rtems_printf(&rtems_test_printer, __VA_ARGS__) #endif /* __rtems__ */ diff --git a/testsuites/benchmarks/whetstone/whetstone.c b/testsuites/benchmarks/whetstone/whetstone.c index e0a93aa88c..aae68af6a6 100644 --- a/testsuites/benchmarks/whetstone/whetstone.c +++ b/testsuites/benchmarks/whetstone/whetstone.c @@ -57,7 +57,7 @@ C********************************************************************** #include <string.h> #include <math.h> #ifdef __rtems__ -#include <tmacros.h> +#include <rtems/test-printer.h> #define fprintf(f, ...) rtems_printf(&rtems_test_printer, __VA_ARGS__) #endif /* __rtems__ */ diff --git a/testsuites/fstests/fsjffs2empty01/fsjffs2empty01.doc b/testsuites/fstests/fsjffs2empty01/fsjffs2empty01.doc new file mode 100644 index 0000000000..2ad886a1fb --- /dev/null +++ b/testsuites/fstests/fsjffs2empty01/fsjffs2empty01.doc @@ -0,0 +1,11 @@ +This file describes the directives and concepts tested by this test set. + +test set name: fsjffs2empty01 + +directives: + + - JFFS2 implementation + +concepts: + + - Ensure that the JFFS2 library can remount a filesystem where every block has been written to and all files have been deleted. diff --git a/testsuites/fstests/fsjffs2empty01/fsjffs2empty01.scn b/testsuites/fstests/fsjffs2empty01/fsjffs2empty01.scn new file mode 100644 index 0000000000..56dca74761 --- /dev/null +++ b/testsuites/fstests/fsjffs2empty01/fsjffs2empty01.scn @@ -0,0 +1,6 @@ +*** BEGIN OF TEST FSJFFS2EMPTY 1 *** +Initializing filesystem JFFS2 + + +Shutting down filesystem JFFS2 +*** END OF TEST FSJFFS2EMPTY 1 *** diff --git a/testsuites/fstests/fsjffs2empty01/init.c b/testsuites/fstests/fsjffs2empty01/init.c new file mode 100644 index 0000000000..3232ea8fde --- /dev/null +++ b/testsuites/fstests/fsjffs2empty01/init.c @@ -0,0 +1,245 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/* + * Copyright (C) 2024 On-Line Applications Research (OAR) + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <fcntl.h> +#include <stdio.h> +#include <tmacros.h> + +#include <rtems.h> +#include <rtems/jffs2.h> +#include <rtems/libio.h> + +#define BLOCK_SIZE (16UL * 1024UL) + +#define FLASH_SIZE (8UL * BLOCK_SIZE) + +const char rtems_test_name[] = "FSJFFS2EMPTY 1"; + +#define BASE_FOR_TEST "/mnt" +static char big[] = BASE_FOR_TEST "/big"; + +static char keg[523]; + +static void init_keg(void) +{ + uint32_t v = 123; + + for (size_t i = 0; i < sizeof(keg); ++i) { + v = v * 1664525 + 1013904223; + keg[i] = (uint8_t) (v >> 23); + } +} + +static void create_big_file(void) +{ + int rv; + int fd = open(&big[0], O_WRONLY | O_TRUNC | O_CREAT, + S_IRWXU | S_IRWXG | S_IRWXO); + rtems_test_assert(fd >= 0); + + for (int i = 0; i < 100; ++i) { + ssize_t n = write(fd, &keg[0], sizeof(keg)); + rtems_test_assert(n == (ssize_t) sizeof(keg)); + } + + rv = close(fd); + rtems_test_assert(rv == 0); +} + +static void remove_big_file(void) +{ + int rv = unlink(&big[0]); + rtems_test_assert(rv == 0); +} + +typedef struct { + rtems_jffs2_flash_control super; + unsigned char area[FLASH_SIZE]; +} flash_control; + +static unsigned char *get_flash_chunk(rtems_jffs2_flash_control *super, + uint32_t offset) +{ + return &((flash_control *) super)->area[offset]; +} + +static int flash_read( + rtems_jffs2_flash_control *super, + uint32_t offset, + unsigned char *buffer, + size_t size_of_buffer +) +{ + unsigned char *chunk = get_flash_chunk(super, offset); + + memcpy(buffer, chunk, size_of_buffer); + + return 0; +} + +static int flash_write( + rtems_jffs2_flash_control *super, + uint32_t offset, + const unsigned char *buffer, + size_t size_of_buffer +) +{ + unsigned char *chunk = get_flash_chunk(super, offset); + + for (size_t i = 0; i < size_of_buffer; ++i) { + chunk[i] &= buffer[i]; + } + + return 0; +} + +static int flash_erase( + rtems_jffs2_flash_control *super, + uint32_t offset +) +{ + unsigned char *chunk = get_flash_chunk(super, offset); + + memset(chunk, 0xff, BLOCK_SIZE); + + return 0; +} + +static flash_control flash_instance = { + .super = { + .block_size = BLOCK_SIZE, + .flash_size = FLASH_SIZE, + .read = flash_read, + .write = flash_write, + .erase = flash_erase + } +}; + +static rtems_jffs2_compressor_control compressor_instance = { + .compress = rtems_jffs2_compressor_rtime_compress, + .decompress = rtems_jffs2_compressor_rtime_decompress +}; + +static const rtems_jffs2_mount_data mount_data = { + .flash_control = &flash_instance.super, + .compressor_control = &compressor_instance +}; + +static void erase_all(void) +{ + memset(&flash_instance.area[0], 0xff, FLASH_SIZE); +} + +static void test_initialize_filesystem(void) +{ + int rv = mount( + NULL, + BASE_FOR_TEST, + RTEMS_FILESYSTEM_TYPE_JFFS2, + RTEMS_FILESYSTEM_READ_WRITE, + &mount_data + ); + rtems_test_assert(rv == 0); +} + +static void test_shutdown_filesystem(void) +{ + int rv = unmount(BASE_FOR_TEST); + rtems_test_assert(rv == 0); +} + +static rtems_task Init( + rtems_task_argument ignored) +{ + int rv; + + TEST_BEGIN(); + + erase_all(); + + rv = mkdir(BASE_FOR_TEST, S_IRWXU | S_IRWXG | S_IRWXO); + rtems_test_assert(rv == 0); + + puts( "Initializing JFFS2 filesystem" ); + test_initialize_filesystem(); + + init_keg(); + + /* + * Ensure that jiffies != 0, to use most likely path in + * jffs2_mark_node_obsolete(). Without this the failure only happens + * intermittently. + */ + while (rtems_clock_get_ticks_since_boot() == 0) { + /* Wait */ + } + + /* + * This must be done in 2 parts because the FS is only so large and all blocks + * must be written to. + */ + create_big_file(); + remove_big_file(); + + create_big_file(); + remove_big_file(); + + puts( "\n\nShutting down JFFS2 filesystem"); + test_shutdown_filesystem(); + + puts( "Initializing JFFS2 filesystem again" ); + test_initialize_filesystem(); + + puts( "\n\nShutting down JFFS2 filesystem again" ); + test_shutdown_filesystem(); + + TEST_END(); + rtems_test_exit(0); +} + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER + +#define CONFIGURE_FILESYSTEM_JFFS2 + +#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 40 + +#define CONFIGURE_MAXIMUM_TASKS 2 + +#define CONFIGURE_INIT_TASK_STACK_SIZE (32 * 1024) +#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT + +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT +#include <rtems/confdefs.h> diff --git a/testsuites/fstests/jffs2_nand_support/fs_config.h b/testsuites/fstests/jffs2_nand_support/fs_config.h new file mode 100644 index 0000000000..548f5203e6 --- /dev/null +++ b/testsuites/fstests/jffs2_nand_support/fs_config.h @@ -0,0 +1,33 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/* + * Copyright (C) 2023 On-Line Applications Research (OAR) + * + * 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 __JFFS2_SUPPORT_h +#define __JFFS2_SUPPORT_h + +#define FILESYSTEM "JFFS2" + +#endif diff --git a/testsuites/fstests/jffs2_nand_support/fs_support.c b/testsuites/fstests/jffs2_nand_support/fs_support.c new file mode 100644 index 0000000000..9e7c965735 --- /dev/null +++ b/testsuites/fstests/jffs2_nand_support/fs_support.c @@ -0,0 +1,257 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/* + * Copyright (C) 2023 On-Line Applications Research (OAR) + * + * 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. + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif +#include <tmacros.h> + +#include <sys/stat.h> +#include <sys/types.h> +#include <string.h> + +#include <rtems/jffs2.h> +#include <rtems/libio.h> +#include <rtems/libcsupport.h> + +#include "fstest.h" +#include "fstest_support.h" + +#define FLASH_PAGE_SIZE (1024UL) +/* Out of Band/Spare area size is per-page */ +#define FLASH_PAGE_OOB_SIZE (32UL) + +#define PAGES_PER_BLOCK (16UL) +#define BLOCKS_PER_DEVICE (8UL) + +#define FLASH_OOB_SIZE (BLOCKS_PER_DEVICE * PAGES_PER_BLOCK * FLASH_PAGE_OOB_SIZE) +#define FLASH_BLOCK_SIZE (PAGES_PER_BLOCK * FLASH_PAGE_SIZE) +#define FLASH_SIZE (BLOCKS_PER_DEVICE * FLASH_BLOCK_SIZE) + +typedef struct { + rtems_jffs2_flash_control super; + unsigned char area[FLASH_SIZE]; + unsigned char oob[FLASH_OOB_SIZE]; +} flash_control; + +static flash_control *get_flash_control(rtems_jffs2_flash_control *super) +{ + return (flash_control *) super; +} + +static int flash_read( + rtems_jffs2_flash_control *super, + uint32_t offset, + unsigned char *buffer, + size_t size_of_buffer +) +{ + flash_control *self = get_flash_control(super); + unsigned char *chunk = &self->area[offset]; + + memcpy(buffer, chunk, size_of_buffer); + + return 0; +} + +static int flash_write( + rtems_jffs2_flash_control *super, + uint32_t offset, + const unsigned char *buffer, + size_t size_of_buffer +) +{ + flash_control *self = get_flash_control(super); + unsigned char *chunk = &self->area[offset]; + size_t i; + + for (i = 0; i < size_of_buffer; ++i) { + chunk[i] &= buffer[i]; + } + + return 0; +} + +static int flash_erase( + rtems_jffs2_flash_control *super, + uint32_t offset +) +{ + flash_control *self = get_flash_control(super); + uint32_t page_index = offset / FLASH_PAGE_SIZE; + uint32_t oob_offset = page_index * FLASH_PAGE_OOB_SIZE; + unsigned char *chunk = &self->area[offset]; + unsigned char *oobchunk = &self->oob[oob_offset]; + + memset(chunk, 0xff, FLASH_BLOCK_SIZE); + memset(oobchunk, 0xff, PAGES_PER_BLOCK * FLASH_PAGE_OOB_SIZE); + + return 0; +} + +static int flash_read_oob( + rtems_jffs2_flash_control *super, + uint32_t offset, + uint8_t *buffer, + uint32_t size_of_buffer +) +{ + flash_control *self = get_flash_control(super); + uint32_t page_index = offset / FLASH_PAGE_SIZE; + uint32_t oob_offset = page_index * FLASH_PAGE_OOB_SIZE; + unsigned char *chunk = &self->oob[oob_offset]; + + memcpy(buffer, chunk, size_of_buffer); + + return 0; +} + +static int flash_write_oob( + rtems_jffs2_flash_control *super, + uint32_t offset, + uint8_t *buffer, + uint32_t size_of_buffer +) +{ + flash_control *self = get_flash_control(super); + uint32_t page_index = offset / FLASH_PAGE_SIZE; + uint32_t oob_offset = page_index * FLASH_PAGE_OOB_SIZE; + unsigned char *chunk = &self->oob[oob_offset]; + size_t i; + + for (i = 0; i < size_of_buffer; ++i) { + chunk[i] &= buffer[i]; + } + + return 0; +} + +static int flash_block_is_bad( + rtems_jffs2_flash_control *super, + uint32_t orig_offset, + bool *bad +) +{ + *bad = false; + return 0; +} + +static int flash_block_mark_bad( + rtems_jffs2_flash_control *super, + uint32_t orig_offset +) +{ + return 0; +} + +static uint32_t flash_get_oob_size( + rtems_jffs2_flash_control *super +) +{ + return FLASH_PAGE_OOB_SIZE; +} + +static flash_control flash_instance = { + .super = { + .block_size = FLASH_BLOCK_SIZE, + .flash_size = FLASH_SIZE, + .read = flash_read, + .write = flash_write, + .erase = flash_erase, + .block_is_bad = flash_block_is_bad, + .block_mark_bad = flash_block_mark_bad, + .oob_read = flash_read_oob, + .oob_write = flash_write_oob, + .get_oob_size = flash_get_oob_size, + .write_size = FLASH_PAGE_SIZE + } +}; + +static rtems_jffs2_compressor_control compressor_instance = { + .compress = rtems_jffs2_compressor_rtime_compress, + .decompress = rtems_jffs2_compressor_rtime_decompress +}; + +static const rtems_jffs2_mount_data mount_data = { + .flash_control = &flash_instance.super, + .compressor_control = &compressor_instance +}; + +static void erase_all(void) +{ + memset(&flash_instance.area[0], 0xff, FLASH_SIZE); + memset(&flash_instance.oob[0], 0xff, FLASH_OOB_SIZE); +} + +static rtems_resource_snapshot before_mount; + +void test_initialize_filesystem(void) +{ + int rv; + + erase_all(); + + rv = mkdir(BASE_FOR_TEST, S_IRWXU | S_IRWXG | S_IRWXO); + rtems_test_assert(rv == 0); + + rtems_resource_snapshot_take(&before_mount); + + rv = mount( + NULL, + BASE_FOR_TEST, + RTEMS_FILESYSTEM_TYPE_JFFS2, + RTEMS_FILESYSTEM_READ_WRITE, + &mount_data + ); + rtems_test_assert(rv == 0); +} + +void test_shutdown_filesystem(void) +{ + int rv = unmount(BASE_FOR_TEST); + rtems_test_assert(rv == 0); + rtems_test_assert(rtems_resource_snapshot_check(&before_mount)); +} + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER + +#define CONFIGURE_FILESYSTEM_JFFS2 + +#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 40 + +#define CONFIGURE_MAXIMUM_TASKS 2 + +#define CONFIGURE_INIT_TASK_STACK_SIZE (32 * 1024) +#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT + +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE + +#define CONFIGURE_INIT +#include <rtems/confdefs.h> diff --git a/testsuites/fstests/tftpfs/init.c b/testsuites/fstests/tftpfs/init.c index 4a8a4f3c35..38e429f11e 100644 --- a/testsuites/fstests/tftpfs/init.c +++ b/testsuites/fstests/tftpfs/init.c @@ -42,6 +42,7 @@ #include "config.h" #endif +#include <stdio.h> #include <stdlib.h> /* malloc(), free() */ #include <ctype.h> /* isprint() */ #include <errno.h> @@ -6895,65 +6896,11 @@ T_TEST_CASE_FIXTURE( OACK_with_surplus_option, &fixture_large_blocksize ) T_no_more_interactions(); } -/* - * Test suite and configuration - */ - const char rtems_test_name[] = "TFTPFS"; -static char buffer[ 512 ]; - -static const T_action actions[] = { - T_report_hash_sha256, - T_check_task_context, - T_check_file_descriptors, - T_check_rtems_barriers, - T_check_rtems_extensions, - T_check_rtems_message_queues, - T_check_rtems_partitions, - T_check_rtems_periods, - T_check_rtems_regions, - T_check_rtems_semaphores, - T_check_rtems_tasks, - T_check_rtems_timers, - T_check_posix_keys -}; - -static const T_config config = { - .name = rtems_test_name, - .buf = buffer, - .buf_size = sizeof( buffer ), - .putchar = T_putchar_default, - .verbosity = RTEMS_TEST_VERBOSITY, - .now = T_now_clock, - .allocate = T_memory_allocate, - .deallocate = T_memory_deallocate, - .action_count = T_ARRAY_SIZE( actions ), - .actions = actions -}; - static void Init( rtems_task_argument argument ) { - (void) argument; - int exit_code; - - /* - * It would be much easier to simply use - * rtems_test_run( argument, TEST_STATE ); - * instead of all the code below and the variables - * buffer, actions, config - * above. Yet, rtems_test_run() sets the verbosity always to - * T_VERBOSE and this would produce plenty of output. - */ - rtems_test_begin( rtems_test_name, TEST_STATE ); - T_register(); - exit_code = T_main( &config ); - - if ( exit_code == 0 ) { - rtems_test_end( rtems_test_name ); - } - - rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, (uint32_t) exit_code ); + rtems_test_run( argument, TEST_STATE ); } /* @@ -6968,7 +6915,7 @@ static void Init( rtems_task_argument argument ) */ #define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER -#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER #define CONFIGURE_MAXIMUM_TASKS 1 diff --git a/testsuites/libtests/can01/can-loopback.c b/testsuites/libtests/can01/can-loopback.c deleted file mode 100644 index 0aaf2f6a6d..0000000000 --- a/testsuites/libtests/can01/can-loopback.c +++ /dev/null @@ -1,110 +0,0 @@ -/** - * @file - * - * @ingroup CANBus - * - * @brief Controller Area Network (CAN) loopback device Implementation - * - */ - -/* - * Copyright (C) 2022 Prashanth S (fishesprashanth@gmail.com) - * - * 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. - */ - -#include <dev/can/can.h> - -struct can_loopback_priv { - struct can_bus *bus; -}; - -static bool can_loopback_tx_ready(void *data); -static void can_loopback_int(void *data, bool flag); -static int can_loopback_tx(void *data, struct can_msg *msg); -int can_loopback_init(const char *can_dev_file); - -static struct can_dev_ops dev_ops = { - .dev_tx = can_loopback_tx, - .dev_tx_ready = can_loopback_tx_ready, - .dev_int = can_loopback_int, -}; - -static bool can_loopback_tx_ready(void *data) -{ - return true; -} - -static void can_loopback_int(void *data, bool flag) -{ - return; -} - -static int can_loopback_tx(void *data, struct can_msg *msg) -{ - struct can_loopback_priv *priv = data; - - can_receive(priv->bus, msg); - - return RTEMS_SUCCESSFUL; -} - -int can_loopback_init(const char *can_dev_file) -{ - int ret; - struct can_loopback_priv *priv = NULL; - - struct can_bus *bus = can_bus_alloc_and_init(sizeof(struct can_bus)); - if (bus == NULL) { - CAN_ERR("can_loopback_init: can_bus_alloc_and_init failed\n"); - return RTEMS_NO_MEMORY; - } - - priv = (struct can_loopback_priv *)calloc(1, sizeof(struct can_loopback_priv)); - if (priv == NULL) { - CAN_ERR("can_loopback_init: calloc failed\n"); - ret = RTEMS_NO_MEMORY; - goto free_bus_return; - } - - priv->bus = bus; - bus->priv = priv; - - priv->bus->can_dev_ops = &dev_ops; - - if ((ret = can_bus_register(bus, can_dev_file)) != RTEMS_SUCCESSFUL) { - CAN_ERR("can_loopback_init: bus register failed\n"); - goto free_priv_return; - } - - CAN_DEBUG("can_loopback_init: can_loopback driver registered\n"); - - return ret; - -free_priv_return: - free(priv); - -free_bus_return: - free(bus); - - return ret; -} diff --git a/testsuites/libtests/can01/init.c b/testsuites/libtests/can01/init.c deleted file mode 100644 index 0675fe606f..0000000000 --- a/testsuites/libtests/can01/init.c +++ /dev/null @@ -1,249 +0,0 @@ -/* SPDX-License-Identifier: BSD-2-Clause */ - -/* - * Copyright (c) 2022 Prashanth S (fishesprashanth@gmail.com) All rights reserved. - * - * 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. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <rtems.h> -#include <rtems/error.h> -#include <sched.h> -#include <tmacros.h> -#include <unistd.h> -#include <fcntl.h> - -#include <dev/can/can.h> - -#define TASKS (12) - -#define CAN_DEV_FILE "/dev/can-loopback" -#define NUM_TEST_MSGS (0xf) - -#define NEXT_TASK_NAME(c1, c2, c3, c4) \ - if (c4 == '9') { \ - if (c3 == '9') { \ - if (c2 == 'z') { \ - if (c1 == 'z') { \ - printf("not enough task letters for names !!!\n"); \ - exit( 1 ); \ - } else \ - c1++; \ - c2 = 'a'; \ - } else \ - c2++; \ - c3 = '0'; \ - } else \ - c3++; \ - c4 = '0'; \ - } \ - else \ - c4++ \ - -static void test_task(rtems_task_argument); -int can_loopback_init(const char *); -int create_task(int); - -static rtems_id task_id[TASKS]; -static rtems_id task_test_status[TASKS] = {[0 ... (TASKS - 1)] = false}; - -const char rtems_test_name[] = "CAN test TX, RX with CAN loopback driver"; - -/*FIXME: Should Implement one more test application for the - * RTR support - * - * For testing, the number of successful read and write - * count is verified. - */ -static void test_task(rtems_task_argument data) -{ - //sleep so that other tasks will be created. - sleep(1); - - int fd, task_num = (uint32_t)data; - uint32_t count = 0, msg_size; - - struct can_msg msg; - - printf("CAN tx and rx for %s\n", CAN_DEV_FILE); - - fd = open(CAN_DEV_FILE, O_RDWR); - if (fd < 0) { - printf("open error: task = %u %s: %s\n", task_num, CAN_DEV_FILE, strerror(errno)); - } - - rtems_test_assert(fd >= 0); - - for (int i = 0; i < NUM_TEST_MSGS; i++) { - printf("test_task %u\n", task_num); - - msg.id = task_num; - //FIXME: Implement Test cases for other flags also. - msg.flags = 0; - msg.len = (i + 1) % 9; - - for (int j = 0; j < msg.len; j++) { - msg.data[j] = 'a' + j; - } - - msg_size = ((char *)&msg.data[msg.len] - (char *)&msg); - - printf("calling write task = %u\n", task_num); - - count = write(fd, &msg, sizeof(msg)); - rtems_test_assert(count == msg_size); - printf("task = %u write count = %u\n", task_num, count); - - printf("calling read task = %u\n", task_num); - count = read(fd, &msg, sizeof(msg)); - rtems_test_assert(count > 0); - printf("task = %u read count = %u\n", task_num, count); - - printf("received message\n"); - can_print_msg(&msg); - - sleep(1); - } - close(fd); - - task_test_status[task_num] = true; - - printf("task exited = %u\n", task_num); - rtems_task_exit(); -} - -int create_task(int i) -{ - printf("Creating task %d\n", i); - - rtems_status_code result; - rtems_name name; - - char c1 = 'a'; - char c2 = 'a'; - char c3 = '1'; - char c4 = '1'; - - name = rtems_build_name(c1, c2, c3, c4); - - result = rtems_task_create(name, - 1, - RTEMS_MINIMUM_STACK_SIZE, - RTEMS_PREEMPT | RTEMS_TIMESLICE, - RTEMS_FIFO | RTEMS_FLOATING_POINT, - &task_id[i]); - if (result != RTEMS_SUCCESSFUL) { - printf("rtems_task_create error: %s\n", rtems_status_text(result)); - rtems_test_assert(result == RTEMS_SUCCESSFUL); - } - - printf("number = %3" PRIi32 ", id = %08" PRIxrtems_id ", starting, ", i, task_id[i]); - - fflush(stdout); - - printf("starting task\n"); - result = rtems_task_start(task_id[i], - test_task, - (rtems_task_argument)i); - - if (result != RTEMS_SUCCESSFUL) { - printf("rtems_task_start failed %s\n", rtems_status_text(result)); - rtems_test_assert(result == RTEMS_SUCCESSFUL); - } - - NEXT_TASK_NAME(c1, c2, c3, c4); - - return result; -} - -static rtems_task Init( - rtems_task_argument ignored -) -{ - printf("Init\n"); - - int ret; - - rtems_print_printer_fprintf_putc(&rtems_test_printer); - - TEST_BEGIN(); - - rtems_task_priority old_priority; - rtems_mode old_mode; - - rtems_task_set_priority(RTEMS_SELF, RTEMS_MAXIMUM_PRIORITY - 1, &old_priority); - rtems_task_mode(RTEMS_PREEMPT, RTEMS_PREEMPT_MASK, &old_mode); - - ret = can_loopback_init(CAN_DEV_FILE); - if (ret != RTEMS_SUCCESSFUL) { - printf("%s failed\n", rtems_test_name); - rtems_test_assert(ret == RTEMS_SUCCESSFUL); - } - - for (int i = 0; i < TASKS; i++) { - create_task(i); - } - - /* Do not exit untill all the tasks are exited */ - while (1) { - int flag = 0; - for (int i = 0; i < TASKS; i++) { - if (task_test_status[i] == false) { - printf("task not exited = %d\n", i); - sleep(1); - flag = 1; - break; - } - } - if (flag == 0) { - break; - } - } - - TEST_END(); - - rtems_test_exit( 0 ); -} - - -#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER - -#define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER -#define CONFIGURE_RTEMS_INIT_TASKS_TABLE - -#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT - -#define CONFIGURE_MAXIMUM_TASKS (TASKS + TASKS) - -#define CONFIGURE_MAXIMUM_SEMAPHORES 10 - -#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS (TASKS * 2) - -#define CONFIGURE_TICKS_PER_TIMESLICE 100 - -#define CONFIGURE_INIT - -#include <rtems/confdefs.h> diff --git a/testsuites/libtests/dl01/dl01-o1.c b/testsuites/libtests/dl01/dl01-o1.c index ade4d5744d..9350235d85 100644 --- a/testsuites/libtests/dl01/dl01-o1.c +++ b/testsuites/libtests/dl01/dl01-o1.c @@ -29,7 +29,7 @@ * Hello World as a loadable module. */ -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl02/dl02-o1.c b/testsuites/libtests/dl02/dl02-o1.c index b442f82ae7..3b3e51825d 100644 --- a/testsuites/libtests/dl02/dl02-o1.c +++ b/testsuites/libtests/dl02/dl02-o1.c @@ -29,7 +29,7 @@ #include <dlfcn.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl02/dl02-o2.c b/testsuites/libtests/dl02/dl02-o2.c index 02a537a84f..6694c5e985 100644 --- a/testsuites/libtests/dl02/dl02-o2.c +++ b/testsuites/libtests/dl02/dl02-o2.c @@ -27,7 +27,7 @@ #include "dl-o2.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__) diff --git a/testsuites/libtests/dl05/dl05-o5.cc b/testsuites/libtests/dl05/dl05-o5.cc index c861916ff0..f928cf9004 100644 --- a/testsuites/libtests/dl05/dl05-o5.cc +++ b/testsuites/libtests/dl05/dl05-o5.cc @@ -2,7 +2,7 @@ #include <stdexcept> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl06/dl06-o1.c b/testsuites/libtests/dl06/dl06-o1.c index 719d01e91f..1b8482bc3e 100644 --- a/testsuites/libtests/dl06/dl06-o1.c +++ b/testsuites/libtests/dl06/dl06-o1.c @@ -30,7 +30,7 @@ #include <dlfcn.h> #include <math.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl06/dl06-o2.c b/testsuites/libtests/dl06/dl06-o2.c index 837c2e8e4f..0a46c027a8 100644 --- a/testsuites/libtests/dl06/dl06-o2.c +++ b/testsuites/libtests/dl06/dl06-o2.c @@ -30,7 +30,7 @@ #include <stdlib.h> #include <math.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl07/dl-load.c b/testsuites/libtests/dl07/dl-load.c index 58e3e06f78..2946120ca6 100644 --- a/testsuites/libtests/dl07/dl-load.c +++ b/testsuites/libtests/dl07/dl-load.c @@ -32,6 +32,7 @@ RTEMS_RTL_TRACE_WARNING | \ RTEMS_RTL_TRACE_LOAD | \ RTEMS_RTL_TRACE_UNLOAD | \ + RTEMS_RTL_TRACE_LOAD_SECT | \ RTEMS_RTL_TRACE_SYMBOL | \ RTEMS_RTL_TRACE_RELOC | \ RTEMS_RTL_TRACE_ALLOCATOR | \ diff --git a/testsuites/libtests/dl07/dl07-o1.c b/testsuites/libtests/dl07/dl07-o1.c index 24a8086c49..0bca0ab838 100644 --- a/testsuites/libtests/dl07/dl07-o1.c +++ b/testsuites/libtests/dl07/dl07-o1.c @@ -28,7 +28,7 @@ #include "dl-o1.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #include "dl-load.h" #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl07/dl07-o2.c b/testsuites/libtests/dl07/dl07-o2.c index 12cc917ae0..46aef0d6fe 100644 --- a/testsuites/libtests/dl07/dl07-o2.c +++ b/testsuites/libtests/dl07/dl07-o2.c @@ -29,7 +29,7 @@ #include "dl-o1.h" #include "dl-o2.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl07/dl07-o3.c b/testsuites/libtests/dl07/dl07-o3.c index 12a5fe6829..ab60f50e97 100644 --- a/testsuites/libtests/dl07/dl07-o3.c +++ b/testsuites/libtests/dl07/dl07-o3.c @@ -32,7 +32,7 @@ #include "dl-o5.h" #include <inttypes.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl07/dl07-o4.c b/testsuites/libtests/dl07/dl07-o4.c index aeeb404561..e5f831ec24 100644 --- a/testsuites/libtests/dl07/dl07-o4.c +++ b/testsuites/libtests/dl07/dl07-o4.c @@ -29,7 +29,7 @@ #include "dl-o1.h" #include "dl-o4.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl07/dl07-o5.c b/testsuites/libtests/dl07/dl07-o5.c index e487d072ae..83e98f6d9d 100644 --- a/testsuites/libtests/dl07/dl07-o5.c +++ b/testsuites/libtests/dl07/dl07-o5.c @@ -30,7 +30,7 @@ #include "dl-o5.h" #include <inttypes.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl08/dl08-o1.c b/testsuites/libtests/dl08/dl08-o1.c index ccd8bc3587..015e847ea2 100644 --- a/testsuites/libtests/dl08/dl08-o1.c +++ b/testsuites/libtests/dl08/dl08-o1.c @@ -28,7 +28,7 @@ #include "dl-o1.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #include "dl-load.h" #include "dl-o1.h" #include "dl-o2.h" diff --git a/testsuites/libtests/dl08/dl08-o2.c b/testsuites/libtests/dl08/dl08-o2.c index 8d72cb8703..3833cb5768 100644 --- a/testsuites/libtests/dl08/dl08-o2.c +++ b/testsuites/libtests/dl08/dl08-o2.c @@ -29,7 +29,7 @@ #include "dl-o2.h" #include "dl-o3.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl08/dl08-o3.c b/testsuites/libtests/dl08/dl08-o3.c index 267895476c..dc839bf270 100644 --- a/testsuites/libtests/dl08/dl08-o3.c +++ b/testsuites/libtests/dl08/dl08-o3.c @@ -31,7 +31,7 @@ #include "dl-o5.h" #include <inttypes.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl08/dl08-o4.c b/testsuites/libtests/dl08/dl08-o4.c index b77bf60465..d09fd2ec93 100644 --- a/testsuites/libtests/dl08/dl08-o4.c +++ b/testsuites/libtests/dl08/dl08-o4.c @@ -29,7 +29,7 @@ #include "dl-o4.h" #include "dl-o5.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl08/dl08-o5.c b/testsuites/libtests/dl08/dl08-o5.c index 614bff6a24..de86437757 100644 --- a/testsuites/libtests/dl08/dl08-o5.c +++ b/testsuites/libtests/dl08/dl08-o5.c @@ -30,7 +30,7 @@ #include "dl-o6.h" #include <inttypes.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl08/dl08-o6-123456789-123456789.c b/testsuites/libtests/dl08/dl08-o6-123456789-123456789.c index 3a03ec6e84..47d3f66f76 100644 --- a/testsuites/libtests/dl08/dl08-o6-123456789-123456789.c +++ b/testsuites/libtests/dl08/dl08-o6-123456789-123456789.c @@ -29,7 +29,7 @@ #include "dl-o6.h" #include <inttypes.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl09/dl-load.c b/testsuites/libtests/dl09/dl-load.c index ce9708c3a3..216fb5a201 100644 --- a/testsuites/libtests/dl09/dl-load.c +++ b/testsuites/libtests/dl09/dl-load.c @@ -116,8 +116,12 @@ static void dl_check_resolved(void* handle, bool has_unresolved) rtems_test_assert (unresolved == 0); } } - printf ("handel: %p: %sunresolved externals\n", - handle, unresolved != 0 ? "" : "no "); + if (handle == RTLD_SELF) + printf ("handle: RTL_SELF: %sunresolved externals\n", + unresolved != 0 ? "" : "no "); + else + printf ("handle: %p: %sunresolved externals\n", + handle, unresolved != 0 ? "" : "no "); } static void* dl_load_obj (const char* name, bool has_unresolved) @@ -152,12 +156,20 @@ static void dl_close (void* handle) static int dl_call (void* handle, const char* func) { + static call_sig last_call; call_sig call = dlsym (handle, func); if (call == NULL) { printf("dlsym failed: symbol not found: %s\n", func); return 1; } + if (last_call != NULL && last_call != call) + { + printf("Call location different: moved by: %i (call:%p last:%p)\n", + (int) (call - last_call), + call, last_call); + } + last_call = call; call (); return 0; } diff --git a/testsuites/libtests/dl09/dl09-o1.c b/testsuites/libtests/dl09/dl09-o1.c index 4659fda17c..291d33fcd0 100644 --- a/testsuites/libtests/dl09/dl09-o1.c +++ b/testsuites/libtests/dl09/dl09-o1.c @@ -28,7 +28,7 @@ #include "dl-o1.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #include "dl-load.h" #include "dl-o1.h" #include "dl-o2.h" diff --git a/testsuites/libtests/dl09/dl09-o2.c b/testsuites/libtests/dl09/dl09-o2.c index a6906b4ad9..e8976f3b49 100644 --- a/testsuites/libtests/dl09/dl09-o2.c +++ b/testsuites/libtests/dl09/dl09-o2.c @@ -29,7 +29,7 @@ #include "dl-o2.h" #include "dl-o3.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl09/dl09-o3.c b/testsuites/libtests/dl09/dl09-o3.c index fab70c02c7..d9a056d45d 100644 --- a/testsuites/libtests/dl09/dl09-o3.c +++ b/testsuites/libtests/dl09/dl09-o3.c @@ -31,7 +31,7 @@ #include "dl-o5.h" #include <inttypes.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl09/dl09-o4.c b/testsuites/libtests/dl09/dl09-o4.c index 5cf4eb0f4b..8998059c93 100644 --- a/testsuites/libtests/dl09/dl09-o4.c +++ b/testsuites/libtests/dl09/dl09-o4.c @@ -29,7 +29,7 @@ #include "dl-o4.h" #include "dl-o5.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl09/dl09-o5.c b/testsuites/libtests/dl09/dl09-o5.c index 6b4aedbf68..e5374f3eb8 100644 --- a/testsuites/libtests/dl09/dl09-o5.c +++ b/testsuites/libtests/dl09/dl09-o5.c @@ -30,7 +30,7 @@ #include "dl-o5.h" #include <inttypes.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl10/dl10-o1.c b/testsuites/libtests/dl10/dl10-o1.c index ccd8bc3587..015e847ea2 100644 --- a/testsuites/libtests/dl10/dl10-o1.c +++ b/testsuites/libtests/dl10/dl10-o1.c @@ -28,7 +28,7 @@ #include "dl-o1.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #include "dl-load.h" #include "dl-o1.h" #include "dl-o2.h" diff --git a/testsuites/libtests/dl10/dl10-o2.c b/testsuites/libtests/dl10/dl10-o2.c index 8d72cb8703..3833cb5768 100644 --- a/testsuites/libtests/dl10/dl10-o2.c +++ b/testsuites/libtests/dl10/dl10-o2.c @@ -29,7 +29,7 @@ #include "dl-o2.h" #include "dl-o3.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl10/dl10-o3.c b/testsuites/libtests/dl10/dl10-o3.c index 267895476c..dc839bf270 100644 --- a/testsuites/libtests/dl10/dl10-o3.c +++ b/testsuites/libtests/dl10/dl10-o3.c @@ -31,7 +31,7 @@ #include "dl-o5.h" #include <inttypes.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl10/dl10-o4.c b/testsuites/libtests/dl10/dl10-o4.c index b77bf60465..d09fd2ec93 100644 --- a/testsuites/libtests/dl10/dl10-o4.c +++ b/testsuites/libtests/dl10/dl10-o4.c @@ -29,7 +29,7 @@ #include "dl-o4.h" #include "dl-o5.h" -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl10/dl10-o5.c b/testsuites/libtests/dl10/dl10-o5.c index 35cfbda2cd..185c259d8c 100644 --- a/testsuites/libtests/dl10/dl10-o5.c +++ b/testsuites/libtests/dl10/dl10-o5.c @@ -29,7 +29,7 @@ #include "dl-o5.h" #include <inttypes.h> -#include <rtems/test-info.h> +#include <rtems/test-printer.h> #define printf(...) rtems_printf(&rtems_test_printer, __VA_ARGS__); diff --git a/testsuites/libtests/dl10/dl10-o6.c b/testsuites/libtests/dl10/dl10-o6.c index fad9516f7b..2484ff6f2f 100644 --- a/testsuites/libtests/dl10/dl10-o6.c +++ b/testsuites/libtests/dl10/dl10-o6.c @@ -29,7 +29,6 @@ #include "dl-o5.h" #include <inttypes.h> -#include <rtems/test-info.h> int rtems_main_o5 (void) { diff --git a/testsuites/libtests/dl11/dl-load.c b/testsuites/libtests/dl11/dl-load.c index aee1517269..b09128acdf 100644 --- a/testsuites/libtests/dl11/dl-load.c +++ b/testsuites/libtests/dl11/dl-load.c @@ -27,6 +27,8 @@ #include <errno.h> #include <stdio.h> +#include "tmacros.h" +#include <pthread.h> #include <dlfcn.h> @@ -37,10 +39,17 @@ #define TEST_TRACE 0 #if TEST_TRACE + #define SHOW_GLOBAL_SYMS 1 + #if SHOW_GLOBAL_SYMS + #define TRACE_GLOBAL_SYMBOL RTEMS_RTL_TRACE_GLOBAL_SYM + #else + #define TRACE_GLOBAL_SYMBOL 0 + #endif #define DEBUG_TRACE (RTEMS_RTL_TRACE_DETAIL | \ RTEMS_RTL_TRACE_WARNING | \ RTEMS_RTL_TRACE_LOAD | \ RTEMS_RTL_TRACE_UNLOAD | \ + TRACE_GLOBAL_SYMBOL | \ RTEMS_RTL_TRACE_SYMBOL | \ RTEMS_RTL_TRACE_RELOC | \ RTEMS_RTL_TRACE_ALLOCATOR | \ @@ -69,13 +78,63 @@ static void dl_load_dump (void) typedef int (*int_call_t)(void); typedef int* (*ptr_call_t)(void); -int dl_load_test(void) +void* get_errno_ptr(void); +int get_errno(void); + +int_call_t int_call; +ptr_call_t ptr_call; +static int perform_test(void) { - void* handle; - int_call_t int_call; - ptr_call_t ptr_call; int int_call_ret; int* ptr_call_ret; + ptr_call_ret = ptr_call (); + if (ptr_call_ret != get_errno_ptr()) + { + printf("dlsym ptr_call failed: ret value bad\n"); + return 1; + } + + errno = 12345; + int_call_ret = int_call (); + if (int_call_ret != get_errno()) + { + printf("dlsym int_call failed: ret value bad\n"); + return 1; + } + errno = 0; + + return 0; +} + +static void *secondary_thread(void *arg) +{ + printf("Running test on secondary thread\n"); + if (perform_test()) { + printf("Test failed on secondary task\n"); + return (void *) 1; + } + + return NULL; +} + +static void start_secondary(void) +{ + /* Run the test on a secondary thread */ + pthread_t threadId; + int status; + void *ret; + status = pthread_create( &threadId, NULL, secondary_thread, NULL ); + rtems_test_assert( !status ); + + /* Wait on thread to exit */ + status = pthread_join(threadId, &ret); + rtems_test_assert( !status ); + rtems_test_assert( ret == NULL ); +} + +int dl_load_test(void) +{ + void* handle; int unresolved; char* message = "loaded"; @@ -115,20 +174,13 @@ int dl_load_test(void) return 1; } - ptr_call_ret = ptr_call (); - if (ptr_call_ret != &errno) - { - printf("dlsym ptr_call failed: ret value bad\n"); + /* Run the test on the init thread */ + printf("Running test on init task\n"); + if (perform_test()) { return 1; } - errno = 12345; - int_call_ret = int_call (); - if (int_call_ret != 12345) - { - printf("dlsym int_call failed: ret value bad\n"); - return 1; - } + start_secondary(); if (dlclose (handle) < 0) { @@ -140,3 +192,16 @@ int dl_load_test(void) return 0; } + +/* + * Disasseble these to see how the platform accesses TLS + */ +void* get_errno_ptr(void) +{ + return &errno; +} + +int get_errno(void) +{ + return errno; +} diff --git a/testsuites/libtests/dl11/dl11-o1.c b/testsuites/libtests/dl11/dl11-o1.c index 21aa9bfc43..93ee2a60c7 100644 --- a/testsuites/libtests/dl11/dl11-o1.c +++ b/testsuites/libtests/dl11/dl11-o1.c @@ -25,7 +25,6 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include <rtems/test-info.h> #include <errno.h> int get_errno_val (void); diff --git a/testsuites/libtests/dl11/init.c b/testsuites/libtests/dl11/init.c index 91f529b055..0ff4557421 100644 --- a/testsuites/libtests/dl11/init.c +++ b/testsuites/libtests/dl11/init.c @@ -86,6 +86,8 @@ static void Init(rtems_task_argument arg) #define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 4 +#define CONFIGURE_MAXIMUM_POSIX_THREADS 1 + #define CONFIGURE_MAXIMUM_TASKS 1 #define CONFIGURE_MAXIMUM_SEMAPHORES 1 diff --git a/testsuites/libtests/flashdev01/init.c b/testsuites/libtests/flashdev01/init.c index 8896ad796c..6ce9709496 100644 --- a/testsuites/libtests/flashdev01/init.c +++ b/testsuites/libtests/flashdev01/init.c @@ -57,7 +57,7 @@ static void run_test(void) { rtems_flashdev_ioctl_page_info pg_info; rtems_flashdev_region region; uint32_t jedec; - size_t page_count; + int page_count; int type; size_t wb_size; diff --git a/testsuites/libtests/regulator01/regulator01.c b/testsuites/libtests/regulator01/regulator01.c new file mode 100644 index 0000000000..cc5af01223 --- /dev/null +++ b/testsuites/libtests/regulator01/regulator01.c @@ -0,0 +1,1310 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @defgroup RegulatorTests Regulator Test Cases + * + * @brief Unit test cases for the Regulator + * + * This is a set of unit test cases for the regulator. + */ + +/** + * @ingroup RegulatorTests + * + * @file + * + * @brief Test 01 for Regulator Library + */ + +/* + * Copyright (C) 2022 On-Line Applications Research Corporation (OAR) + * + * 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. + */ + +#include <stdio.h> +#include <string.h> +#include <unistd.h> + +#include <rtems.h> +#include <rtems/test-info.h> +#include <tmacros.h> + +#include <rtems/regulator.h> + +/** + * @brief Regulator Test Name + */ +const char rtems_test_name[] = "Regulator 1"; + +/* + * Prototypes for wrapped functions + */ +void *__wrap_malloc(size_t size); +void *__real_malloc(size_t size); + +/** + * @ingroup RegulatorTests + * @brief Calloc Wrapper Trigger Count + */ +static int malloc_trigger_count; + +/** + * @ingroup RegulatorTests + * @brief Calloc Wrapper Call Count + */ +static int malloc_call_count; + +/** + * @ingroup RegulatorTests + * @brief Calloc Wrapper Trigger enable + */ +static bool malloc_trigger_enabled; + +/** + * @ingroup RegulatorTests + * @brief Enable Calloc Wrapper Trigger + */ +static void malloc_trigger_enable( + int trigger_count +) +{ + malloc_trigger_enabled = true; + malloc_trigger_count = trigger_count; + malloc_call_count = 0; +} +/** + * @ingroup RegulatorTests + * @brief Reset Calloc Wrapper Trigger and Count + */ +static void malloc_trigger_reset(void) +{ + malloc_trigger_enabled = 0; + malloc_trigger_count = 0; + malloc_call_count = 0; +} +/** + * @ingroup RegulatorTests + * @brief Calloc Wrapper to Trigger Allocation Errors + */ +void *__wrap_malloc(size_t size) +{ + if (malloc_trigger_enabled) { + malloc_call_count++; + if (malloc_call_count == malloc_trigger_count) { + return NULL; + } + } + + return __real_malloc(size); +} + +/** + * @brief Constant to simpify code + */ +#define FIVE_SECONDS (5 * rtems_clock_get_ticks_per_second()) + +/** + * @ingroup RegulatorTests + * @brief Empty Deliver Method for Testing + */ +static bool test_regulator_deliverer( + void *context, + void *message, + size_t length +) +{ + (void) context; + (void) message; + (void) length; + + return true; +} + +/** + * @ingroup RegulatorTests + * @brief Maximum length of a test message that is delivered + */ +#define MAXIMUM_MESSAGE_LENGTH 32 + +/** + * @ingroup RegulatorTests + * @brief Maximum number of test messages to buffer + */ +#define MAXIMUM_MESSAGES_TO_BUFFER 10 + +/** + * @ingroup RegulatorTests + * @brief Structure for capturing messages as delivered + */ +typedef struct { + rtems_interval processed; + char message[MAXIMUM_MESSAGE_LENGTH]; +} message_log_t; + +/** + * @ingroup RegulatorTests + * @brief Set of Delivered messages + */ +message_log_t delivered_messages[MAXIMUM_MESSAGES_TO_BUFFER]; + +/** + * @ingroup RegulatorTests + * @brief Count of Delivered messages + */ +int delivered_message_count; + +/** + * @ingroup RegulatorTests + * @brief Reset Delivered Message Set + * + * This is used at the beginning of a test case which is going to + * check that message contents and delivery times were as expected. + */ +static void delivered_messages_reset(void) +{ + delivered_message_count = 0; + memset(delivered_messages, 0xc5, sizeof(delivered_messages)); +} + +/** + * @brief Context for Logger Delivery Function + */ +typedef struct { + /** Regulator instance being operated on */ + rtems_regulator_instance *regulator; +} deliverer_logger_context_t; + +/** + * @brief Context Instance for Logger Delivery Function + */ +static deliverer_logger_context_t deliverer_logger_context; + +/** + * @ingroup RegulatorTests + * @brief Empty Deliver Method for Testing + * + * This deliverer method implementation logs the messages along with + * their time of arrival. This is used by the test cases to verify + * proper delivery. + */ +static bool test_regulator_deliverer_logger( + void *context, + void *message, + size_t length +) +{ + deliverer_logger_context_t *the_context; + + the_context = (deliverer_logger_context_t *)context; + + static bool caller_releases_buffer = true; + + size_t len; + rtems_interval ticks; + rtems_status_code sc; + + len = strnlen(message, MAXIMUM_MESSAGE_LENGTH) + 1; + rtems_test_assert(len = length); + + ticks = rtems_clock_get_ticks_since_boot(); + + delivered_messages[delivered_message_count].processed = ticks; + + strcpy(delivered_messages[delivered_message_count].message, message); + + delivered_message_count++; + + /* + * Alternate releasing the buffer here and allowing the calling Delivery + * Thread to do it. This increases coverage of that logic. + */ + if (caller_releases_buffer == true) { + caller_releases_buffer = false; + return true; + } + + sc = rtems_regulator_release_buffer(the_context->regulator, message); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + return false; +} + + +/** + * @ingroup RegulatorTests + * @brief Helper to create a Regulator instance + * + * This helper creates a regulator instance with some arbitrary attributes. + * This is used in multiple test cases to have a valie regulator instance to + * trigger error cases. + */ +static rtems_regulator_instance *test_regulator_create_regulator_OK(void) +{ + rtems_status_code sc; + rtems_regulator_attributes attributes = { + .deliverer = test_regulator_deliverer, + .deliverer_context = NULL, + .maximum_message_size = 16, + .maximum_messages = 10, + .delivery_thread_priority = 16, + .delivery_thread_stack_size = 0, + .delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(1000), + .maximum_to_dequeue_per_period = 3 + }; + rtems_regulator_instance *regulator; + + regulator = NULL; + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(regulator != NULL); + + return regulator; +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create() maximum_to_dequeue_per_period + * attributes error + * + * This unit test verifies that rtems_regulator_create() returns an error when + * the maximum_to_dequeue_per_period attribute is zero. + */ +static void test_regulator_create_max_dequeue_zero(void) +{ + rtems_status_code sc; + rtems_regulator_attributes attributes = { + .deliverer = test_regulator_deliverer, + .deliverer_context = NULL, + .maximum_message_size = 16, + .maximum_messages = 10, + .delivery_thread_priority = 16, + .delivery_thread_stack_size = 0, + .delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(1000), + .maximum_to_dequeue_per_period = 0 + }; + rtems_regulator_instance *regulator; + + regulator = NULL; + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_INVALID_NUMBER); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create() NULL attributes error + * + * This unit test verifies that rtems_regulator_create() returns an error when + * the attributes argument is NULL. + */ +static void test_regulator_create_null_attributes(void) +{ + rtems_status_code sc; + rtems_regulator_instance *regulator; + + sc = rtems_regulator_create(NULL, ®ulator); + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create NULL regulator error + * + * This unit test verifies that rtems_regulator_create() returns an error when + * the regulator argument is NULL. + */ +static void test_regulator_create_null_regulator(void) +{ + rtems_status_code sc; + rtems_regulator_attributes attributes; + + sc = rtems_regulator_create(&attributes, NULL); + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create deliverer is NULL + * + * This unit test verifies that rtems_regulator_create() returns an error when + * the the attributes deliverer field is NULL. + */ +static void test_regulator_create_deliverer_is_null(void) +{ + rtems_status_code sc; + rtems_regulator_attributes attributes; + rtems_regulator_instance *regulator; + + (void) memset(&attributes, 0, sizeof(rtems_regulator_attributes)); + + attributes.deliverer = NULL; + attributes.maximum_messages = 0; + attributes.maximum_message_size = 16; + attributes.maximum_to_dequeue_per_period = 1; + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create maximum_messages is 0 error + * + * This unit test verifies that rtems_regulator_create() returns an error when + * the the attributes maximum_messages field is 0. + */ +static void test_regulator_create_maximum_messages_is_zero(void) +{ + rtems_status_code sc; + rtems_regulator_attributes attributes; + rtems_regulator_instance *regulator; + + (void) memset(&attributes, 0, sizeof(rtems_regulator_attributes)); + + attributes.deliverer = test_regulator_deliverer; + attributes.maximum_messages = 0; + attributes.maximum_message_size = 16; + attributes.maximum_to_dequeue_per_period = 1; + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_INVALID_NUMBER); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create maximum_message_size is 0 error + * + * This unit test verifies that rtems_regulator_create() returns an error when + * the the attributes maximum_message_size field is 0. + */ +static void test_regulator_create_maximum_message_size_is_zero(void) +{ + rtems_status_code sc; + rtems_regulator_attributes attributes; + rtems_regulator_instance *regulator; + + (void) memset(&attributes, 0, sizeof(rtems_regulator_attributes)); + + attributes.deliverer = test_regulator_deliverer; + attributes.maximum_messages = 10; + attributes.maximum_message_size = 0; + attributes.maximum_to_dequeue_per_period = 1; + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_INVALID_SIZE); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create maximum_to_dequeue_per_period is 0 error + * + * This unit test verifies that rtems_regulator_create() returns an error when + * the the attributes maximum_to_dequeue_per_period field is 0. + */ +static void test_regulator_create_maximum_to_dequeue_per_period_is_zero(void) +{ + rtems_status_code sc; + rtems_regulator_attributes attributes; + rtems_regulator_instance *regulator; + + (void) memset(&attributes, 0, sizeof(rtems_regulator_attributes)); + + attributes.deliverer = test_regulator_deliverer; + attributes.maximum_messages = 10; + attributes.maximum_message_size = 0; + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_INVALID_SIZE); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create returns error on failure to allocate regulator + * + * This unit test verifies that rtems_regulator_create() returns an error when + * it is unable to allocate the mmemory for the regulator instance. + */ +static void test_regulator_create_malloc_regulator_fails(void) +{ + rtems_status_code sc; + rtems_regulator_attributes attributes; + rtems_regulator_instance *regulator; + + (void) memset(&attributes, 0, sizeof(rtems_regulator_attributes)); + + attributes.deliverer = test_regulator_deliverer; + attributes.maximum_messages = 10; + attributes.maximum_message_size = 16; + attributes.delivery_thread_priority = 32; + attributes.maximum_to_dequeue_per_period = 1; + attributes.delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(1000); + + malloc_trigger_enable(1); + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_NO_MEMORY); + + malloc_trigger_reset(); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create returns error on failure to allocate buffers + * + * This unit test verifies that rtems_regulator_create() returns an error when + * it is unable to allocate the mmemory for the regulator buffers. + */ +static void test_regulator_create_malloc_buffers_fails(void) +{ + rtems_status_code sc; + rtems_regulator_attributes attributes; + rtems_regulator_instance *regulator; + + (void) memset(&attributes, 0, sizeof(rtems_regulator_attributes)); + + attributes.deliverer = test_regulator_deliverer; + attributes.maximum_messages = 10; + attributes.maximum_message_size = 16; + attributes.delivery_thread_priority = 32; + attributes.maximum_to_dequeue_per_period = 1; + attributes.delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(1000); + + malloc_trigger_enable(2); + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_NO_MEMORY); + + malloc_trigger_reset(); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create and delete work + * + * This unit test verifies that rtems_regulator_create() can successfully create + * the the attributes delivery_thread_priority field is 0. + */ +static void test_regulator_create_delivery_thread_priority_is_zero(void) +{ + rtems_status_code sc; + rtems_regulator_attributes attributes; + rtems_regulator_instance *regulator; + + (void) memset(&attributes, 0, sizeof(rtems_regulator_attributes)); + + attributes.deliverer = test_regulator_deliverer; + attributes.maximum_messages = 10; + attributes.maximum_message_size = 16; + attributes.delivery_thread_priority = 0; + attributes.maximum_to_dequeue_per_period = 1; + attributes.delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(1000); + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_INVALID_PRIORITY); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create rtems_partition_create error + * + * This unit test verifies that rtems_regulator_create() correctly returns an + * error when the call to rtems_partition_create() fails. + */ +static void test_regulator_create_partition_create_fails(void) +{ + rtems_status_code sc; + rtems_id partition_id; + unsigned long partition_area[16]; + rtems_regulator_attributes attributes; + rtems_regulator_instance *regulator; + + sc = rtems_partition_create( + rtems_build_name('T', 'P', 'T', 'P'), + partition_area, + 16 * sizeof(unsigned long), + 2 * sizeof(unsigned long), + RTEMS_DEFAULT_ATTRIBUTES, + &partition_id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + (void) memset(&attributes, 0, sizeof(rtems_regulator_attributes)); + + attributes.deliverer = test_regulator_deliverer; + attributes.maximum_messages = 10; + attributes.maximum_message_size = 16; + attributes.delivery_thread_priority = 8; + attributes.maximum_to_dequeue_per_period = 1; + attributes.delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(1000); + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_TOO_MANY); + + sc = rtems_partition_delete(partition_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create rtems_message_queue_create error + * + * This unit test verifies that rtems_regulator_create() correctly returns an + * error when the call to rtems_message_queue_create() fails. + */ +static void test_regulator_create_message_queue_create_fails(void) +{ + rtems_status_code sc; + rtems_id queue_id; + rtems_regulator_attributes attributes; + rtems_regulator_instance *regulator; + + sc = rtems_message_queue_create( + rtems_build_name('T', 'Q', 'T', 'Q'), + 4, + sizeof(unsigned long), + RTEMS_DEFAULT_ATTRIBUTES, + &queue_id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + (void) memset(&attributes, 0, sizeof(rtems_regulator_attributes)); + + attributes.deliverer = test_regulator_deliverer; + attributes.maximum_messages = 10; + attributes.maximum_message_size = 16; + attributes.delivery_thread_priority = 8; + attributes.maximum_to_dequeue_per_period = 1; + attributes.delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(1000); + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_TOO_MANY); + + sc = rtems_message_queue_delete(queue_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_create rtems_task_create error + * + * This unit test verifies that rtems_regulator_create() correctly returns an + * error when the call to rtems_task_create() fails. + */ +static void test_regulator_create_task_create_fails(void) +{ + rtems_status_code sc; + rtems_id task_id; + rtems_regulator_attributes attributes; + rtems_regulator_instance *regulator; + + sc = rtems_task_create( + rtems_build_name('T', 'T', 'T', 'T'), + 80, + 0, + RTEMS_DEFAULT_MODES, + RTEMS_DEFAULT_ATTRIBUTES, + &task_id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + (void) memset(&attributes, 0, sizeof(rtems_regulator_attributes)); + + attributes.deliverer = test_regulator_deliverer; + attributes.maximum_messages = 10; + attributes.maximum_message_size = 16; + attributes.delivery_thread_priority = 8; + attributes.maximum_to_dequeue_per_period = 1; + attributes.delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(1000); + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_TOO_MANY); + + sc = rtems_task_delete(task_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +/** + * @ingroup RegulatorTests + * @brief Verify Regulator Output Thread Handles Error on Period Create + * + * This unit test verifies that regulator output thread correctly exits + * when the call to rtems_rate_monotonic_create() fails. + * + * This error condition/path cannot be directly detected via a return code, + * It is verified via a debugger or code coverage reports. + */ +static void test_regulator_create_rate_monotonic_create_fails(void) +{ + rtems_status_code sc; + rtems_id period_id; + rtems_regulator_attributes attributes; + rtems_regulator_instance *regulator; + + sc = rtems_rate_monotonic_create( + rtems_build_name('T', 'S', 'T', 'P'), + &period_id + ); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + (void) memset(&attributes, 0, sizeof(rtems_regulator_attributes)); + + attributes.deliverer = test_regulator_deliverer; + attributes.maximum_messages = 10; + attributes.maximum_message_size = 16; + attributes.delivery_thread_priority = 8; + attributes.maximum_to_dequeue_per_period = 1; + attributes.delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(1000); + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + /* + * Let the output thread execute and encounter the create error. + */ + + sleep(1); + + /* + * Now deallocate the resources allocated earlier + */ + sc = rtems_regulator_delete(regulator, FIVE_SECONDS); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_rate_monotonic_delete(period_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_delete NULL regulator error + * + * This unit test verifies that rtems_regulator_delete() returns an error when + * the regulator argument is NULL. + */ +static void test_regulator_delete_null_regulator(void) +{ + rtems_status_code sc; + + sc = rtems_regulator_delete(NULL, FIVE_SECONDS); + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_delete uninitialized regulator error + * + * This unit test verifies that rtems_regulator_delete() returns an error when + * the regulator argument is uninitialized. + */ +static void test_regulator_delete_uninitialized_regulator(void) +{ + rtems_status_code sc; + rtems_regulator_instance regulator; + + (void) memset(®ulator, 0, sizeof(regulator)); + + sc = rtems_regulator_delete(®ulator, 0); + rtems_test_assert(sc == RTEMS_INCORRECT_STATE); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_delete successful case + * + * This unit test verifies that rtems_regulator_delete() can be successfully + * deleted. + */ +static void test_regulator_delete_OK(void) +{ + rtems_status_code sc; + rtems_regulator_instance *regulator; + + regulator = test_regulator_create_regulator_OK(); + rtems_test_assert(regulator != NULL); + + sc = rtems_regulator_delete(regulator, FIVE_SECONDS); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_obtain_buffer NULL regulator error + * + * This unit test verifies that rtems_regulator_obtain_buffer() returns an error when + * the regulator argument is NULL. + */ +static void test_regulator_obtain_buffer_null_regulator(void) +{ + rtems_status_code sc; + void *buffer; + + sc = rtems_regulator_obtain_buffer(NULL, &buffer); + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_obtain_buffer uninitialized regulator error + * + * This unit test verifies that rtems_regulator_obtain_buffer() returns an error when + * the regulator argument is uninitialized. + */ +static void test_regulator_obtain_buffer_uninitialized_regulator(void) +{ + rtems_status_code sc; + rtems_regulator_instance regulator; + void *buffer; + + (void) memset(®ulator, 0, sizeof(regulator)); + + sc = rtems_regulator_obtain_buffer(®ulator, &buffer); + rtems_test_assert(sc == RTEMS_INCORRECT_STATE); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_obtain_buffer successful case + * + * This unit test verifies that rtems_regulator_obtain_buffer() can be successfully + * obtained from an initialized regulator. + */ +static void test_regulator_obtain_buffer_OK(void) +{ + rtems_status_code sc; + rtems_regulator_instance *regulator; + void *buffer; + + regulator = test_regulator_create_regulator_OK(); + rtems_test_assert(regulator != NULL); + + sc = rtems_regulator_obtain_buffer(regulator, &buffer); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(buffer != NULL); + + /* + * Not really testing this here but cannot delete underlying partition + * if there are buffers outstanding. + */ + sc = rtems_regulator_release_buffer(regulator, buffer); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(buffer != NULL); + + sc = rtems_regulator_delete(regulator, FIVE_SECONDS); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_release_buffer NULL regulator error + * + * This unit test verifies that rtems_regulator_release_buffer() returns an error when + * the regulator argument is NULL. + */ +static void test_regulator_release_buffer_null_regulator(void) +{ + rtems_status_code sc; + void *buffer; + + sc = rtems_regulator_release_buffer(NULL, &buffer); + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_release_buffer uninitialized regulator error + * + * This unit test verifies that rtems_regulator_release_buffer() returns an + * error when the regulator argument is uninitialized. + */ +static void test_regulator_release_buffer_uninitialized_regulator(void) +{ + rtems_status_code sc; + rtems_regulator_instance regulator; + void *buffer; + + (void) memset(®ulator, 0, sizeof(regulator)); + + sc = rtems_regulator_release_buffer(®ulator, &buffer); + rtems_test_assert(sc == RTEMS_INCORRECT_STATE); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_release_buffer successful case + * + * This unit test verifies that rtems_regulator_release_buffer() can be successfully + * invoked with a buffer previously allocated by rtems_regulator_obtain_buffer(). + */ +static void test_regulator_release_buffer_OK(void) +{ + rtems_status_code sc; + rtems_regulator_instance *regulator; + void *buffer; + + regulator = test_regulator_create_regulator_OK(); + rtems_test_assert(regulator != NULL); + + sc = rtems_regulator_obtain_buffer(regulator, &buffer); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(buffer != NULL); + + sc = rtems_regulator_release_buffer(regulator, buffer); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sc = rtems_regulator_delete(regulator, FIVE_SECONDS); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_send NULL regulator error + * + * This unit test verifies that rtems_regulator_send() returns an error when + * the regulator argument is NULL. + */ +static void test_regulator_send_null_regulator(void) +{ + rtems_status_code sc; + void *buffer; + size_t length; + + buffer = &length; + length = sizeof(size_t); + + sc = rtems_regulator_send(NULL, buffer, length); + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_send NULL message error + * + * This unit test verifies that rtems_regulator_send() returns an error when + * the message argument is NULL. + */ +static void test_regulator_send_null_message(void) +{ + rtems_status_code sc; + size_t length; + rtems_regulator_instance regulator; + + length = sizeof(size_t); + + sc = rtems_regulator_send(®ulator, NULL, length); + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_send zero length message error + * + * This unit test verifies that rtems_regulator_send() returns an + * error when the message length is 0. + */ +static void test_regulator_send_length_is_zero(void) +{ + rtems_status_code sc; + rtems_regulator_instance regulator; + void *buffer; + size_t length; + + buffer = &length; + length = 0; + + sc = rtems_regulator_send(®ulator, buffer, length); + rtems_test_assert(sc == RTEMS_INVALID_NUMBER); +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_send uninitialized regulator error + * + * This unit test verifies that rtems_regulator_send() returns an + * error when the regulator argument is uninitialized. + */ +static void test_regulator_send_uninitialized_regulator(void) +{ + rtems_status_code sc; + rtems_regulator_instance regulator; + void *buffer; + size_t length; + + buffer = &length; + length = sizeof(size_t); + + (void) memset(®ulator, 0, sizeof(regulator)); + + sc = rtems_regulator_send(®ulator, buffer, length); + rtems_test_assert(sc == RTEMS_INCORRECT_STATE); +} + +/** + * @ingroup RegulatorTests + * @brief Verify Cannot Delete with Message Outstanding + * + * This unit test verifies that when the regulator is successfully + * initialized, that it cannot be deleted with an undelivered message. + * It also verifies some basic statistics are working. + */ +static void test_regulator_cannot_delete_with_outstanding(void) +{ + rtems_status_code sc; + rtems_regulator_instance *regulator; + char message[MAXIMUM_MESSAGE_LENGTH]; + void *buffer; + size_t length; + int match; + rtems_regulator_attributes attributes = { + .deliverer = test_regulator_deliverer_logger, + .deliverer_context = &deliverer_logger_context, + .maximum_message_size = 16, + .maximum_messages = 10, + .delivery_thread_priority = 16, + .delivery_thread_stack_size = 0, + .delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(250), + .maximum_to_dequeue_per_period = 3 + }; + rtems_regulator_statistics stats; + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(regulator != NULL); + + deliverer_logger_context.regulator = regulator; + + delivered_messages_reset(); + + // Ensure statistics show no buffers obtained or processed + sc = rtems_regulator_get_statistics(regulator, &stats); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(stats.obtained == 0); + rtems_test_assert(stats.released == 0); + rtems_test_assert(stats.delivered == 0); + rtems_test_assert(stats.period_statistics.count == 0); + rtems_test_assert(stats.period_statistics.missed_count == 0); + + // Obtain a buffer which should change the statistics + sc = rtems_regulator_obtain_buffer(regulator, &buffer); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(buffer != NULL); + + // Ensure statistics show one buffer obtained + sc = rtems_regulator_get_statistics(regulator, &stats); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(stats.obtained == 1); + rtems_test_assert(stats.released == 0); + rtems_test_assert(stats.delivered == 0); + rtems_test_assert(stats.period_statistics.count == 0); + rtems_test_assert(stats.period_statistics.missed_count == 0); + + + // Format and send the message -- statistics do not change + length = snprintf(message, MAXIMUM_MESSAGE_LENGTH, "message %d", 1024) + 1; + strcpy(buffer, message); + + sc = rtems_regulator_send(regulator, buffer, length); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + // Ensure statistics show one buffer obtained + sc = rtems_regulator_get_statistics(regulator, &stats); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(stats.obtained == 1); + rtems_test_assert(stats.released == 0); + rtems_test_assert(stats.delivered == 0); + rtems_test_assert(stats.period_statistics.count == 0); + rtems_test_assert(stats.period_statistics.missed_count == 0); + + // This is the actual failing case -- cannot delete w/outstanding + sc = rtems_regulator_delete(regulator, FIVE_SECONDS); + rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE); + + // Now let the deliveries happen + sleep(1); + + // Ensure statistics show all buffers released + sc = rtems_regulator_get_statistics(regulator, &stats); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(stats.obtained == 1); + rtems_test_assert(stats.released == 1); + rtems_test_assert(stats.delivered == 1); + rtems_test_assert(stats.period_statistics.count != 0); + rtems_test_assert(stats.period_statistics.missed_count == 0); + + rtems_test_assert(delivered_message_count == 1); + match = strncmp( + delivered_messages[0].message, + message, + MAXIMUM_MESSAGE_LENGTH + ); + rtems_test_assert(match == 0); + + sc = rtems_regulator_delete(regulator, FIVE_SECONDS); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + deliverer_logger_context.regulator = NULL; +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_send and output thread delivers message + * + * This unit test verifies that when the regulator is + * successfully initialized and used as expected, a message sent via + * rtems_regulator_send() is delivered as expected. + */ +static void test_regulator_send_one_message_OK(void) +{ + rtems_status_code sc; + rtems_regulator_instance *regulator; + char message[MAXIMUM_MESSAGE_LENGTH]; + void *buffer; + size_t length; + int match; + rtems_regulator_attributes attributes = { + .deliverer = test_regulator_deliverer_logger, + .deliverer_context = &deliverer_logger_context, + .maximum_message_size = 16, + .maximum_messages = 10, + .delivery_thread_priority = 16, + .delivery_thread_stack_size = 0, + .delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(250), + .maximum_to_dequeue_per_period = 3 + }; + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(regulator != NULL); + + deliverer_logger_context.regulator = regulator; + + delivered_messages_reset(); + + sc = rtems_regulator_obtain_buffer(regulator, &buffer); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(buffer != NULL); + + length = snprintf(message, MAXIMUM_MESSAGE_LENGTH, "message %d", 1024) + 1; + strcpy(buffer, message); + + sc = rtems_regulator_send(regulator, buffer, length); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + sleep(1); + + rtems_test_assert(delivered_message_count == 1); + match = strncmp( + delivered_messages[0].message, + message, + MAXIMUM_MESSAGE_LENGTH + ); + rtems_test_assert(match == 0); + + sc = rtems_regulator_delete(regulator, FIVE_SECONDS); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + deliverer_logger_context.regulator = NULL; +} + +/** + * @ingroup RegulatorTests + * @brief Verify rtems_regulator_send and output thread delivers messages + * + * This unit test verifies that when the regulator is successfully initialized + * and used as expected, and multiple messages are sent via rtems_regulator_send() + * that they are delivered as expected. + */ +#include <stdio.h> +static void test_regulator_send_multiple_messages_OK(void) +{ + rtems_status_code sc; + rtems_regulator_instance *regulator; + char message[MAXIMUM_MESSAGE_LENGTH]; + void *buffer; + size_t length; + int match; + int i; + time_t base_time; + time_t tmp_time; + rtems_interval base_ticks; + rtems_interval ticks; + rtems_interval ticks_per_second; + + rtems_regulator_attributes attributes = { + .deliverer = test_regulator_deliverer_logger, + .deliverer_context = &deliverer_logger_context, + .maximum_message_size = MAXIMUM_MESSAGE_LENGTH, + .maximum_messages = 10, + .delivery_thread_priority = 16, + .delivery_thread_stack_size = 0, + .delivery_thread_period = RTEMS_MILLISECONDS_TO_TICKS(1000), + .maximum_to_dequeue_per_period = 2 + }; + + delivered_messages_reset(); + + sc = rtems_regulator_create(&attributes, ®ulator); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(regulator != NULL); + + deliverer_logger_context.regulator = regulator; + + /* + * Ensure the messages are sent on a second boundary to ensure the + * output thread will process them as expected. + */ + tmp_time = time(NULL); + do { + base_time = time(NULL); + } while (tmp_time == base_time); + + /** + * Send five messages as a burst which will need to be smoothly sent at + * the configured rate. + */ + for (i=1 ; i <= 5 ; i++) { + sc = rtems_regulator_obtain_buffer(regulator, &buffer); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(buffer != NULL); + + length = snprintf(message, MAXIMUM_MESSAGE_LENGTH, "message %d", i); + strcpy(buffer, message); + + sc = rtems_regulator_send(regulator, buffer, length); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + } + + /* + * Let the output thread executed and deliver the messages. + */ + sleep(5); + + /** + * Ensure the five messages were delivered as follows: + * + * - deliver all 5 + * - contents are "message N" where N is 1 to 5 + * - message 1 and 2 delivered during the first second + * - message 3 and 4 delivered during the second second + * - message 5 delivered during the third second + * - no further messages delivered + */ + + rtems_test_assert(delivered_message_count == 5); + + for (i=0 ; i < 5 ; i++) { + (void) snprintf(message, MAXIMUM_MESSAGE_LENGTH, "message %d", i+1); +// printf("%d %s\n", i, delivered_messages[i].message); + match = strncmp( + delivered_messages[i].message, + message, + MAXIMUM_MESSAGE_LENGTH + ); + rtems_test_assert(match == 0); + } + + /** + * Verify that messages were delivered in the proper groups. Check that + * the delivery time matches expectations. + */ + rtems_test_assert(delivered_messages[0].processed == delivered_messages[1].processed); + rtems_test_assert(delivered_messages[1].processed != delivered_messages[2].processed); + rtems_test_assert(delivered_messages[2].processed == delivered_messages[3].processed); + rtems_test_assert(delivered_messages[3].processed != delivered_messages[4].processed); + + /** + * Verify that the message groups were properly spaced temporally. They + * should be one second apart. + */ + ticks_per_second = rtems_clock_get_ticks_per_second(); + + base_ticks = delivered_messages[1].processed; + ticks = delivered_messages[2].processed; + rtems_test_assert(ticks_per_second == ticks - base_ticks); + + base_ticks = delivered_messages[3].processed; + ticks = delivered_messages[4].processed; + rtems_test_assert(ticks_per_second == ticks - base_ticks); + + sc = rtems_regulator_delete(regulator, FIVE_SECONDS); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + deliverer_logger_context.regulator = NULL; +} + +/* Necessary prototype */ +rtems_task test_regulator(rtems_task_argument); + +/** + * @ingroup RegulatorTestshttps://devel.rtems.org/milestone/6.1 + * @brief Test entry task which invokes test cases + */ +rtems_task test_regulator(rtems_task_argument arg) +{ + (void) arg; + + TEST_BEGIN(); + + malloc_trigger_reset(); + + test_regulator_create_max_dequeue_zero(); + test_regulator_create_null_attributes(); + test_regulator_create_null_regulator(); + test_regulator_create_deliverer_is_null(); + test_regulator_create_maximum_messages_is_zero(); + test_regulator_create_maximum_message_size_is_zero(); + test_regulator_create_maximum_to_dequeue_per_period_is_zero(); + test_regulator_create_malloc_regulator_fails(); + test_regulator_create_malloc_buffers_fails(); + test_regulator_create_delivery_thread_priority_is_zero(); + test_regulator_create_partition_create_fails(); + test_regulator_create_message_queue_create_fails(); + test_regulator_create_task_create_fails(); + test_regulator_create_rate_monotonic_create_fails(); + + test_regulator_delete_null_regulator(); + test_regulator_delete_uninitialized_regulator(); + test_regulator_delete_OK(); + + test_regulator_obtain_buffer_null_regulator(); + test_regulator_obtain_buffer_uninitialized_regulator(); + test_regulator_obtain_buffer_OK(); + + test_regulator_release_buffer_null_regulator(); + test_regulator_release_buffer_uninitialized_regulator(); + test_regulator_release_buffer_OK(); + + test_regulator_send_null_regulator(); + test_regulator_send_null_message(); + test_regulator_send_length_is_zero(); + test_regulator_send_uninitialized_regulator(); + + test_regulator_send_one_message_OK(); + test_regulator_cannot_delete_with_outstanding(); + + test_regulator_send_multiple_messages_OK(); + + TEST_END(); + + rtems_test_exit(0); +} diff --git a/testsuites/libtests/regulator01/regulator01.doc b/testsuites/libtests/regulator01/regulator01.doc new file mode 100644 index 0000000000..ff4e8005ec --- /dev/null +++ b/testsuites/libtests/regulator01/regulator01.doc @@ -0,0 +1,67 @@ +# SPDX-License-Identifier: BSD-2-Clause + +# Copyright (c) 2023 OAR Corporation +# +# 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. +# + +This file describes the directives and concepts tested by this test set. + +test set name: regulator01 + +directives: + + rtems_regulator_create + + rtems_regulator_delete + + rtems_regulator_obtain_buffer + + rtems_regulator_release_buffer + + rtems_regulator_send + +concepts + + Verify rtems_regulator_create() maximum_to_dequeue_per_period + + Verify rtems_regulator_create() NULL attributes error + + Verify rtems_regulator_create NULL regulator error + + Verify rtems_regulator_create deliverer is NULL + + Verify rtems_regulator_create maximum_messages is 0 error + + Verify rtems_regulator_create maximum_message_size is 0 error + + Verify rtems_regulator_create maximum_to_dequeue_per_period is 0 error + + Verify rtems_regulator_create returns error on failure to allocate regulator + + Verify rtems_regulator_create returns error on failure to allocate buffers + + Verify rtems_regulator_create and delete work + + Verify rtems_regulator_create rtems_partition_create error + + Verify rtems_regulator_create rtems_message_queue_create error + + Verify rtems_regulator_create rtems_task_create error + + Verify Regulator Output Thread Handles Error on Period Create + + Verify rtems_regulator_delete NULL regulator error + + Verify rtems_regulator_delete uninitialized regulator error + + Verify rtems_regulator_delete successful case + + Verify rtems_regulator_obtain_buffer NULL regulator error + + Verify rtems_regulator_obtain_buffer uninitialized regulator error + + Verify rtems_regulator_obtain_buffer successful case + + Verify rtems_regulator_release_buffer NULL regulator error + + Verify rtems_regulator_release_buffer uninitialized regulator error + + Verify rtems_regulator_release_buffer successful case + + Verify rtems_regulator_send NULL regulator error + + Verify rtems_regulator_send NULL message error + + Verify rtems_regulator_send zero length message error + + Verify rtems_regulator_send uninitialized regulator error + + Verify rtems_regulator_send and output thread delivers message + + Verify rtems_regulator_send and cannot delete with outstanding messages diff --git a/testsuites/libtests/regulator01/rtems_config.c b/testsuites/libtests/regulator01/rtems_config.c new file mode 100644 index 0000000000..ca96e1b1dd --- /dev/null +++ b/testsuites/libtests/regulator01/rtems_config.c @@ -0,0 +1,59 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @brief RTEMS Configuration for regulator tests + */ + +/* + * COPYRIGHT (c) 2022. * On-Line Applications Research Corporation (OAR). + * + * 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. + */ + + +#include <rtems.h> + +rtems_task test_regulator(rtems_task_argument); + +#include <bsp.h> /* for device driver prototypes */ + +/* NOTICE: the clock driver is explicitly disabled */ +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER + +#define CONFIGURE_RTEMS_INIT_TASKS_TABLE +#define CONFIGURE_INIT_TASK_ENTRY_POINT test_regulator +#define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT + +/* Use hard limits to make it easier to trip object creation errors */ +#define CONFIGURE_MAXIMUM_TASKS 2 +#define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 +#define CONFIGURE_MAXIMUM_PARTITIONS 1 +#define CONFIGURE_MAXIMUM_PERIODS 1 + +#define CONFIGURE_UNIFIED_WORK_AREAS +#define CONFIGURE_MINIMUM_TASK_STACK_SIZE (8 * 1024) + +#define CONFIGURE_INIT +#include <rtems/confdefs.h> diff --git a/testsuites/libtests/termios01/termios_testdriver.c b/testsuites/libtests/termios01/termios_testdriver.c index d0a9534b52..49810a37e0 100644 --- a/testsuites/libtests/termios01/termios_testdriver.c +++ b/testsuites/libtests/termios01/termios_testdriver.c @@ -192,7 +192,7 @@ rtems_device_driver termios_test_driver_open( termios_test_driver_set_attributes, /* setAttributes */ NULL, /* stopRemoteTx */ NULL, /* startRemoteTx */ - 0 /* outputUsesInterrupts */ + TERMIOS_POLLED /* outputUsesInterrupts */ }; if ( minor > 2 ) { diff --git a/testsuites/libtests/termios03/termios_testdriver_polled.c b/testsuites/libtests/termios03/termios_testdriver_polled.c index a852fe1f20..8daf8d6685 100644 --- a/testsuites/libtests/termios03/termios_testdriver_polled.c +++ b/testsuites/libtests/termios03/termios_testdriver_polled.c @@ -159,7 +159,7 @@ rtems_device_driver termios_test_driver_open( termios_test_driver_set_attributes, /* setAttributes */ NULL, /* stopRemoteTx */ NULL, /* startRemoteTx */ - 0 /* outputUsesInterrupts */ + TERMIOS_POLLED /* outputUsesInterrupts */ }; if ( minor > 2 ) { diff --git a/testsuites/libtests/termios04/termios_testdriver_impl.h b/testsuites/libtests/termios04/termios_testdriver_impl.h index cfe9ebedf4..740f9e0778 100644 --- a/testsuites/libtests/termios04/termios_testdriver_impl.h +++ b/testsuites/libtests/termios04/termios_testdriver_impl.h @@ -271,7 +271,7 @@ rtems_device_driver termios_test_driver_open( #if defined(TASK_DRIVEN) TERMIOS_TASK_DRIVEN /* outputUsesInterrupts */ #else - 0 /* outputUsesInterrupts */ + TERMIOS_POLLED /* outputUsesInterrupts */ #endif }; diff --git a/testsuites/psxtests/psx13/test.c b/testsuites/psxtests/psx13/test.c index 0754dbcf30..951953ae98 100644 --- a/testsuites/psxtests/psx13/test.c +++ b/testsuites/psxtests/psx13/test.c @@ -639,6 +639,8 @@ static void FutimensTest( void ) /* EBADF test case */ /* Case: Pass an invalid file descriptor */ + _Timespec_Set_to_zero( &time[0] ); + _Timespec_Set_to_zero( &time[1] ); rv = futimens( -1, time ); rtems_test_assert( rv == -1 ); rtems_test_assert( errno == EBADF ); diff --git a/testsuites/psxtests/psxftw01/init.c b/testsuites/psxtests/psxftw01/init.c index 9d89c1e376..5bd89928d1 100644 --- a/testsuites/psxtests/psxftw01/init.c +++ b/testsuites/psxtests/psxftw01/init.c @@ -66,36 +66,6 @@ void *POSIX_Init (void * argument); static char file_traverse_order[6][20]; static int file_order; -static char buffer[512]; - -static const T_action actions[] = { - T_report_hash_sha256, - T_check_task_context, - T_check_file_descriptors, - T_check_rtems_barriers, - T_check_rtems_extensions, - T_check_rtems_message_queues, - T_check_rtems_partitions, - T_check_rtems_periods, - T_check_rtems_regions, - T_check_rtems_semaphores, - T_check_rtems_tasks, - T_check_rtems_timers, - T_check_posix_keys -}; - -static const T_config config = { - .name = "psxftw01", - .buf = buffer, - .buf_size = sizeof(buffer), - .putchar = rtems_put_char, - .verbosity = T_VERBOSE, - .now = T_now_clock, - .action_count = T_ARRAY_SIZE(actions), - .actions = actions -}; - - static int fn_function (const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf) { @@ -122,9 +92,7 @@ T_TEST_CASE(ftw) TARFILE_SIZE, &rtems_test_printer ); - if (sc != RTEMS_SUCCESSFUL) { - printf ("error: untar failed: %s\n", rtems_status_text (sc)); - } + T_rsc_success( sc ); /* Array with expected file order */ char arr_ftw_depth[5][20] = { "test_file", "test_script", "def", "abc", "home" }; @@ -136,49 +104,31 @@ T_TEST_CASE(ftw) file_order = 0; flags |= FTW_DEPTH; r = nftw( files_path, fn_function, 5, flags ); - - T_quiet_psx_success(r); + T_psx_success( r ); /*comparing the nftw file tree to the expexted file tree traversal */ for (i = 0; i < file_order; i++){ r = strcmp( arr_ftw_depth[i], file_traverse_order[i]); - if (r){ - printf( "Incorrect Order " ); - } - T_quiet_psx_success(r); + T_eq_int( r, 0 ); } /*----------------Test Block 2--------------------*/ flags = 0; file_order = 0; flags |= FTW_PHYS; r = nftw( files_path, fn_function, 5, flags ); - T_quiet_psx_success(r); + T_psx_success(r); /*comparing the nftw file tree to the expected file tree traversal*/ for (i = 0; i < file_order; i++){ r = strcmp( arr_ftw_phys[i], file_traverse_order[i]); - if (r){ - printf( "Incorrect Order " ); - } - T_quiet_psx_success(r); + T_eq_int( r, 0 ); } } void *POSIX_Init (void * argument) { - int exit_code; - - TEST_BEGIN(); - - T_register(); - exit_code = T_main(&config); - if (exit_code == 0) { - TEST_END(); - } - - rtems_test_exit(exit_code); - + rtems_test_run( (rtems_task_argument) argument, TEST_STATE ); } /* NOTICE: the clock driver is explicitly disabled */ diff --git a/testsuites/psxtests/psxkey07/init.c b/testsuites/psxtests/psxkey07/init.c index 15387264ba..ff7b3a0bd0 100644 --- a/testsuites/psxtests/psxkey07/init.c +++ b/testsuites/psxtests/psxkey07/init.c @@ -39,32 +39,27 @@ const char rtems_test_name[] = "PSXKEY 7"; -/* forward declarations to avoid warnings */ -rtems_task Init(rtems_task_argument argument); -rtems_task Test_Thread(rtems_task_argument argument); +#define INITIAL_TASK_COUNT 10 -pthread_key_t Key; -int created_thread_count, setted_thread_count, got_thread_count; -int all_thread_created; -pthread_mutex_t mutex1, mutex2; -pthread_cond_t create_condition_var, set_condition_var; +#define ADDITIONAL_TASK_COUNT 13 -rtems_task Test_Thread(rtems_task_argument argument) +static pthread_key_t Key; +static int created_thread_count, setted_thread_count, got_thread_count; +static int all_thread_created; +static pthread_mutex_t mutex1, mutex2; +static pthread_cond_t create_condition_var, set_condition_var; + +static rtems_task Test_Thread(rtems_task_argument argument) { int sc; int *value_p, *value_p2; value_p = malloc( sizeof( int ) ); rtems_test_assert(value_p != NULL); -/* - * This was added to address the following warning. - * warning: 'value_p' may be used uninitialized - */ -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" - sc = pthread_setspecific( Key, value_p ); -#pragma GCC diagnostic pop - rtems_test_assert( !sc ); + + *value_p = 123; + sc = pthread_setspecific( Key, value_p ); + rtems_test_assert( !sc ); pthread_mutex_lock( &mutex1 ); ++setted_thread_count; @@ -86,12 +81,13 @@ rtems_task Test_Thread(rtems_task_argument argument) rtems_task_exit(); } -rtems_task Init(rtems_task_argument argument) +static rtems_task Init(rtems_task_argument argument) { rtems_status_code rc; int sc; struct timespec delay_request; - uintptr_t max_free_size = 13 * RTEMS_MINIMUM_STACK_SIZE; + uintptr_t max_free_size = + ADDITIONAL_TASK_COUNT * RTEMS_MINIMUM_STACK_SIZE; void *greedy; all_thread_created = 0; @@ -222,8 +218,10 @@ rtems_task Init(rtems_task_argument argument) #define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION -#define CONFIGURE_MAXIMUM_TASKS rtems_resource_unlimited(10) -#define CONFIGURE_MAXIMUM_POSIX_KEYS 1 +#define CONFIGURE_MAXIMUM_TASKS rtems_resource_unlimited(INITIAL_TASK_COUNT) +#define CONFIGURE_MAXIMUM_POSIX_KEYS 1 +#define CONFIGURE_MAXIMUM_POSIX_KEY_VALUE_PAIRS \ + (INITIAL_TASK_COUNT + ADDITIONAL_TASK_COUNT) #define CONFIGURE_UNIFIED_WORK_AREAS #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/rhealstone/rhdeadlockbrk/deadlockbrk.c b/testsuites/rhealstone/rhdeadlockbrk/deadlockbrk.c index 3538003a4a..8154c93338 100644 --- a/testsuites/rhealstone/rhdeadlockbrk/deadlockbrk.c +++ b/testsuites/rhealstone/rhdeadlockbrk/deadlockbrk.c @@ -206,7 +206,6 @@ rtems_task Task03( rtems_task_argument ignored ) #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_MAXIMUM_SEMAPHORES 1 #define CONFIGURE_MAXIMUM_TASKS 4 diff --git a/testsuites/rhealstone/rhilatency/ilatency.c b/testsuites/rhealstone/rhilatency/ilatency.c index 2f6b185604..8985453619 100644 --- a/testsuites/rhealstone/rhilatency/ilatency.c +++ b/testsuites/rhealstone/rhilatency/ilatency.c @@ -22,7 +22,6 @@ #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS 2 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_SCHEDULER_PRIORITY diff --git a/testsuites/rhealstone/rhmlatency/mlatency.c b/testsuites/rhealstone/rhmlatency/mlatency.c index a61e1917e5..76b1113644 100644 --- a/testsuites/rhealstone/rhmlatency/mlatency.c +++ b/testsuites/rhealstone/rhmlatency/mlatency.c @@ -151,7 +151,6 @@ rtems_task Task02( rtems_task_argument ignored ) #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 #define CONFIGURE_MESSAGE_BUFFER_MEMORY \ CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(1, MESSAGE_SIZE) -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT diff --git a/testsuites/rhealstone/rhtaskpreempt/taskpreempt.c b/testsuites/rhealstone/rhtaskpreempt/taskpreempt.c index c5d2b6c809..00534b094d 100644 --- a/testsuites/rhealstone/rhtaskpreempt/taskpreempt.c +++ b/testsuites/rhealstone/rhtaskpreempt/taskpreempt.c @@ -113,7 +113,6 @@ rtems_task Init( rtems_task_argument ignored ) /* configuration information */ #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_MAXIMUM_TASKS 3 #define CONFIGURE_INIT diff --git a/testsuites/rhealstone/rhtaskswitch/taskswitch.c b/testsuites/rhealstone/rhtaskswitch/taskswitch.c index a2cef9fe32..3bcf1ec354 100644 --- a/testsuites/rhealstone/rhtaskswitch/taskswitch.c +++ b/testsuites/rhealstone/rhtaskswitch/taskswitch.c @@ -115,7 +115,6 @@ rtems_task Init( rtems_task_argument ignored ) /* configuration information */ #define CONFIGURE_APPLICATION_NEEDS_SIMPLE_CONSOLE_DRIVER #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_MAXIMUM_TASKS 3 #define CONFIGURE_INIT diff --git a/testsuites/samples/iostream/init.cc b/testsuites/samples/iostream/init.cc index 22d973019b..ddd38a9d15 100644 --- a/testsuites/samples/iostream/init.cc +++ b/testsuites/samples/iostream/init.cc @@ -44,16 +44,17 @@ #include <stdlib.h> +#include <tmacros.h> + const char rtems_test_name[] = "IOSTREAM"; rtems_task Init( rtems_task_argument ignored ) { - std::cout << std::endl << std::endl - << "*** BEGIN OF TEST " << rtems_test_name << " ***" << std::endl; + TEST_BEGIN(); std::cout << "Hello World" << std::endl; - std::cout << "*** END OF TEST " << rtems_test_name << " ***" << std::endl; - exit( 0 ); + TEST_END(); + rtems_test_exit( 0 ); } diff --git a/testsuites/smptests/smpipi01/init.c b/testsuites/smptests/smpipi01/init.c index 290d13775f..f8172fed96 100644 --- a/testsuites/smptests/smpipi01/init.c +++ b/testsuites/smptests/smpipi01/init.c @@ -198,6 +198,43 @@ static const Per_CPU_Job_context counter_1_job_context = { .arg = &test_instance }; +static void sync_handler(void *arg) +{ + test_context *ctx = arg; + SMP_barrier_State *bs = &ctx->worker_barrier_state; + + /* (E) */ + barrier(ctx, bs); +} + +static const Per_CPU_Job_context sync_context = { + .handler = sync_handler, + .arg = &test_instance +}; + +static void wait_for_ipi_done(test_context *ctx, Per_CPU_Control *cpu) +{ + Per_CPU_Job job; + unsigned long done; + + job.context = &sync_context; + _Per_CPU_Submit_job(cpu, &job); + + while (cpu->isr_nest_level == 0) { + RTEMS_COMPILER_MEMORY_BARRIER(); + } + + /* (E) */ + barrier(ctx, &ctx->main_barrier_state); + + while (cpu->isr_nest_level != 0) { + RTEMS_COMPILER_MEMORY_BARRIER(); + } + + done = _Atomic_Load_ulong( &job.done, ATOMIC_ORDER_ACQUIRE ); + rtems_test_assert( done == PER_CPU_JOB_DONE ); +} + static void test_send_message_flood( test_context *ctx, uint32_t cpu_count @@ -211,20 +248,15 @@ static void test_send_message_flood( ctx->jobs[cpu_index][0].context = &counter_0_job_context; ctx->jobs[cpu_index][1].context = &counter_1_job_context; - _Per_CPU_Submit_job(cpu, &ctx->jobs[cpu_index][0]); + _Per_CPU_Add_job(cpu, &ctx->jobs[cpu_index][0]); } for (cpu_index = 0; cpu_index < cpu_count; ++cpu_index) { Per_CPU_Control *cpu; - Per_CPU_Control *cpu_self; uint32_t i; cpu = _Per_CPU_Get_by_index(cpu_index); - cpu_self = _Thread_Dispatch_disable(); - _SMP_Synchronize(); - _Thread_Dispatch_enable(cpu_self); - for (i = 0; i < cpu_count; ++i) { if (i != cpu_index) { ctx->copy_counters[i] = ctx->counters[i].value; @@ -235,6 +267,10 @@ static void test_send_message_flood( _SMP_Send_message(cpu, SMP_MESSAGE_PERFORM_JOBS); } + if (cpu_index != cpu_index_self) { + wait_for_ipi_done(ctx, cpu); + } + for (i = 0; i < cpu_count; ++i) { if (i != cpu_index) { rtems_test_assert(ctx->copy_counters[i] == ctx->counters[i].value); diff --git a/testsuites/smptests/smplock01/init.c b/testsuites/smptests/smplock01/init.c index d000a13b8f..2defa2b5c0 100644 --- a/testsuites/smptests/smplock01/init.c +++ b/testsuites/smptests/smplock01/init.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-2-Clause */ /* - * Copyright (C) 2013, 2016 embedded brains GmbH & Co. KG + * Copyright (C) 2013, 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 @@ -47,6 +47,8 @@ const char rtems_test_name[] = "SMPLOCK 1"; typedef struct { rtems_test_parallel_context base; + const char *test_sep; + const char *counter_sep; unsigned long counter[TEST_COUNT]; unsigned long local_counter[CPU_COUNT][TEST_COUNT][CPU_COUNT]; SMP_lock_Control lock RTEMS_ALIGNED(CPU_CACHE_LINE_BYTES); @@ -84,40 +86,69 @@ static rtems_interval test_init( return test_duration(); } +static const rtems_test_parallel_job test_jobs[TEST_COUNT]; + static void test_fini( test_context *ctx, - const char *name, + const char *lock_type, + bool global_lock, + const char *section_type, size_t test, size_t active_workers ) { + bool cascade = test_jobs[test].cascade; unsigned long sum = 0; - unsigned long n = active_workers; - unsigned long i; + const char *value_sep; + size_t i; + + if (active_workers == 1 || !cascade) { + printf( + "%s{\n" + " \"lock-type\": \"%s\",\n" + " \"lock-object\": \"%s\",\n" + " \"section-type\": \"%s\",\n" + " \"results\": [", + ctx->test_sep, + lock_type, + global_lock ? "global" : "local", + section_type + ); + ctx->test_sep = ", "; + ctx->counter_sep = "\n "; + } - printf(" <%s activeWorker=\"%lu\">\n", name, n); + printf( + "%s{\n" + " \"counter\": [", ctx->counter_sep); + ctx->counter_sep = "\n }, "; + value_sep = ""; - for (i = 0; i < n; ++i) { + for (i = 0; i < active_workers; ++i) { unsigned long local_counter = ctx->local_counter[active_workers - 1][test][i]; sum += local_counter; printf( - " <LocalCounter worker=\"%lu\">%lu</LocalCounter>\n", - i, + "%s%lu", + value_sep, local_counter ); + value_sep = ", "; } printf( - " <GlobalCounter>%lu</GlobalCounter>\n" - " <SumOfLocalCounter>%lu</SumOfLocalCounter>\n" - " </%s>\n", + "],\n" + " \"global-counter\": %lu,\n" + " \"sum-of-local-counter\": %lu", ctx->counter[test], - sum, - name + sum ); + + if (active_workers == rtems_scheduler_get_processor_maximum() || !cascade) { + printf("\n }\n ]\n }"); + } } static void test_0_body( @@ -151,7 +182,9 @@ static void test_0_fini( test_fini( ctx, - "GlobalTicketLockWithLocalCounter", + "Ticket Lock", + true, + "local counter", 0, active_workers ); @@ -188,7 +221,9 @@ static void test_1_fini( test_fini( ctx, - "GlobalMCSLockWithLocalCounter", + "MCS Lock", + true, + "local counter", 1, active_workers ); @@ -226,7 +261,9 @@ static void test_2_fini( test_fini( ctx, - "GlobalTicketLockWithGlobalCounter", + "Ticket Lock", + true, + "global counter", 2, active_workers ); @@ -264,7 +301,9 @@ static void test_3_fini( test_fini( ctx, - "GlobalMCSLockWithGlobalCounter", + "MCS Lock", + true, + "global counter", 3, active_workers ); @@ -306,7 +345,9 @@ static void test_4_fini( test_fini( ctx, - "LocalTicketLockWithLocalCounter", + "Ticket Lock", + false, + "local counter", 4, active_workers ); @@ -353,7 +394,9 @@ static void test_5_fini( test_fini( ctx, - "LocalMCSLockWithLocalCounter", + "MCS Lock", + false, + "local counter", 5, active_workers ); @@ -399,7 +442,9 @@ static void test_6_fini( test_fini( ctx, - "LocalTicketLockWithGlobalCounter", + "Ticket Lock", + false, + "global counter", 6, active_workers ); @@ -450,7 +495,9 @@ static void test_7_fini( test_fini( ctx, - "LocalMCSLockWithGlobalCounter", + "MCS Lock", + false, + "global counter", 7, active_workers ); @@ -497,7 +544,9 @@ static void test_8_fini( test_fini( ctx, - "GlobalTicketLockWithBusySection", + "Ticket Lock", + true, + "busy loop", 8, active_workers ); @@ -535,7 +584,9 @@ static void test_9_fini( test_fini( ctx, - "GlobalMCSLockWithBusySection", + "MCS Lock", + true, + "busy loop", 9, active_workers ); @@ -595,7 +646,9 @@ static void test_10_fini( test_fini( ctx, - "SequenceLock", + "Sequence Lock", + true, + "two global counter", 10, active_workers ); @@ -634,7 +687,9 @@ static void test_11_fini( test_fini( ctx, - "GlobalTASLockWithLocalCounter", + "TAS Lock", + true, + "local counter", 11, active_workers ); @@ -675,7 +730,9 @@ static void test_12_fini( test_fini( ctx, - "GlobalTTASLockWithLocalCounter", + "TTAS Lock", + true, + "local counter", 12, active_workers ); @@ -753,11 +810,11 @@ static const rtems_test_parallel_job test_jobs[TEST_COUNT] = { static void test(void) { test_context *ctx = &test_instance; - const char *test = "SMPLock01"; - printf("<%s>\n", test); + printf("*** BEGIN OF JSON DATA ***\n[\n "); + ctx->test_sep = ""; rtems_test_parallel(&ctx->base, NULL, &test_jobs[0], TEST_COUNT); - printf("</%s>\n", test); + printf("\n]\n*** END OF JSON DATA ***\n"); } static void Init(rtems_task_argument arg) diff --git a/testsuites/smptests/smplock01/smplock01.scn b/testsuites/smptests/smplock01/smplock01.scn index 3d4b90f507..1d2e3c98e1 100644 --- a/testsuites/smptests/smplock01/smplock01.scn +++ b/testsuites/smptests/smplock01/smplock01.scn @@ -1,2576 +1,239 @@ + + SIS - SPARC/RISCV instruction simulator 2.30, copyright Jiri Gaisler 2020 + Bug-reports to jiri@gaisler.se + + GR740/LEON4 emulation enabled, 4 cpus online, delta 50 clocks + + Loaded build/sparc/gr740/testsuites/smptests/smplock01.exe, entry 0x00000000 + + *** BEGIN OF TEST SMPLOCK 1 *** -<SMPLock01> - <GlobalTicketLockWithLocalCounter activeWorker="1"> - <LocalCounter worker="0">18357037</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>18357037</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="2"> - <LocalCounter worker="0">10121166</LocalCounter> - <LocalCounter worker="1">10121320</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>20242486</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="3"> - <LocalCounter worker="0">5707325</LocalCounter> - <LocalCounter worker="1">5707356</LocalCounter> - <LocalCounter worker="2">5707357</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>17122038</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="4"> - <LocalCounter worker="0">4194779</LocalCounter> - <LocalCounter worker="1">4194794</LocalCounter> - <LocalCounter worker="2">4194790</LocalCounter> - <LocalCounter worker="3">4194794</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>16779157</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="5"> - <LocalCounter worker="0">3328106</LocalCounter> - <LocalCounter worker="1">3328112</LocalCounter> - <LocalCounter worker="2">3328107</LocalCounter> - <LocalCounter worker="3">3328109</LocalCounter> - <LocalCounter worker="4">3328114</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>16640548</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="6"> - <LocalCounter worker="0">2719456</LocalCounter> - <LocalCounter worker="1">2719464</LocalCounter> - <LocalCounter worker="2">2719465</LocalCounter> - <LocalCounter worker="3">2719465</LocalCounter> - <LocalCounter worker="4">2719465</LocalCounter> - <LocalCounter worker="5">2719464</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>16316779</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="7"> - <LocalCounter worker="0">2281694</LocalCounter> - <LocalCounter worker="1">2281698</LocalCounter> - <LocalCounter worker="2">2281695</LocalCounter> - <LocalCounter worker="3">2281700</LocalCounter> - <LocalCounter worker="4">2281700</LocalCounter> - <LocalCounter worker="5">2281697</LocalCounter> - <LocalCounter worker="6">2281699</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>15971883</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="8"> - <LocalCounter worker="0">1973749</LocalCounter> - <LocalCounter worker="1">1973751</LocalCounter> - <LocalCounter worker="2">1973749</LocalCounter> - <LocalCounter worker="3">1973754</LocalCounter> - <LocalCounter worker="4">1973753</LocalCounter> - <LocalCounter worker="5">1973751</LocalCounter> - <LocalCounter worker="6">1973749</LocalCounter> - <LocalCounter worker="7">1973749</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>15790005</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="9"> - <LocalCounter worker="0">531562</LocalCounter> - <LocalCounter worker="1">531561</LocalCounter> - <LocalCounter worker="2">531558</LocalCounter> - <LocalCounter worker="3">531556</LocalCounter> - <LocalCounter worker="4">531562</LocalCounter> - <LocalCounter worker="5">531566</LocalCounter> - <LocalCounter worker="6">531561</LocalCounter> - <LocalCounter worker="7">531560</LocalCounter> - <LocalCounter worker="8">531589</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4784075</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="10"> - <LocalCounter worker="0">467120</LocalCounter> - <LocalCounter worker="1">467127</LocalCounter> - <LocalCounter worker="2">467117</LocalCounter> - <LocalCounter worker="3">467120</LocalCounter> - <LocalCounter worker="4">467123</LocalCounter> - <LocalCounter worker="5">467116</LocalCounter> - <LocalCounter worker="6">467122</LocalCounter> - <LocalCounter worker="7">467116</LocalCounter> - <LocalCounter worker="8">467180</LocalCounter> - <LocalCounter worker="9">467179</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4671320</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="11"> - <LocalCounter worker="0">426740</LocalCounter> - <LocalCounter worker="1">426739</LocalCounter> - <LocalCounter worker="2">426742</LocalCounter> - <LocalCounter worker="3">426737</LocalCounter> - <LocalCounter worker="4">426740</LocalCounter> - <LocalCounter worker="5">426741</LocalCounter> - <LocalCounter worker="6">426747</LocalCounter> - <LocalCounter worker="7">426735</LocalCounter> - <LocalCounter worker="8">426768</LocalCounter> - <LocalCounter worker="9">426765</LocalCounter> - <LocalCounter worker="10">426767</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4694221</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="12"> - <LocalCounter worker="0">388705</LocalCounter> - <LocalCounter worker="1">388703</LocalCounter> - <LocalCounter worker="2">388710</LocalCounter> - <LocalCounter worker="3">388706</LocalCounter> - <LocalCounter worker="4">388701</LocalCounter> - <LocalCounter worker="5">388702</LocalCounter> - <LocalCounter worker="6">388702</LocalCounter> - <LocalCounter worker="7">388705</LocalCounter> - <LocalCounter worker="8">388740</LocalCounter> - <LocalCounter worker="9">388739</LocalCounter> - <LocalCounter worker="10">388740</LocalCounter> - <LocalCounter worker="11">388739</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4664592</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="13"> - <LocalCounter worker="0">356920</LocalCounter> - <LocalCounter worker="1">356917</LocalCounter> - <LocalCounter worker="2">356916</LocalCounter> - <LocalCounter worker="3">356917</LocalCounter> - <LocalCounter worker="4">356920</LocalCounter> - <LocalCounter worker="5">356919</LocalCounter> - <LocalCounter worker="6">356920</LocalCounter> - <LocalCounter worker="7">356917</LocalCounter> - <LocalCounter worker="8">356948</LocalCounter> - <LocalCounter worker="9">356947</LocalCounter> - <LocalCounter worker="10">356948</LocalCounter> - <LocalCounter worker="11">356947</LocalCounter> - <LocalCounter worker="12">356953</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4640089</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="14"> - <LocalCounter worker="0">330192</LocalCounter> - <LocalCounter worker="1">330192</LocalCounter> - <LocalCounter worker="2">330186</LocalCounter> - <LocalCounter worker="3">330185</LocalCounter> - <LocalCounter worker="4">330190</LocalCounter> - <LocalCounter worker="5">330183</LocalCounter> - <LocalCounter worker="6">330187</LocalCounter> - <LocalCounter worker="7">330187</LocalCounter> - <LocalCounter worker="8">330226</LocalCounter> - <LocalCounter worker="9">330225</LocalCounter> - <LocalCounter worker="10">330225</LocalCounter> - <LocalCounter worker="11">330228</LocalCounter> - <LocalCounter worker="12">330225</LocalCounter> - <LocalCounter worker="13">330226</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4622857</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="15"> - <LocalCounter worker="0">303180</LocalCounter> - <LocalCounter worker="1">303186</LocalCounter> - <LocalCounter worker="2">303190</LocalCounter> - <LocalCounter worker="3">303180</LocalCounter> - <LocalCounter worker="4">303188</LocalCounter> - <LocalCounter worker="5">303181</LocalCounter> - <LocalCounter worker="6">303183</LocalCounter> - <LocalCounter worker="7">303191</LocalCounter> - <LocalCounter worker="8">303199</LocalCounter> - <LocalCounter worker="9">303204</LocalCounter> - <LocalCounter worker="10">303209</LocalCounter> - <LocalCounter worker="11">303207</LocalCounter> - <LocalCounter worker="12">303212</LocalCounter> - <LocalCounter worker="13">303215</LocalCounter> - <LocalCounter worker="14">303217</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4547942</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="16"> - <LocalCounter worker="0">274980</LocalCounter> - <LocalCounter worker="1">274975</LocalCounter> - <LocalCounter worker="2">274979</LocalCounter> - <LocalCounter worker="3">274983</LocalCounter> - <LocalCounter worker="4">274979</LocalCounter> - <LocalCounter worker="5">274977</LocalCounter> - <LocalCounter worker="6">274974</LocalCounter> - <LocalCounter worker="7">274980</LocalCounter> - <LocalCounter worker="8">274977</LocalCounter> - <LocalCounter worker="9">274984</LocalCounter> - <LocalCounter worker="10">274983</LocalCounter> - <LocalCounter worker="11">274981</LocalCounter> - <LocalCounter worker="12">274982</LocalCounter> - <LocalCounter worker="13">274978</LocalCounter> - <LocalCounter worker="14">274980</LocalCounter> - <LocalCounter worker="15">274977</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4399669</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="17"> - <LocalCounter worker="0">261695</LocalCounter> - <LocalCounter worker="1">261697</LocalCounter> - <LocalCounter worker="2">261696</LocalCounter> - <LocalCounter worker="3">261696</LocalCounter> - <LocalCounter worker="4">261694</LocalCounter> - <LocalCounter worker="5">261695</LocalCounter> - <LocalCounter worker="6">261697</LocalCounter> - <LocalCounter worker="7">261692</LocalCounter> - <LocalCounter worker="8">261696</LocalCounter> - <LocalCounter worker="9">261692</LocalCounter> - <LocalCounter worker="10">261696</LocalCounter> - <LocalCounter worker="11">261697</LocalCounter> - <LocalCounter worker="12">261697</LocalCounter> - <LocalCounter worker="13">261695</LocalCounter> - <LocalCounter worker="14">261692</LocalCounter> - <LocalCounter worker="15">261691</LocalCounter> - <LocalCounter worker="16">261708</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4448826</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="18"> - <LocalCounter worker="0">240007</LocalCounter> - <LocalCounter worker="1">240008</LocalCounter> - <LocalCounter worker="2">240007</LocalCounter> - <LocalCounter worker="3">240008</LocalCounter> - <LocalCounter worker="4">240010</LocalCounter> - <LocalCounter worker="5">240007</LocalCounter> - <LocalCounter worker="6">240006</LocalCounter> - <LocalCounter worker="7">240008</LocalCounter> - <LocalCounter worker="8">240008</LocalCounter> - <LocalCounter worker="9">240007</LocalCounter> - <LocalCounter worker="10">240010</LocalCounter> - <LocalCounter worker="11">240007</LocalCounter> - <LocalCounter worker="12">240010</LocalCounter> - <LocalCounter worker="13">240007</LocalCounter> - <LocalCounter worker="14">240007</LocalCounter> - <LocalCounter worker="15">240010</LocalCounter> - <LocalCounter worker="16">240020</LocalCounter> - <LocalCounter worker="17">240017</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4320164</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="19"> - <LocalCounter worker="0">225896</LocalCounter> - <LocalCounter worker="1">225897</LocalCounter> - <LocalCounter worker="2">225897</LocalCounter> - <LocalCounter worker="3">225898</LocalCounter> - <LocalCounter worker="4">225899</LocalCounter> - <LocalCounter worker="5">225898</LocalCounter> - <LocalCounter worker="6">225898</LocalCounter> - <LocalCounter worker="7">225896</LocalCounter> - <LocalCounter worker="8">225896</LocalCounter> - <LocalCounter worker="9">225896</LocalCounter> - <LocalCounter worker="10">225897</LocalCounter> - <LocalCounter worker="11">225898</LocalCounter> - <LocalCounter worker="12">225900</LocalCounter> - <LocalCounter worker="13">225899</LocalCounter> - <LocalCounter worker="14">225895</LocalCounter> - <LocalCounter worker="15">225894</LocalCounter> - <LocalCounter worker="16">225906</LocalCounter> - <LocalCounter worker="17">225905</LocalCounter> - <LocalCounter worker="18">225907</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4292072</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="20"> - <LocalCounter worker="0">214338</LocalCounter> - <LocalCounter worker="1">214338</LocalCounter> - <LocalCounter worker="2">214338</LocalCounter> - <LocalCounter worker="3">214336</LocalCounter> - <LocalCounter worker="4">214338</LocalCounter> - <LocalCounter worker="5">214337</LocalCounter> - <LocalCounter worker="6">214335</LocalCounter> - <LocalCounter worker="7">214337</LocalCounter> - <LocalCounter worker="8">214338</LocalCounter> - <LocalCounter worker="9">214337</LocalCounter> - <LocalCounter worker="10">214337</LocalCounter> - <LocalCounter worker="11">214338</LocalCounter> - <LocalCounter worker="12">214337</LocalCounter> - <LocalCounter worker="13">214337</LocalCounter> - <LocalCounter worker="14">214339</LocalCounter> - <LocalCounter worker="15">214338</LocalCounter> - <LocalCounter worker="16">214343</LocalCounter> - <LocalCounter worker="17">214343</LocalCounter> - <LocalCounter worker="18">214345</LocalCounter> - <LocalCounter worker="19">214345</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4286774</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="21"> - <LocalCounter worker="0">198227</LocalCounter> - <LocalCounter worker="1">198229</LocalCounter> - <LocalCounter worker="2">198227</LocalCounter> - <LocalCounter worker="3">198228</LocalCounter> - <LocalCounter worker="4">198228</LocalCounter> - <LocalCounter worker="5">198229</LocalCounter> - <LocalCounter worker="6">198229</LocalCounter> - <LocalCounter worker="7">198228</LocalCounter> - <LocalCounter worker="8">198227</LocalCounter> - <LocalCounter worker="9">198230</LocalCounter> - <LocalCounter worker="10">198227</LocalCounter> - <LocalCounter worker="11">198228</LocalCounter> - <LocalCounter worker="12">198229</LocalCounter> - <LocalCounter worker="13">198230</LocalCounter> - <LocalCounter worker="14">198228</LocalCounter> - <LocalCounter worker="15">198230</LocalCounter> - <LocalCounter worker="16">198231</LocalCounter> - <LocalCounter worker="17">198232</LocalCounter> - <LocalCounter worker="18">198233</LocalCounter> - <LocalCounter worker="19">198233</LocalCounter> - <LocalCounter worker="20">198232</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4162815</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="22"> - <LocalCounter worker="0">192321</LocalCounter> - <LocalCounter worker="1">192322</LocalCounter> - <LocalCounter worker="2">192322</LocalCounter> - <LocalCounter worker="3">192323</LocalCounter> - <LocalCounter worker="4">192325</LocalCounter> - <LocalCounter worker="5">192324</LocalCounter> - <LocalCounter worker="6">192323</LocalCounter> - <LocalCounter worker="7">192324</LocalCounter> - <LocalCounter worker="8">192325</LocalCounter> - <LocalCounter worker="9">192325</LocalCounter> - <LocalCounter worker="10">192323</LocalCounter> - <LocalCounter worker="11">192323</LocalCounter> - <LocalCounter worker="12">192323</LocalCounter> - <LocalCounter worker="13">192323</LocalCounter> - <LocalCounter worker="14">192324</LocalCounter> - <LocalCounter worker="15">192324</LocalCounter> - <LocalCounter worker="16">192329</LocalCounter> - <LocalCounter worker="17">192326</LocalCounter> - <LocalCounter worker="18">192325</LocalCounter> - <LocalCounter worker="19">192329</LocalCounter> - <LocalCounter worker="20">192326</LocalCounter> - <LocalCounter worker="21">192327</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4231136</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="23"> - <LocalCounter worker="0">177893</LocalCounter> - <LocalCounter worker="1">177892</LocalCounter> - <LocalCounter worker="2">177895</LocalCounter> - <LocalCounter worker="3">177894</LocalCounter> - <LocalCounter worker="4">177892</LocalCounter> - <LocalCounter worker="5">177891</LocalCounter> - <LocalCounter worker="6">177893</LocalCounter> - <LocalCounter worker="7">177893</LocalCounter> - <LocalCounter worker="8">177893</LocalCounter> - <LocalCounter worker="9">177893</LocalCounter> - <LocalCounter worker="10">177894</LocalCounter> - <LocalCounter worker="11">177894</LocalCounter> - <LocalCounter worker="12">177893</LocalCounter> - <LocalCounter worker="13">177893</LocalCounter> - <LocalCounter worker="14">177894</LocalCounter> - <LocalCounter worker="15">177894</LocalCounter> - <LocalCounter worker="16">177895</LocalCounter> - <LocalCounter worker="17">177895</LocalCounter> - <LocalCounter worker="18">177896</LocalCounter> - <LocalCounter worker="19">177897</LocalCounter> - <LocalCounter worker="20">177894</LocalCounter> - <LocalCounter worker="21">177896</LocalCounter> - <LocalCounter worker="22">177894</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4091558</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalTicketLockWithLocalCounter activeWorker="24"> - <LocalCounter worker="0">168726</LocalCounter> - <LocalCounter worker="1">168726</LocalCounter> - <LocalCounter worker="2">168726</LocalCounter> - <LocalCounter worker="3">168726</LocalCounter> - <LocalCounter worker="4">168726</LocalCounter> - <LocalCounter worker="5">168725</LocalCounter> - <LocalCounter worker="6">168726</LocalCounter> - <LocalCounter worker="7">168726</LocalCounter> - <LocalCounter worker="8">168726</LocalCounter> - <LocalCounter worker="9">168726</LocalCounter> - <LocalCounter worker="10">168728</LocalCounter> - <LocalCounter worker="11">168727</LocalCounter> - <LocalCounter worker="12">168727</LocalCounter> - <LocalCounter worker="13">168726</LocalCounter> - <LocalCounter worker="14">168726</LocalCounter> - <LocalCounter worker="15">168728</LocalCounter> - <LocalCounter worker="16">168727</LocalCounter> - <LocalCounter worker="17">168729</LocalCounter> - <LocalCounter worker="18">168726</LocalCounter> - <LocalCounter worker="19">168725</LocalCounter> - <LocalCounter worker="20">168728</LocalCounter> - <LocalCounter worker="21">168727</LocalCounter> - <LocalCounter worker="22">168726</LocalCounter> - <LocalCounter worker="23">168726</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4049435</SumOfLocalCounter> - </GlobalTicketLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="1"> - <LocalCounter worker="0">13090449</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>13090449</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="2"> - <LocalCounter worker="0">6384726</LocalCounter> - <LocalCounter worker="1">6384887</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>12769613</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="3"> - <LocalCounter worker="0">2955420</LocalCounter> - <LocalCounter worker="1">2955434</LocalCounter> - <LocalCounter worker="2">2955434</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>8866288</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="4"> - <LocalCounter worker="0">2866696</LocalCounter> - <LocalCounter worker="1">2866710</LocalCounter> - <LocalCounter worker="2">2866711</LocalCounter> - <LocalCounter worker="3">2866708</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>11466825</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="5"> - <LocalCounter worker="0">2996690</LocalCounter> - <LocalCounter worker="1">2996699</LocalCounter> - <LocalCounter worker="2">2996701</LocalCounter> - <LocalCounter worker="3">2996698</LocalCounter> - <LocalCounter worker="4">2996701</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>14983489</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="6"> - <LocalCounter worker="0">2540852</LocalCounter> - <LocalCounter worker="1">2540864</LocalCounter> - <LocalCounter worker="2">2540864</LocalCounter> - <LocalCounter worker="3">2540862</LocalCounter> - <LocalCounter worker="4">2540861</LocalCounter> - <LocalCounter worker="5">2540863</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>15245166</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="7"> - <LocalCounter worker="0">2182035</LocalCounter> - <LocalCounter worker="1">2182054</LocalCounter> - <LocalCounter worker="2">2182053</LocalCounter> - <LocalCounter worker="3">2182053</LocalCounter> - <LocalCounter worker="4">2182053</LocalCounter> - <LocalCounter worker="5">2182055</LocalCounter> - <LocalCounter worker="6">2182055</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>15274358</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="8"> - <LocalCounter worker="0">1920366</LocalCounter> - <LocalCounter worker="1">1920373</LocalCounter> - <LocalCounter worker="2">1920374</LocalCounter> - <LocalCounter worker="3">1920373</LocalCounter> - <LocalCounter worker="4">1920371</LocalCounter> - <LocalCounter worker="5">1920374</LocalCounter> - <LocalCounter worker="6">1920373</LocalCounter> - <LocalCounter worker="7">1920372</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>15362976</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="9"> - <LocalCounter worker="0">1216597</LocalCounter> - <LocalCounter worker="1">1216602</LocalCounter> - <LocalCounter worker="2">1216602</LocalCounter> - <LocalCounter worker="3">1216602</LocalCounter> - <LocalCounter worker="4">1216601</LocalCounter> - <LocalCounter worker="5">1216602</LocalCounter> - <LocalCounter worker="6">1216603</LocalCounter> - <LocalCounter worker="7">1216601</LocalCounter> - <LocalCounter worker="8">1216600</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>10949410</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="10"> - <LocalCounter worker="0">1007168</LocalCounter> - <LocalCounter worker="1">1007170</LocalCounter> - <LocalCounter worker="2">1007171</LocalCounter> - <LocalCounter worker="3">1007170</LocalCounter> - <LocalCounter worker="4">1007170</LocalCounter> - <LocalCounter worker="5">1007170</LocalCounter> - <LocalCounter worker="6">1007171</LocalCounter> - <LocalCounter worker="7">1007170</LocalCounter> - <LocalCounter worker="8">1007170</LocalCounter> - <LocalCounter worker="9">1007171</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>10071701</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="11"> - <LocalCounter worker="0">772281</LocalCounter> - <LocalCounter worker="1">772283</LocalCounter> - <LocalCounter worker="2">772283</LocalCounter> - <LocalCounter worker="3">772284</LocalCounter> - <LocalCounter worker="4">772281</LocalCounter> - <LocalCounter worker="5">772283</LocalCounter> - <LocalCounter worker="6">772283</LocalCounter> - <LocalCounter worker="7">772282</LocalCounter> - <LocalCounter worker="8">772281</LocalCounter> - <LocalCounter worker="9">772282</LocalCounter> - <LocalCounter worker="10">772282</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>8495105</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="12"> - <LocalCounter worker="0">672837</LocalCounter> - <LocalCounter worker="1">672841</LocalCounter> - <LocalCounter worker="2">672841</LocalCounter> - <LocalCounter worker="3">672841</LocalCounter> - <LocalCounter worker="4">672841</LocalCounter> - <LocalCounter worker="5">672842</LocalCounter> - <LocalCounter worker="6">672841</LocalCounter> - <LocalCounter worker="7">672841</LocalCounter> - <LocalCounter worker="8">672842</LocalCounter> - <LocalCounter worker="9">672841</LocalCounter> - <LocalCounter worker="10">672841</LocalCounter> - <LocalCounter worker="11">672841</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>8074090</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="13"> - <LocalCounter worker="0">595160</LocalCounter> - <LocalCounter worker="1">595163</LocalCounter> - <LocalCounter worker="2">595162</LocalCounter> - <LocalCounter worker="3">595163</LocalCounter> - <LocalCounter worker="4">595161</LocalCounter> - <LocalCounter worker="5">595162</LocalCounter> - <LocalCounter worker="6">595162</LocalCounter> - <LocalCounter worker="7">595163</LocalCounter> - <LocalCounter worker="8">595162</LocalCounter> - <LocalCounter worker="9">595162</LocalCounter> - <LocalCounter worker="10">595162</LocalCounter> - <LocalCounter worker="11">595162</LocalCounter> - <LocalCounter worker="12">595162</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>7737106</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="14"> - <LocalCounter worker="0">581536</LocalCounter> - <LocalCounter worker="1">581540</LocalCounter> - <LocalCounter worker="2">581539</LocalCounter> - <LocalCounter worker="3">581539</LocalCounter> - <LocalCounter worker="4">581539</LocalCounter> - <LocalCounter worker="5">581539</LocalCounter> - <LocalCounter worker="6">581539</LocalCounter> - <LocalCounter worker="7">581538</LocalCounter> - <LocalCounter worker="8">581540</LocalCounter> - <LocalCounter worker="9">581539</LocalCounter> - <LocalCounter worker="10">581538</LocalCounter> - <LocalCounter worker="11">581539</LocalCounter> - <LocalCounter worker="12">581539</LocalCounter> - <LocalCounter worker="13">581540</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>8141544</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="15"> - <LocalCounter worker="0">578439</LocalCounter> - <LocalCounter worker="1">578441</LocalCounter> - <LocalCounter worker="2">578442</LocalCounter> - <LocalCounter worker="3">578441</LocalCounter> - <LocalCounter worker="4">578442</LocalCounter> - <LocalCounter worker="5">578441</LocalCounter> - <LocalCounter worker="6">578442</LocalCounter> - <LocalCounter worker="7">578444</LocalCounter> - <LocalCounter worker="8">578441</LocalCounter> - <LocalCounter worker="9">578442</LocalCounter> - <LocalCounter worker="10">578441</LocalCounter> - <LocalCounter worker="11">578440</LocalCounter> - <LocalCounter worker="12">578441</LocalCounter> - <LocalCounter worker="13">578441</LocalCounter> - <LocalCounter worker="14">578442</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>8676620</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="16"> - <LocalCounter worker="0">527784</LocalCounter> - <LocalCounter worker="1">527783</LocalCounter> - <LocalCounter worker="2">527785</LocalCounter> - <LocalCounter worker="3">527784</LocalCounter> - <LocalCounter worker="4">527784</LocalCounter> - <LocalCounter worker="5">527783</LocalCounter> - <LocalCounter worker="6">527782</LocalCounter> - <LocalCounter worker="7">527784</LocalCounter> - <LocalCounter worker="8">527782</LocalCounter> - <LocalCounter worker="9">527782</LocalCounter> - <LocalCounter worker="10">527784</LocalCounter> - <LocalCounter worker="11">527783</LocalCounter> - <LocalCounter worker="12">527783</LocalCounter> - <LocalCounter worker="13">527783</LocalCounter> - <LocalCounter worker="14">527783</LocalCounter> - <LocalCounter worker="15">527783</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>8444532</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="17"> - <LocalCounter worker="0">468012</LocalCounter> - <LocalCounter worker="1">468009</LocalCounter> - <LocalCounter worker="2">468009</LocalCounter> - <LocalCounter worker="3">468010</LocalCounter> - <LocalCounter worker="4">468011</LocalCounter> - <LocalCounter worker="5">468010</LocalCounter> - <LocalCounter worker="6">468011</LocalCounter> - <LocalCounter worker="7">468009</LocalCounter> - <LocalCounter worker="8">468009</LocalCounter> - <LocalCounter worker="9">468010</LocalCounter> - <LocalCounter worker="10">468011</LocalCounter> - <LocalCounter worker="11">468012</LocalCounter> - <LocalCounter worker="12">468009</LocalCounter> - <LocalCounter worker="13">468011</LocalCounter> - <LocalCounter worker="14">468011</LocalCounter> - <LocalCounter worker="15">468011</LocalCounter> - <LocalCounter worker="16">468012</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>7956177</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="18"> - <LocalCounter worker="0">439238</LocalCounter> - <LocalCounter worker="1">439222</LocalCounter> - <LocalCounter worker="2">439228</LocalCounter> - <LocalCounter worker="3">439225</LocalCounter> - <LocalCounter worker="4">439226</LocalCounter> - <LocalCounter worker="5">439228</LocalCounter> - <LocalCounter worker="6">439226</LocalCounter> - <LocalCounter worker="7">439219</LocalCounter> - <LocalCounter worker="8">439231</LocalCounter> - <LocalCounter worker="9">439213</LocalCounter> - <LocalCounter worker="10">439226</LocalCounter> - <LocalCounter worker="11">439215</LocalCounter> - <LocalCounter worker="12">439215</LocalCounter> - <LocalCounter worker="13">439222</LocalCounter> - <LocalCounter worker="14">439224</LocalCounter> - <LocalCounter worker="15">439217</LocalCounter> - <LocalCounter worker="16">439226</LocalCounter> - <LocalCounter worker="17">439230</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>7906031</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="19"> - <LocalCounter worker="0">392577</LocalCounter> - <LocalCounter worker="1">392658</LocalCounter> - <LocalCounter worker="2">392677</LocalCounter> - <LocalCounter worker="3">392625</LocalCounter> - <LocalCounter worker="4">392645</LocalCounter> - <LocalCounter worker="5">392611</LocalCounter> - <LocalCounter worker="6">392643</LocalCounter> - <LocalCounter worker="7">392617</LocalCounter> - <LocalCounter worker="8">392519</LocalCounter> - <LocalCounter worker="9">392507</LocalCounter> - <LocalCounter worker="10">392525</LocalCounter> - <LocalCounter worker="11">392515</LocalCounter> - <LocalCounter worker="12">392513</LocalCounter> - <LocalCounter worker="13">392488</LocalCounter> - <LocalCounter worker="14">392567</LocalCounter> - <LocalCounter worker="15">392567</LocalCounter> - <LocalCounter worker="16">392175</LocalCounter> - <LocalCounter worker="17">392148</LocalCounter> - <LocalCounter worker="18">392153</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>7457730</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="20"> - <LocalCounter worker="0">393189</LocalCounter> - <LocalCounter worker="1">393145</LocalCounter> - <LocalCounter worker="2">393365</LocalCounter> - <LocalCounter worker="3">393284</LocalCounter> - <LocalCounter worker="4">393215</LocalCounter> - <LocalCounter worker="5">393191</LocalCounter> - <LocalCounter worker="6">393247</LocalCounter> - <LocalCounter worker="7">393229</LocalCounter> - <LocalCounter worker="8">392255</LocalCounter> - <LocalCounter worker="9">392239</LocalCounter> - <LocalCounter worker="10">392268</LocalCounter> - <LocalCounter worker="11">392259</LocalCounter> - <LocalCounter worker="12">392312</LocalCounter> - <LocalCounter worker="13">392395</LocalCounter> - <LocalCounter worker="14">392318</LocalCounter> - <LocalCounter worker="15">392431</LocalCounter> - <LocalCounter worker="16">389204</LocalCounter> - <LocalCounter worker="17">389161</LocalCounter> - <LocalCounter worker="18">389146</LocalCounter> - <LocalCounter worker="19">389191</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>7841044</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="21"> - <LocalCounter worker="0">333867</LocalCounter> - <LocalCounter worker="1">333818</LocalCounter> - <LocalCounter worker="2">333796</LocalCounter> - <LocalCounter worker="3">333998</LocalCounter> - <LocalCounter worker="4">333786</LocalCounter> - <LocalCounter worker="5">333970</LocalCounter> - <LocalCounter worker="6">333966</LocalCounter> - <LocalCounter worker="7">333946</LocalCounter> - <LocalCounter worker="8">331691</LocalCounter> - <LocalCounter worker="9">331644</LocalCounter> - <LocalCounter worker="10">331574</LocalCounter> - <LocalCounter worker="11">331570</LocalCounter> - <LocalCounter worker="12">331815</LocalCounter> - <LocalCounter worker="13">331757</LocalCounter> - <LocalCounter worker="14">331873</LocalCounter> - <LocalCounter worker="15">331902</LocalCounter> - <LocalCounter worker="16">321858</LocalCounter> - <LocalCounter worker="17">321819</LocalCounter> - <LocalCounter worker="18">321778</LocalCounter> - <LocalCounter worker="19">321915</LocalCounter> - <LocalCounter worker="20">322036</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>6934379</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="22"> - <LocalCounter worker="0">336076</LocalCounter> - <LocalCounter worker="1">336030</LocalCounter> - <LocalCounter worker="2">335863</LocalCounter> - <LocalCounter worker="3">335861</LocalCounter> - <LocalCounter worker="4">335954</LocalCounter> - <LocalCounter worker="5">336069</LocalCounter> - <LocalCounter worker="6">335963</LocalCounter> - <LocalCounter worker="7">335891</LocalCounter> - <LocalCounter worker="8">336178</LocalCounter> - <LocalCounter worker="9">335697</LocalCounter> - <LocalCounter worker="10">335574</LocalCounter> - <LocalCounter worker="11">335581</LocalCounter> - <LocalCounter worker="12">335586</LocalCounter> - <LocalCounter worker="13">336068</LocalCounter> - <LocalCounter worker="14">336138</LocalCounter> - <LocalCounter worker="15">336049</LocalCounter> - <LocalCounter worker="16">330987</LocalCounter> - <LocalCounter worker="17">330865</LocalCounter> - <LocalCounter worker="18">331086</LocalCounter> - <LocalCounter worker="19">330937</LocalCounter> - <LocalCounter worker="20">331150</LocalCounter> - <LocalCounter worker="21">330937</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>7360540</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="23"> - <LocalCounter worker="0">317093</LocalCounter> - <LocalCounter worker="1">317207</LocalCounter> - <LocalCounter worker="2">317153</LocalCounter> - <LocalCounter worker="3">317177</LocalCounter> - <LocalCounter worker="4">317207</LocalCounter> - <LocalCounter worker="5">317164</LocalCounter> - <LocalCounter worker="6">317198</LocalCounter> - <LocalCounter worker="7">317132</LocalCounter> - <LocalCounter worker="8">317445</LocalCounter> - <LocalCounter worker="9">317166</LocalCounter> - <LocalCounter worker="10">317044</LocalCounter> - <LocalCounter worker="11">317000</LocalCounter> - <LocalCounter worker="12">317012</LocalCounter> - <LocalCounter worker="13">317587</LocalCounter> - <LocalCounter worker="14">317522</LocalCounter> - <LocalCounter worker="15">317568</LocalCounter> - <LocalCounter worker="16">315579</LocalCounter> - <LocalCounter worker="17">315563</LocalCounter> - <LocalCounter worker="18">315657</LocalCounter> - <LocalCounter worker="19">315582</LocalCounter> - <LocalCounter worker="20">315453</LocalCounter> - <LocalCounter worker="21">315445</LocalCounter> - <LocalCounter worker="22">315774</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>7284728</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalMCSLockWithLocalCounter activeWorker="24"> - <LocalCounter worker="0">312519</LocalCounter> - <LocalCounter worker="1">312750</LocalCounter> - <LocalCounter worker="2">312612</LocalCounter> - <LocalCounter worker="3">312671</LocalCounter> - <LocalCounter worker="4">312685</LocalCounter> - <LocalCounter worker="5">312707</LocalCounter> - <LocalCounter worker="6">312543</LocalCounter> - <LocalCounter worker="7">312680</LocalCounter> - <LocalCounter worker="8">313250</LocalCounter> - <LocalCounter worker="9">312566</LocalCounter> - <LocalCounter worker="10">312775</LocalCounter> - <LocalCounter worker="11">312827</LocalCounter> - <LocalCounter worker="12">312652</LocalCounter> - <LocalCounter worker="13">313141</LocalCounter> - <LocalCounter worker="14">313261</LocalCounter> - <LocalCounter worker="15">313270</LocalCounter> - <LocalCounter worker="16">312883</LocalCounter> - <LocalCounter worker="17">312649</LocalCounter> - <LocalCounter worker="18">312529</LocalCounter> - <LocalCounter worker="19">312615</LocalCounter> - <LocalCounter worker="20">312755</LocalCounter> - <LocalCounter worker="21">312833</LocalCounter> - <LocalCounter worker="22">312673</LocalCounter> - <LocalCounter worker="23">312728</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>7506574</SumOfLocalCounter> - </GlobalMCSLockWithLocalCounter> - <GlobalTicketLockWithGlobalCounter activeWorker="24"> - <LocalCounter worker="0">149325</LocalCounter> - <LocalCounter worker="1">149327</LocalCounter> - <LocalCounter worker="2">149325</LocalCounter> - <LocalCounter worker="3">149325</LocalCounter> - <LocalCounter worker="4">149325</LocalCounter> - <LocalCounter worker="5">149327</LocalCounter> - <LocalCounter worker="6">149325</LocalCounter> - <LocalCounter worker="7">149324</LocalCounter> - <LocalCounter worker="8">149326</LocalCounter> - <LocalCounter worker="9">149325</LocalCounter> - <LocalCounter worker="10">149326</LocalCounter> - <LocalCounter worker="11">149326</LocalCounter> - <LocalCounter worker="12">149326</LocalCounter> - <LocalCounter worker="13">149325</LocalCounter> - <LocalCounter worker="14">149325</LocalCounter> - <LocalCounter worker="15">149325</LocalCounter> - <LocalCounter worker="16">149325</LocalCounter> - <LocalCounter worker="17">149325</LocalCounter> - <LocalCounter worker="18">149325</LocalCounter> - <LocalCounter worker="19">149326</LocalCounter> - <LocalCounter worker="20">149325</LocalCounter> - <LocalCounter worker="21">149326</LocalCounter> - <LocalCounter worker="22">149325</LocalCounter> - <LocalCounter worker="23">149325</LocalCounter> - <GlobalCounter>3583809</GlobalCounter> - <SumOfLocalCounter>3583809</SumOfLocalCounter> - </GlobalTicketLockWithGlobalCounter> - <GlobalMCSLockWithGlobalCounter activeWorker="24"> - <LocalCounter worker="0">219612</LocalCounter> - <LocalCounter worker="1">219612</LocalCounter> - <LocalCounter worker="2">219612</LocalCounter> - <LocalCounter worker="3">219612</LocalCounter> - <LocalCounter worker="4">219612</LocalCounter> - <LocalCounter worker="5">219612</LocalCounter> - <LocalCounter worker="6">219613</LocalCounter> - <LocalCounter worker="7">219612</LocalCounter> - <LocalCounter worker="8">219612</LocalCounter> - <LocalCounter worker="9">219614</LocalCounter> - <LocalCounter worker="10">219612</LocalCounter> - <LocalCounter worker="11">219611</LocalCounter> - <LocalCounter worker="12">219613</LocalCounter> - <LocalCounter worker="13">219614</LocalCounter> - <LocalCounter worker="14">219612</LocalCounter> - <LocalCounter worker="15">219612</LocalCounter> - <LocalCounter worker="16">219613</LocalCounter> - <LocalCounter worker="17">219613</LocalCounter> - <LocalCounter worker="18">219611</LocalCounter> - <LocalCounter worker="19">219612</LocalCounter> - <LocalCounter worker="20">219611</LocalCounter> - <LocalCounter worker="21">219612</LocalCounter> - <LocalCounter worker="22">219612</LocalCounter> - <LocalCounter worker="23">219613</LocalCounter> - <GlobalCounter>5270694</GlobalCounter> - <SumOfLocalCounter>5270694</SumOfLocalCounter> - </GlobalMCSLockWithGlobalCounter> - <LocalTicketLockWithLocalCounter activeWorker="1"> - <LocalCounter worker="0">17976591</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>17976591</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="2"> - <LocalCounter worker="0">17093434</LocalCounter> - <LocalCounter worker="1">17094750</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>34188184</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="3"> - <LocalCounter worker="0">16126005</LocalCounter> - <LocalCounter worker="1">16127191</LocalCounter> - <LocalCounter worker="2">16875254</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>49128450</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="4"> - <LocalCounter worker="0">15412620</LocalCounter> - <LocalCounter worker="1">15413887</LocalCounter> - <LocalCounter worker="2">15366643</LocalCounter> - <LocalCounter worker="3">15366578</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>61559728</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="5"> - <LocalCounter worker="0">16308721</LocalCounter> - <LocalCounter worker="1">16310021</LocalCounter> - <LocalCounter worker="2">16318960</LocalCounter> - <LocalCounter worker="3">16318983</LocalCounter> - <LocalCounter worker="4">16426938</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>81683623</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="6"> - <LocalCounter worker="0">15193884</LocalCounter> - <LocalCounter worker="1">15195117</LocalCounter> - <LocalCounter worker="2">15113407</LocalCounter> - <LocalCounter worker="3">15121476</LocalCounter> - <LocalCounter worker="4">15104027</LocalCounter> - <LocalCounter worker="5">15104373</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>90832284</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="7"> - <LocalCounter worker="0">15794728</LocalCounter> - <LocalCounter worker="1">15792858</LocalCounter> - <LocalCounter worker="2">15790710</LocalCounter> - <LocalCounter worker="3">15798703</LocalCounter> - <LocalCounter worker="4">15746011</LocalCounter> - <LocalCounter worker="5">15746393</LocalCounter> - <LocalCounter worker="6">15839713</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>110509116</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="8"> - <LocalCounter worker="0">14538979</LocalCounter> - <LocalCounter worker="1">14540011</LocalCounter> - <LocalCounter worker="2">14540067</LocalCounter> - <LocalCounter worker="3">14543590</LocalCounter> - <LocalCounter worker="4">14523331</LocalCounter> - <LocalCounter worker="5">14523800</LocalCounter> - <LocalCounter worker="6">14541196</LocalCounter> - <LocalCounter worker="7">14543759</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>116294733</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="9"> - <LocalCounter worker="0">14597172</LocalCounter> - <LocalCounter worker="1">14598178</LocalCounter> - <LocalCounter worker="2">14594621</LocalCounter> - <LocalCounter worker="3">14598190</LocalCounter> - <LocalCounter worker="4">14558148</LocalCounter> - <LocalCounter worker="5">14558565</LocalCounter> - <LocalCounter worker="6">14603981</LocalCounter> - <LocalCounter worker="7">14614317</LocalCounter> - <LocalCounter worker="8">18013252</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>134736424</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="10"> - <LocalCounter worker="0">14529346</LocalCounter> - <LocalCounter worker="1">14530425</LocalCounter> - <LocalCounter worker="2">14525274</LocalCounter> - <LocalCounter worker="3">14530395</LocalCounter> - <LocalCounter worker="4">14501600</LocalCounter> - <LocalCounter worker="5">14501959</LocalCounter> - <LocalCounter worker="6">14539379</LocalCounter> - <LocalCounter worker="7">14546701</LocalCounter> - <LocalCounter worker="8">16764576</LocalCounter> - <LocalCounter worker="9">16764953</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>149734608</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="11"> - <LocalCounter worker="0">14552313</LocalCounter> - <LocalCounter worker="1">14545774</LocalCounter> - <LocalCounter worker="2">14543859</LocalCounter> - <LocalCounter worker="3">14545590</LocalCounter> - <LocalCounter worker="4">14521699</LocalCounter> - <LocalCounter worker="5">14522178</LocalCounter> - <LocalCounter worker="6">14548350</LocalCounter> - <LocalCounter worker="7">14554882</LocalCounter> - <LocalCounter worker="8">15834293</LocalCounter> - <LocalCounter worker="9">15834734</LocalCounter> - <LocalCounter worker="10">16861946</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>164865618</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="12"> - <LocalCounter worker="0">14544735</LocalCounter> - <LocalCounter worker="1">14545749</LocalCounter> - <LocalCounter worker="2">14545348</LocalCounter> - <LocalCounter worker="3">14545729</LocalCounter> - <LocalCounter worker="4">14531175</LocalCounter> - <LocalCounter worker="5">14531582</LocalCounter> - <LocalCounter worker="6">14545221</LocalCounter> - <LocalCounter worker="7">14552316</LocalCounter> - <LocalCounter worker="8">15709806</LocalCounter> - <LocalCounter worker="9">15710183</LocalCounter> - <LocalCounter worker="10">15613298</LocalCounter> - <LocalCounter worker="11">15613336</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>178988478</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="13"> - <LocalCounter worker="0">14631943</LocalCounter> - <LocalCounter worker="1">14629081</LocalCounter> - <LocalCounter worker="2">14626428</LocalCounter> - <LocalCounter worker="3">14629173</LocalCounter> - <LocalCounter worker="4">14592751</LocalCounter> - <LocalCounter worker="5">14593171</LocalCounter> - <LocalCounter worker="6">14633428</LocalCounter> - <LocalCounter worker="7">14642988</LocalCounter> - <LocalCounter worker="8">16103014</LocalCounter> - <LocalCounter worker="9">16103498</LocalCounter> - <LocalCounter worker="10">16121344</LocalCounter> - <LocalCounter worker="11">16121522</LocalCounter> - <LocalCounter worker="12">16592935</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>198021276</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="14"> - <LocalCounter worker="0">14663977</LocalCounter> - <LocalCounter worker="1">14657392</LocalCounter> - <LocalCounter worker="2">14653868</LocalCounter> - <LocalCounter worker="3">14657385</LocalCounter> - <LocalCounter worker="4">14618995</LocalCounter> - <LocalCounter worker="5">14619260</LocalCounter> - <LocalCounter worker="6">14663280</LocalCounter> - <LocalCounter worker="7">14669006</LocalCounter> - <LocalCounter worker="8">14932649</LocalCounter> - <LocalCounter worker="9">14933133</LocalCounter> - <LocalCounter worker="10">14914884</LocalCounter> - <LocalCounter worker="11">14922839</LocalCounter> - <LocalCounter worker="12">14912239</LocalCounter> - <LocalCounter worker="13">14912618</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>206731525</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="15"> - <LocalCounter worker="0">14574685</LocalCounter> - <LocalCounter worker="1">14571820</LocalCounter> - <LocalCounter worker="2">14569180</LocalCounter> - <LocalCounter worker="3">14571882</LocalCounter> - <LocalCounter worker="4">14535038</LocalCounter> - <LocalCounter worker="5">14535448</LocalCounter> - <LocalCounter worker="6">14576273</LocalCounter> - <LocalCounter worker="7">14588007</LocalCounter> - <LocalCounter worker="8">15847051</LocalCounter> - <LocalCounter worker="9">15847907</LocalCounter> - <LocalCounter worker="10">15842926</LocalCounter> - <LocalCounter worker="11">15845292</LocalCounter> - <LocalCounter worker="12">15844741</LocalCounter> - <LocalCounter worker="13">15845144</LocalCounter> - <LocalCounter worker="14">15858663</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>227454057</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="16"> - <LocalCounter worker="0">14565742</LocalCounter> - <LocalCounter worker="1">14566794</LocalCounter> - <LocalCounter worker="2">14563059</LocalCounter> - <LocalCounter worker="3">14566698</LocalCounter> - <LocalCounter worker="4">14539138</LocalCounter> - <LocalCounter worker="5">14539550</LocalCounter> - <LocalCounter worker="6">14572545</LocalCounter> - <LocalCounter worker="7">14582815</LocalCounter> - <LocalCounter worker="8">14708684</LocalCounter> - <LocalCounter worker="9">14709444</LocalCounter> - <LocalCounter worker="10">14704986</LocalCounter> - <LocalCounter worker="11">14705363</LocalCounter> - <LocalCounter worker="12">14739299</LocalCounter> - <LocalCounter worker="13">14739959</LocalCounter> - <LocalCounter worker="14">14685047</LocalCounter> - <LocalCounter worker="15">14684929</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>234174052</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="17"> - <LocalCounter worker="0">14578846</LocalCounter> - <LocalCounter worker="1">14579881</LocalCounter> - <LocalCounter worker="2">14577981</LocalCounter> - <LocalCounter worker="3">14579886</LocalCounter> - <LocalCounter worker="4">14572709</LocalCounter> - <LocalCounter worker="5">14573049</LocalCounter> - <LocalCounter worker="6">14582536</LocalCounter> - <LocalCounter worker="7">14584350</LocalCounter> - <LocalCounter worker="8">15007742</LocalCounter> - <LocalCounter worker="9">15008395</LocalCounter> - <LocalCounter worker="10">15007420</LocalCounter> - <LocalCounter worker="11">15007658</LocalCounter> - <LocalCounter worker="12">15014167</LocalCounter> - <LocalCounter worker="13">15014785</LocalCounter> - <LocalCounter worker="14">15005244</LocalCounter> - <LocalCounter worker="15">15005419</LocalCounter> - <LocalCounter worker="16">18174844</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>254874912</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="18"> - <LocalCounter worker="0">14520800</LocalCounter> - <LocalCounter worker="1">14521760</LocalCounter> - <LocalCounter worker="2">14516500</LocalCounter> - <LocalCounter worker="3">14519179</LocalCounter> - <LocalCounter worker="4">14488245</LocalCounter> - <LocalCounter worker="5">14488682</LocalCounter> - <LocalCounter worker="6">14533956</LocalCounter> - <LocalCounter worker="7">14545682</LocalCounter> - <LocalCounter worker="8">14854184</LocalCounter> - <LocalCounter worker="9">14854859</LocalCounter> - <LocalCounter worker="10">14853940</LocalCounter> - <LocalCounter worker="11">14854226</LocalCounter> - <LocalCounter worker="12">14853922</LocalCounter> - <LocalCounter worker="13">14854597</LocalCounter> - <LocalCounter worker="14">14853928</LocalCounter> - <LocalCounter worker="15">14854269</LocalCounter> - <LocalCounter worker="16">16695502</LocalCounter> - <LocalCounter worker="17">16695771</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>268360002</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="19"> - <LocalCounter worker="0">14767102</LocalCounter> - <LocalCounter worker="1">14756811</LocalCounter> - <LocalCounter worker="2">14754774</LocalCounter> - <LocalCounter worker="3">14756725</LocalCounter> - <LocalCounter worker="4">14720166</LocalCounter> - <LocalCounter worker="5">14720526</LocalCounter> - <LocalCounter worker="6">14759446</LocalCounter> - <LocalCounter worker="7">14768164</LocalCounter> - <LocalCounter worker="8">15010901</LocalCounter> - <LocalCounter worker="9">15011570</LocalCounter> - <LocalCounter worker="10">15010636</LocalCounter> - <LocalCounter worker="11">15010954</LocalCounter> - <LocalCounter worker="12">15010667</LocalCounter> - <LocalCounter worker="13">15011279</LocalCounter> - <LocalCounter worker="14">15010747</LocalCounter> - <LocalCounter worker="15">15011090</LocalCounter> - <LocalCounter worker="16">16740850</LocalCounter> - <LocalCounter worker="17">16741140</LocalCounter> - <LocalCounter worker="18">16740556</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>288314104</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="20"> - <LocalCounter worker="0">14503694</LocalCounter> - <LocalCounter worker="1">14504695</LocalCounter> - <LocalCounter worker="2">14504309</LocalCounter> - <LocalCounter worker="3">14504656</LocalCounter> - <LocalCounter worker="4">14481517</LocalCounter> - <LocalCounter worker="5">14481930</LocalCounter> - <LocalCounter worker="6">14504225</LocalCounter> - <LocalCounter worker="7">14511441</LocalCounter> - <LocalCounter worker="8">14881230</LocalCounter> - <LocalCounter worker="9">14881959</LocalCounter> - <LocalCounter worker="10">14880910</LocalCounter> - <LocalCounter worker="11">14881278</LocalCounter> - <LocalCounter worker="12">14881048</LocalCounter> - <LocalCounter worker="13">14881629</LocalCounter> - <LocalCounter worker="14">14881078</LocalCounter> - <LocalCounter worker="15">14881274</LocalCounter> - <LocalCounter worker="16">15921487</LocalCounter> - <LocalCounter worker="17">15921957</LocalCounter> - <LocalCounter worker="18">15772241</LocalCounter> - <LocalCounter worker="19">15772141</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>298434699</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="21"> - <LocalCounter worker="0">14585345</LocalCounter> - <LocalCounter worker="1">14586417</LocalCounter> - <LocalCounter worker="2">14584462</LocalCounter> - <LocalCounter worker="3">14586324</LocalCounter> - <LocalCounter worker="4">14561834</LocalCounter> - <LocalCounter worker="5">14562194</LocalCounter> - <LocalCounter worker="6">14589003</LocalCounter> - <LocalCounter worker="7">14593127</LocalCounter> - <LocalCounter worker="8">14651792</LocalCounter> - <LocalCounter worker="9">14652414</LocalCounter> - <LocalCounter worker="10">14651588</LocalCounter> - <LocalCounter worker="11">14651811</LocalCounter> - <LocalCounter worker="12">14651560</LocalCounter> - <LocalCounter worker="13">14652081</LocalCounter> - <LocalCounter worker="14">14651657</LocalCounter> - <LocalCounter worker="15">14651849</LocalCounter> - <LocalCounter worker="16">15956242</LocalCounter> - <LocalCounter worker="17">15956591</LocalCounter> - <LocalCounter worker="18">15917381</LocalCounter> - <LocalCounter worker="19">15917342</LocalCounter> - <LocalCounter worker="20">16692459</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>314303473</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="22"> - <LocalCounter worker="0">14567398</LocalCounter> - <LocalCounter worker="1">14564632</LocalCounter> - <LocalCounter worker="2">14561858</LocalCounter> - <LocalCounter worker="3">14564593</LocalCounter> - <LocalCounter worker="4">14537808</LocalCounter> - <LocalCounter worker="5">14538183</LocalCounter> - <LocalCounter worker="6">14568901</LocalCounter> - <LocalCounter worker="7">14571570</LocalCounter> - <LocalCounter worker="8">14824939</LocalCounter> - <LocalCounter worker="9">14825595</LocalCounter> - <LocalCounter worker="10">14824563</LocalCounter> - <LocalCounter worker="11">14824936</LocalCounter> - <LocalCounter worker="12">14824664</LocalCounter> - <LocalCounter worker="13">14825180</LocalCounter> - <LocalCounter worker="14">14824622</LocalCounter> - <LocalCounter worker="15">14824869</LocalCounter> - <LocalCounter worker="16">15000394</LocalCounter> - <LocalCounter worker="17">15000816</LocalCounter> - <LocalCounter worker="18">15132415</LocalCounter> - <LocalCounter worker="19">15132390</LocalCounter> - <LocalCounter worker="20">14957113</LocalCounter> - <LocalCounter worker="21">14957467</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>325254906</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="23"> - <LocalCounter worker="0">14533130</LocalCounter> - <LocalCounter worker="1">14526680</LocalCounter> - <LocalCounter worker="2">14523900</LocalCounter> - <LocalCounter worker="3">14526694</LocalCounter> - <LocalCounter worker="4">14473827</LocalCounter> - <LocalCounter worker="5">14474177</LocalCounter> - <LocalCounter worker="6">14530917</LocalCounter> - <LocalCounter worker="7">14540399</LocalCounter> - <LocalCounter worker="8">14689348</LocalCounter> - <LocalCounter worker="9">14690045</LocalCounter> - <LocalCounter worker="10">14689080</LocalCounter> - <LocalCounter worker="11">14689352</LocalCounter> - <LocalCounter worker="12">14689191</LocalCounter> - <LocalCounter worker="13">14689822</LocalCounter> - <LocalCounter worker="14">14689153</LocalCounter> - <LocalCounter worker="15">14689383</LocalCounter> - <LocalCounter worker="16">15149225</LocalCounter> - <LocalCounter worker="17">15149721</LocalCounter> - <LocalCounter worker="18">15149099</LocalCounter> - <LocalCounter worker="19">15149020</LocalCounter> - <LocalCounter worker="20">15149087</LocalCounter> - <LocalCounter worker="21">15149374</LocalCounter> - <LocalCounter worker="22">15723066</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>340263690</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalTicketLockWithLocalCounter activeWorker="24"> - <LocalCounter worker="0">14520191</LocalCounter> - <LocalCounter worker="1">14521316</LocalCounter> - <LocalCounter worker="2">14520064</LocalCounter> - <LocalCounter worker="3">14521273</LocalCounter> - <LocalCounter worker="4">14508861</LocalCounter> - <LocalCounter worker="5">14509277</LocalCounter> - <LocalCounter worker="6">14522439</LocalCounter> - <LocalCounter worker="7">14523376</LocalCounter> - <LocalCounter worker="8">14971139</LocalCounter> - <LocalCounter worker="9">14971788</LocalCounter> - <LocalCounter worker="10">14970834</LocalCounter> - <LocalCounter worker="11">14971145</LocalCounter> - <LocalCounter worker="12">14970850</LocalCounter> - <LocalCounter worker="13">14971356</LocalCounter> - <LocalCounter worker="14">14970773</LocalCounter> - <LocalCounter worker="15">14971212</LocalCounter> - <LocalCounter worker="16">14302288</LocalCounter> - <LocalCounter worker="17">14302674</LocalCounter> - <LocalCounter worker="18">14292318</LocalCounter> - <LocalCounter worker="19">14292258</LocalCounter> - <LocalCounter worker="20">14327757</LocalCounter> - <LocalCounter worker="21">14328109</LocalCounter> - <LocalCounter worker="22">14203917</LocalCounter> - <LocalCounter worker="23">14204596</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>350169811</SumOfLocalCounter> - </LocalTicketLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="1"> - <LocalCounter worker="0">12082070</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>12082070</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="2"> - <LocalCounter worker="0">11860565</LocalCounter> - <LocalCounter worker="1">11861524</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>23722089</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="3"> - <LocalCounter worker="0">10937185</LocalCounter> - <LocalCounter worker="1">11666176</LocalCounter> - <LocalCounter worker="2">11377885</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>33981246</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="4"> - <LocalCounter worker="0">10711169</LocalCounter> - <LocalCounter worker="1">11044642</LocalCounter> - <LocalCounter worker="2">10712186</LocalCounter> - <LocalCounter worker="3">10711772</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>43179769</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="5"> - <LocalCounter worker="0">10681736</LocalCounter> - <LocalCounter worker="1">10803241</LocalCounter> - <LocalCounter worker="2">10697774</LocalCounter> - <LocalCounter worker="3">10697365</LocalCounter> - <LocalCounter worker="4">10786731</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>53666847</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="6"> - <LocalCounter worker="0">10202899</LocalCounter> - <LocalCounter worker="1">10453899</LocalCounter> - <LocalCounter worker="2">10236078</LocalCounter> - <LocalCounter worker="3">10235641</LocalCounter> - <LocalCounter worker="4">10203405</LocalCounter> - <LocalCounter worker="5">10435466</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>61767388</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="7"> - <LocalCounter worker="0">10057432</LocalCounter> - <LocalCounter worker="1">10126310</LocalCounter> - <LocalCounter worker="2">10062880</LocalCounter> - <LocalCounter worker="3">10062441</LocalCounter> - <LocalCounter worker="4">10056560</LocalCounter> - <LocalCounter worker="5">10117801</LocalCounter> - <LocalCounter worker="6">10136814</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>70620238</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="8"> - <LocalCounter worker="0">9534620</LocalCounter> - <LocalCounter worker="1">9563972</LocalCounter> - <LocalCounter worker="2">9529566</LocalCounter> - <LocalCounter worker="3">9529136</LocalCounter> - <LocalCounter worker="4">9534974</LocalCounter> - <LocalCounter worker="5">9559121</LocalCounter> - <LocalCounter worker="6">9532504</LocalCounter> - <LocalCounter worker="7">9532098</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>76315991</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="9"> - <LocalCounter worker="0">9588196</LocalCounter> - <LocalCounter worker="1">9644812</LocalCounter> - <LocalCounter worker="2">9569541</LocalCounter> - <LocalCounter worker="3">9569144</LocalCounter> - <LocalCounter worker="4">9588269</LocalCounter> - <LocalCounter worker="5">9635446</LocalCounter> - <LocalCounter worker="6">9587520</LocalCounter> - <LocalCounter worker="7">9587124</LocalCounter> - <LocalCounter worker="8">12171038</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>88941090</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="10"> - <LocalCounter worker="0">9494406</LocalCounter> - <LocalCounter worker="1">9569092</LocalCounter> - <LocalCounter worker="2">9483166</LocalCounter> - <LocalCounter worker="3">9482828</LocalCounter> - <LocalCounter worker="4">9494096</LocalCounter> - <LocalCounter worker="5">9549855</LocalCounter> - <LocalCounter worker="6">9493566</LocalCounter> - <LocalCounter worker="7">9493228</LocalCounter> - <LocalCounter worker="8">11870461</LocalCounter> - <LocalCounter worker="9">11870751</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>99801449</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="11"> - <LocalCounter worker="0">9547513</LocalCounter> - <LocalCounter worker="1">9618639</LocalCounter> - <LocalCounter worker="2">9531079</LocalCounter> - <LocalCounter worker="3">9530708</LocalCounter> - <LocalCounter worker="4">9544013</LocalCounter> - <LocalCounter worker="5">9582528</LocalCounter> - <LocalCounter worker="6">9546188</LocalCounter> - <LocalCounter worker="7">9545855</LocalCounter> - <LocalCounter worker="8">10981480</LocalCounter> - <LocalCounter worker="9">11695200</LocalCounter> - <LocalCounter worker="10">11417956</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>110541159</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="12"> - <LocalCounter worker="0">9480940</LocalCounter> - <LocalCounter worker="1">9534711</LocalCounter> - <LocalCounter worker="2">9471781</LocalCounter> - <LocalCounter worker="3">9471472</LocalCounter> - <LocalCounter worker="4">9481875</LocalCounter> - <LocalCounter worker="5">9525995</LocalCounter> - <LocalCounter worker="6">9478339</LocalCounter> - <LocalCounter worker="7">9478029</LocalCounter> - <LocalCounter worker="8">10711265</LocalCounter> - <LocalCounter worker="9">11114755</LocalCounter> - <LocalCounter worker="10">10711627</LocalCounter> - <LocalCounter worker="11">10711294</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>119172083</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="13"> - <LocalCounter worker="0">9546022</LocalCounter> - <LocalCounter worker="1">9587726</LocalCounter> - <LocalCounter worker="2">9539512</LocalCounter> - <LocalCounter worker="3">9539112</LocalCounter> - <LocalCounter worker="4">9546798</LocalCounter> - <LocalCounter worker="5">9572802</LocalCounter> - <LocalCounter worker="6">9547437</LocalCounter> - <LocalCounter worker="7">9547014</LocalCounter> - <LocalCounter worker="8">10700918</LocalCounter> - <LocalCounter worker="9">10778357</LocalCounter> - <LocalCounter worker="10">10711682</LocalCounter> - <LocalCounter worker="11">10711355</LocalCounter> - <LocalCounter worker="12">10766560</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>130095295</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="14"> - <LocalCounter worker="0">9529110</LocalCounter> - <LocalCounter worker="1">9587899</LocalCounter> - <LocalCounter worker="2">9523029</LocalCounter> - <LocalCounter worker="3">9522600</LocalCounter> - <LocalCounter worker="4">9529393</LocalCounter> - <LocalCounter worker="5">9562307</LocalCounter> - <LocalCounter worker="6">9531767</LocalCounter> - <LocalCounter worker="7">9531364</LocalCounter> - <LocalCounter worker="8">10124795</LocalCounter> - <LocalCounter worker="9">10538492</LocalCounter> - <LocalCounter worker="10">10167869</LocalCounter> - <LocalCounter worker="11">10167494</LocalCounter> - <LocalCounter worker="12">10101866</LocalCounter> - <LocalCounter worker="13">10500389</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>137918374</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="15"> - <LocalCounter worker="0">9566449</LocalCounter> - <LocalCounter worker="1">9604833</LocalCounter> - <LocalCounter worker="2">9559288</LocalCounter> - <LocalCounter worker="3">9558898</LocalCounter> - <LocalCounter worker="4">9567098</LocalCounter> - <LocalCounter worker="5">9599387</LocalCounter> - <LocalCounter worker="6">9566496</LocalCounter> - <LocalCounter worker="7">9566147</LocalCounter> - <LocalCounter worker="8">10075047</LocalCounter> - <LocalCounter worker="9">10164135</LocalCounter> - <LocalCounter worker="10">10082703</LocalCounter> - <LocalCounter worker="11">10082326</LocalCounter> - <LocalCounter worker="12">10075244</LocalCounter> - <LocalCounter worker="13">10155140</LocalCounter> - <LocalCounter worker="14">10178314</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>147401505</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="16"> - <LocalCounter worker="0">9508977</LocalCounter> - <LocalCounter worker="1">9585956</LocalCounter> - <LocalCounter worker="2">9501428</LocalCounter> - <LocalCounter worker="3">9501014</LocalCounter> - <LocalCounter worker="4">9508465</LocalCounter> - <LocalCounter worker="5">9556360</LocalCounter> - <LocalCounter worker="6">9512315</LocalCounter> - <LocalCounter worker="7">9511916</LocalCounter> - <LocalCounter worker="8">9534416</LocalCounter> - <LocalCounter worker="9">9549972</LocalCounter> - <LocalCounter worker="10">9531251</LocalCounter> - <LocalCounter worker="11">9530849</LocalCounter> - <LocalCounter worker="12">9535299</LocalCounter> - <LocalCounter worker="13">9547690</LocalCounter> - <LocalCounter worker="14">9533669</LocalCounter> - <LocalCounter worker="15">9533330</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>152482907</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="17"> - <LocalCounter worker="0">9456577</LocalCounter> - <LocalCounter worker="1">9518572</LocalCounter> - <LocalCounter worker="2">9448329</LocalCounter> - <LocalCounter worker="3">9447904</LocalCounter> - <LocalCounter worker="4">9456755</LocalCounter> - <LocalCounter worker="5">9492156</LocalCounter> - <LocalCounter worker="6">9456619</LocalCounter> - <LocalCounter worker="7">9456290</LocalCounter> - <LocalCounter worker="8">9469695</LocalCounter> - <LocalCounter worker="9">9504090</LocalCounter> - <LocalCounter worker="10">9467165</LocalCounter> - <LocalCounter worker="11">9466779</LocalCounter> - <LocalCounter worker="12">9469736</LocalCounter> - <LocalCounter worker="13">9490753</LocalCounter> - <LocalCounter worker="14">9470460</LocalCounter> - <LocalCounter worker="15">9470100</LocalCounter> - <LocalCounter worker="16">12081737</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>163623717</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="18"> - <LocalCounter worker="0">9528572</LocalCounter> - <LocalCounter worker="1">9578324</LocalCounter> - <LocalCounter worker="2">9512159</LocalCounter> - <LocalCounter worker="3">9511743</LocalCounter> - <LocalCounter worker="4">9526173</LocalCounter> - <LocalCounter worker="5">9569951</LocalCounter> - <LocalCounter worker="6">9534866</LocalCounter> - <LocalCounter worker="7">9534526</LocalCounter> - <LocalCounter worker="8">9544758</LocalCounter> - <LocalCounter worker="9">9593215</LocalCounter> - <LocalCounter worker="10">9539533</LocalCounter> - <LocalCounter worker="11">9539119</LocalCounter> - <LocalCounter worker="12">9545198</LocalCounter> - <LocalCounter worker="13">9585695</LocalCounter> - <LocalCounter worker="14">9543578</LocalCounter> - <LocalCounter worker="15">9543186</LocalCounter> - <LocalCounter worker="16">11927396</LocalCounter> - <LocalCounter worker="17">11927804</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>176585796</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="19"> - <LocalCounter worker="0">9477447</LocalCounter> - <LocalCounter worker="1">9564597</LocalCounter> - <LocalCounter worker="2">9452396</LocalCounter> - <LocalCounter worker="3">9451981</LocalCounter> - <LocalCounter worker="4">9473225</LocalCounter> - <LocalCounter worker="5">9533594</LocalCounter> - <LocalCounter worker="6">9478730</LocalCounter> - <LocalCounter worker="7">9478355</LocalCounter> - <LocalCounter worker="8">9491282</LocalCounter> - <LocalCounter worker="9">9542542</LocalCounter> - <LocalCounter worker="10">9469974</LocalCounter> - <LocalCounter worker="11">9469570</LocalCounter> - <LocalCounter worker="12">9488649</LocalCounter> - <LocalCounter worker="13">9533937</LocalCounter> - <LocalCounter worker="14">9493941</LocalCounter> - <LocalCounter worker="15">9493595</LocalCounter> - <LocalCounter worker="16">10869069</LocalCounter> - <LocalCounter worker="17">11610326</LocalCounter> - <LocalCounter worker="18">11333158</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>185706368</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="20"> - <LocalCounter worker="0">9513336</LocalCounter> - <LocalCounter worker="1">9581580</LocalCounter> - <LocalCounter worker="2">9502256</LocalCounter> - <LocalCounter worker="3">9501888</LocalCounter> - <LocalCounter worker="4">9514403</LocalCounter> - <LocalCounter worker="5">9561923</LocalCounter> - <LocalCounter worker="6">9510586</LocalCounter> - <LocalCounter worker="7">9510218</LocalCounter> - <LocalCounter worker="8">9577756</LocalCounter> - <LocalCounter worker="9">9601845</LocalCounter> - <LocalCounter worker="10">9576720</LocalCounter> - <LocalCounter worker="11">9576333</LocalCounter> - <LocalCounter worker="12">9576562</LocalCounter> - <LocalCounter worker="13">9591627</LocalCounter> - <LocalCounter worker="14">9575875</LocalCounter> - <LocalCounter worker="15">9575454</LocalCounter> - <LocalCounter worker="16">10774344</LocalCounter> - <LocalCounter worker="17">11131500</LocalCounter> - <LocalCounter worker="18">10795173</LocalCounter> - <LocalCounter worker="19">10794817</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>196344196</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="21"> - <LocalCounter worker="0">9489784</LocalCounter> - <LocalCounter worker="1">9553505</LocalCounter> - <LocalCounter worker="2">9480407</LocalCounter> - <LocalCounter worker="3">9480031</LocalCounter> - <LocalCounter worker="4">9487187</LocalCounter> - <LocalCounter worker="5">9517609</LocalCounter> - <LocalCounter worker="6">9490215</LocalCounter> - <LocalCounter worker="7">9489795</LocalCounter> - <LocalCounter worker="8">9480100</LocalCounter> - <LocalCounter worker="9">9512956</LocalCounter> - <LocalCounter worker="10">9469789</LocalCounter> - <LocalCounter worker="11">9469408</LocalCounter> - <LocalCounter worker="12">9478224</LocalCounter> - <LocalCounter worker="13">9507407</LocalCounter> - <LocalCounter worker="14">9480884</LocalCounter> - <LocalCounter worker="15">9480522</LocalCounter> - <LocalCounter worker="16">10558463</LocalCounter> - <LocalCounter worker="17">10781768</LocalCounter> - <LocalCounter worker="18">10586536</LocalCounter> - <LocalCounter worker="19">10586157</LocalCounter> - <LocalCounter worker="20">10751665</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>205132412</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="22"> - <LocalCounter worker="0">9529280</LocalCounter> - <LocalCounter worker="1">9596479</LocalCounter> - <LocalCounter worker="2">9526225</LocalCounter> - <LocalCounter worker="3">9525841</LocalCounter> - <LocalCounter worker="4">9530068</LocalCounter> - <LocalCounter worker="5">9560604</LocalCounter> - <LocalCounter worker="6">9526967</LocalCounter> - <LocalCounter worker="7">9526692</LocalCounter> - <LocalCounter worker="8">9535973</LocalCounter> - <LocalCounter worker="9">9579641</LocalCounter> - <LocalCounter worker="10">9521811</LocalCounter> - <LocalCounter worker="11">9521452</LocalCounter> - <LocalCounter worker="12">9533157</LocalCounter> - <LocalCounter worker="13">9572320</LocalCounter> - <LocalCounter worker="14">9537636</LocalCounter> - <LocalCounter worker="15">9537265</LocalCounter> - <LocalCounter worker="16">10282870</LocalCounter> - <LocalCounter worker="17">10460861</LocalCounter> - <LocalCounter worker="18">10307364</LocalCounter> - <LocalCounter worker="19">10307036</LocalCounter> - <LocalCounter worker="20">10284193</LocalCounter> - <LocalCounter worker="21">10447335</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>214751070</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="23"> - <LocalCounter worker="0">9474195</LocalCounter> - <LocalCounter worker="1">9526351</LocalCounter> - <LocalCounter worker="2">9466045</LocalCounter> - <LocalCounter worker="3">9465650</LocalCounter> - <LocalCounter worker="4">9474273</LocalCounter> - <LocalCounter worker="5">9509635</LocalCounter> - <LocalCounter worker="6">9475163</LocalCounter> - <LocalCounter worker="7">9474803</LocalCounter> - <LocalCounter worker="8">9527687</LocalCounter> - <LocalCounter worker="9">9582242</LocalCounter> - <LocalCounter worker="10">9516774</LocalCounter> - <LocalCounter worker="11">9516407</LocalCounter> - <LocalCounter worker="12">9526734</LocalCounter> - <LocalCounter worker="13">9556254</LocalCounter> - <LocalCounter worker="14">9528842</LocalCounter> - <LocalCounter worker="15">9528456</LocalCounter> - <LocalCounter worker="16">9971596</LocalCounter> - <LocalCounter worker="17">10094615</LocalCounter> - <LocalCounter worker="18">9984885</LocalCounter> - <LocalCounter worker="19">9984498</LocalCounter> - <LocalCounter worker="20">9969546</LocalCounter> - <LocalCounter worker="21">10080306</LocalCounter> - <LocalCounter worker="22">10113352</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>222348309</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalMCSLockWithLocalCounter activeWorker="24"> - <LocalCounter worker="0">9570183</LocalCounter> - <LocalCounter worker="1">9596856</LocalCounter> - <LocalCounter worker="2">9566396</LocalCounter> - <LocalCounter worker="3">9565955</LocalCounter> - <LocalCounter worker="4">9570347</LocalCounter> - <LocalCounter worker="5">9592890</LocalCounter> - <LocalCounter worker="6">9571708</LocalCounter> - <LocalCounter worker="7">9571344</LocalCounter> - <LocalCounter worker="8">9568931</LocalCounter> - <LocalCounter worker="9">9609557</LocalCounter> - <LocalCounter worker="10">9562498</LocalCounter> - <LocalCounter worker="11">9562127</LocalCounter> - <LocalCounter worker="12">9567335</LocalCounter> - <LocalCounter worker="13">9602518</LocalCounter> - <LocalCounter worker="14">9566096</LocalCounter> - <LocalCounter worker="15">9565736</LocalCounter> - <LocalCounter worker="16">9608409</LocalCounter> - <LocalCounter worker="17">9631716</LocalCounter> - <LocalCounter worker="18">9604886</LocalCounter> - <LocalCounter worker="19">9604505</LocalCounter> - <LocalCounter worker="20">9607807</LocalCounter> - <LocalCounter worker="21">9629640</LocalCounter> - <LocalCounter worker="22">9603907</LocalCounter> - <LocalCounter worker="23">9629626</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>230130973</SumOfLocalCounter> - </LocalMCSLockWithLocalCounter> - <LocalTicketLockWithGlobalCounter activeWorker="24"> - <LocalCounter worker="0">903446</LocalCounter> - <LocalCounter worker="1">903762</LocalCounter> - <LocalCounter worker="2">903658</LocalCounter> - <LocalCounter worker="3">903679</LocalCounter> - <LocalCounter worker="4">903658</LocalCounter> - <LocalCounter worker="5">903690</LocalCounter> - <LocalCounter worker="6">903665</LocalCounter> - <LocalCounter worker="7">903667</LocalCounter> - <LocalCounter worker="8">905432</LocalCounter> - <LocalCounter worker="9">905463</LocalCounter> - <LocalCounter worker="10">905415</LocalCounter> - <LocalCounter worker="11">905426</LocalCounter> - <LocalCounter worker="12">905442</LocalCounter> - <LocalCounter worker="13">905442</LocalCounter> - <LocalCounter worker="14">905434</LocalCounter> - <LocalCounter worker="15">905417</LocalCounter> - <LocalCounter worker="16">902746</LocalCounter> - <LocalCounter worker="17">902734</LocalCounter> - <LocalCounter worker="18">902731</LocalCounter> - <LocalCounter worker="19">902719</LocalCounter> - <LocalCounter worker="20">902734</LocalCounter> - <LocalCounter worker="21">902750</LocalCounter> - <LocalCounter worker="22">902746</LocalCounter> - <LocalCounter worker="23">902708</LocalCounter> - <GlobalCounter>2057722</GlobalCounter> - <SumOfLocalCounter>21694564</SumOfLocalCounter> - </LocalTicketLockWithGlobalCounter> - <LocalMCSLockWithGlobalCounter activeWorker="24"> - <LocalCounter worker="0">859801</LocalCounter> - <LocalCounter worker="1">967785</LocalCounter> - <LocalCounter worker="2">883645</LocalCounter> - <LocalCounter worker="3">883619</LocalCounter> - <LocalCounter worker="4">860037</LocalCounter> - <LocalCounter worker="5">968025</LocalCounter> - <LocalCounter worker="6">883058</LocalCounter> - <LocalCounter worker="7">883016</LocalCounter> - <LocalCounter worker="8">865337</LocalCounter> - <LocalCounter worker="9">974824</LocalCounter> - <LocalCounter worker="10">882369</LocalCounter> - <LocalCounter worker="11">882341</LocalCounter> - <LocalCounter worker="12">863544</LocalCounter> - <LocalCounter worker="13">972159</LocalCounter> - <LocalCounter worker="14">892721</LocalCounter> - <LocalCounter worker="15">892715</LocalCounter> - <LocalCounter worker="16">857049</LocalCounter> - <LocalCounter worker="17">963725</LocalCounter> - <LocalCounter worker="18">880627</LocalCounter> - <LocalCounter worker="19">880584</LocalCounter> - <LocalCounter worker="20">856853</LocalCounter> - <LocalCounter worker="21">963380</LocalCounter> - <LocalCounter worker="22">854026</LocalCounter> - <LocalCounter worker="23">952345</LocalCounter> - <GlobalCounter>1763851</GlobalCounter> - <SumOfLocalCounter>21623585</SumOfLocalCounter> - </LocalMCSLockWithGlobalCounter> - <GlobalTicketLockWithBusySection activeWorker="24"> - <LocalCounter worker="0">122500</LocalCounter> - <LocalCounter worker="1">122500</LocalCounter> - <LocalCounter worker="2">122500</LocalCounter> - <LocalCounter worker="3">122500</LocalCounter> - <LocalCounter worker="4">122499</LocalCounter> - <LocalCounter worker="5">122500</LocalCounter> - <LocalCounter worker="6">122500</LocalCounter> - <LocalCounter worker="7">122500</LocalCounter> - <LocalCounter worker="8">122500</LocalCounter> - <LocalCounter worker="9">122500</LocalCounter> - <LocalCounter worker="10">122500</LocalCounter> - <LocalCounter worker="11">122500</LocalCounter> - <LocalCounter worker="12">122500</LocalCounter> - <LocalCounter worker="13">122500</LocalCounter> - <LocalCounter worker="14">122500</LocalCounter> - <LocalCounter worker="15">122500</LocalCounter> - <LocalCounter worker="16">122499</LocalCounter> - <LocalCounter worker="17">122501</LocalCounter> - <LocalCounter worker="18">122500</LocalCounter> - <LocalCounter worker="19">122500</LocalCounter> - <LocalCounter worker="20">122501</LocalCounter> - <LocalCounter worker="21">122501</LocalCounter> - <LocalCounter worker="22">122501</LocalCounter> - <LocalCounter worker="23">122501</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2940003</SumOfLocalCounter> - </GlobalTicketLockWithBusySection> - <GlobalMCSLockWithBusySection activeWorker="24"> - <LocalCounter worker="0">109856</LocalCounter> - <LocalCounter worker="1">109857</LocalCounter> - <LocalCounter worker="2">109857</LocalCounter> - <LocalCounter worker="3">109856</LocalCounter> - <LocalCounter worker="4">109857</LocalCounter> - <LocalCounter worker="5">109856</LocalCounter> - <LocalCounter worker="6">109857</LocalCounter> - <LocalCounter worker="7">109857</LocalCounter> - <LocalCounter worker="8">109856</LocalCounter> - <LocalCounter worker="9">109856</LocalCounter> - <LocalCounter worker="10">109857</LocalCounter> - <LocalCounter worker="11">109858</LocalCounter> - <LocalCounter worker="12">109858</LocalCounter> - <LocalCounter worker="13">109857</LocalCounter> - <LocalCounter worker="14">109856</LocalCounter> - <LocalCounter worker="15">109856</LocalCounter> - <LocalCounter worker="16">109858</LocalCounter> - <LocalCounter worker="17">109857</LocalCounter> - <LocalCounter worker="18">109857</LocalCounter> - <LocalCounter worker="19">109857</LocalCounter> - <LocalCounter worker="20">109856</LocalCounter> - <LocalCounter worker="21">109857</LocalCounter> - <LocalCounter worker="22">109856</LocalCounter> - <LocalCounter worker="23">109857</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2636562</SumOfLocalCounter> - </GlobalMCSLockWithBusySection> - <SequenceLock activeWorker="24"> - <LocalCounter worker="0">2443697</LocalCounter> - <LocalCounter worker="1">1</LocalCounter> - <LocalCounter worker="2">11</LocalCounter> - <LocalCounter worker="3">19</LocalCounter> - <LocalCounter worker="4">34</LocalCounter> - <LocalCounter worker="5">4</LocalCounter> - <LocalCounter worker="6">11</LocalCounter> - <LocalCounter worker="7">27</LocalCounter> - <LocalCounter worker="8">738</LocalCounter> - <LocalCounter worker="9">715</LocalCounter> - <LocalCounter worker="10">708</LocalCounter> - <LocalCounter worker="11">710</LocalCounter> - <LocalCounter worker="12">716</LocalCounter> - <LocalCounter worker="13">722</LocalCounter> - <LocalCounter worker="14">663</LocalCounter> - <LocalCounter worker="15">680</LocalCounter> - <LocalCounter worker="16">818</LocalCounter> - <LocalCounter worker="17">816</LocalCounter> - <LocalCounter worker="18">798</LocalCounter> - <LocalCounter worker="19">793</LocalCounter> - <LocalCounter worker="20">749</LocalCounter> - <LocalCounter worker="21">737</LocalCounter> - <LocalCounter worker="22">681</LocalCounter> - <LocalCounter worker="23">713</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2455561</SumOfLocalCounter> - </SequenceLock> - <GlobalTASLockWithLocalCounter activeWorker="1"> - <LocalCounter worker="0">19899718</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>19899718</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="2"> - <LocalCounter worker="0">11323121</LocalCounter> - <LocalCounter worker="1">8390566</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>19713687</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="3"> - <LocalCounter worker="0">3505442</LocalCounter> - <LocalCounter worker="1">3505599</LocalCounter> - <LocalCounter worker="2">12137521</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>19148562</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="4"> - <LocalCounter worker="0">3973366</LocalCounter> - <LocalCounter worker="1">3973543</LocalCounter> - <LocalCounter worker="2">5643661</LocalCounter> - <LocalCounter worker="3">5644098</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>19234668</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="5"> - <LocalCounter worker="0">3605358</LocalCounter> - <LocalCounter worker="1">3605432</LocalCounter> - <LocalCounter worker="2">5184535</LocalCounter> - <LocalCounter worker="3">5184801</LocalCounter> - <LocalCounter worker="4">1514959</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>19095085</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="6"> - <LocalCounter worker="0">3062204</LocalCounter> - <LocalCounter worker="1">3061638</LocalCounter> - <LocalCounter worker="2">2657329</LocalCounter> - <LocalCounter worker="3">2657997</LocalCounter> - <LocalCounter worker="4">3694149</LocalCounter> - <LocalCounter worker="5">3693569</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>18826886</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="7"> - <LocalCounter worker="0">1413952</LocalCounter> - <LocalCounter worker="1">1413322</LocalCounter> - <LocalCounter worker="2">5634774</LocalCounter> - <LocalCounter worker="3">5634907</LocalCounter> - <LocalCounter worker="4">807079</LocalCounter> - <LocalCounter worker="5">806823</LocalCounter> - <LocalCounter worker="6">2780299</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>18491156</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="8"> - <LocalCounter worker="0">2266504</LocalCounter> - <LocalCounter worker="1">2264023</LocalCounter> - <LocalCounter worker="2">2150464</LocalCounter> - <LocalCounter worker="3">2152501</LocalCounter> - <LocalCounter worker="4">2234184</LocalCounter> - <LocalCounter worker="5">2235885</LocalCounter> - <LocalCounter worker="6">2045159</LocalCounter> - <LocalCounter worker="7">2042094</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>17390814</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="9"> - <LocalCounter worker="0">378978</LocalCounter> - <LocalCounter worker="1">493897</LocalCounter> - <LocalCounter worker="2">540956</LocalCounter> - <LocalCounter worker="3">307717</LocalCounter> - <LocalCounter worker="4">559266</LocalCounter> - <LocalCounter worker="5">435771</LocalCounter> - <LocalCounter worker="6">289002</LocalCounter> - <LocalCounter worker="7">524768</LocalCounter> - <LocalCounter worker="8">904</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3531259</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="10"> - <LocalCounter worker="0">315240</LocalCounter> - <LocalCounter worker="1">314639</LocalCounter> - <LocalCounter worker="2">343225</LocalCounter> - <LocalCounter worker="3">343430</LocalCounter> - <LocalCounter worker="4">330617</LocalCounter> - <LocalCounter worker="5">273430</LocalCounter> - <LocalCounter worker="6">114457</LocalCounter> - <LocalCounter worker="7">400594</LocalCounter> - <LocalCounter worker="8">199708</LocalCounter> - <LocalCounter worker="9">398954</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3034294</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="11"> - <LocalCounter worker="0">398649</LocalCounter> - <LocalCounter worker="1">243725</LocalCounter> - <LocalCounter worker="2">313197</LocalCounter> - <LocalCounter worker="3">341559</LocalCounter> - <LocalCounter worker="4">400879</LocalCounter> - <LocalCounter worker="5">485957</LocalCounter> - <LocalCounter worker="6">256149</LocalCounter> - <LocalCounter worker="7">312463</LocalCounter> - <LocalCounter worker="8">79929</LocalCounter> - <LocalCounter worker="9">79959</LocalCounter> - <LocalCounter worker="10">61</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2912527</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="12"> - <LocalCounter worker="0">200097</LocalCounter> - <LocalCounter worker="1">314280</LocalCounter> - <LocalCounter worker="2">484541</LocalCounter> - <LocalCounter worker="3">400413</LocalCounter> - <LocalCounter worker="4">187776</LocalCounter> - <LocalCounter worker="5">244998</LocalCounter> - <LocalCounter worker="6">244859</LocalCounter> - <LocalCounter worker="7">330577</LocalCounter> - <LocalCounter worker="8">159931</LocalCounter> - <LocalCounter worker="9">122121</LocalCounter> - <LocalCounter worker="10">159973</LocalCounter> - <LocalCounter worker="11">199451</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3049017</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="13"> - <LocalCounter worker="0">104</LocalCounter> - <LocalCounter worker="1">145</LocalCounter> - <LocalCounter worker="2">209</LocalCounter> - <LocalCounter worker="3">169</LocalCounter> - <LocalCounter worker="4">206</LocalCounter> - <LocalCounter worker="5">120</LocalCounter> - <LocalCounter worker="6">166</LocalCounter> - <LocalCounter worker="7">188</LocalCounter> - <LocalCounter worker="8">798353</LocalCounter> - <LocalCounter worker="9">639101</LocalCounter> - <LocalCounter worker="10">1237960</LocalCounter> - <LocalCounter worker="11">840661</LocalCounter> - <LocalCounter worker="12">439274</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3956656</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="14"> - <LocalCounter worker="0">80</LocalCounter> - <LocalCounter worker="1">111</LocalCounter> - <LocalCounter worker="2">119</LocalCounter> - <LocalCounter worker="3">149</LocalCounter> - <LocalCounter worker="4">169</LocalCounter> - <LocalCounter worker="5">117</LocalCounter> - <LocalCounter worker="6">126</LocalCounter> - <LocalCounter worker="7">139</LocalCounter> - <LocalCounter worker="8">574829</LocalCounter> - <LocalCounter worker="9">803988</LocalCounter> - <LocalCounter worker="10">370549</LocalCounter> - <LocalCounter worker="11">846318</LocalCounter> - <LocalCounter worker="12">608269</LocalCounter> - <LocalCounter worker="13">608119</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3813082</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="15"> - <LocalCounter worker="0">8</LocalCounter> - <LocalCounter worker="1">20</LocalCounter> - <LocalCounter worker="2">34</LocalCounter> - <LocalCounter worker="3">65</LocalCounter> - <LocalCounter worker="4">84</LocalCounter> - <LocalCounter worker="5">38</LocalCounter> - <LocalCounter worker="6">60</LocalCounter> - <LocalCounter worker="7">95</LocalCounter> - <LocalCounter worker="8">482715</LocalCounter> - <LocalCounter worker="9">607538</LocalCounter> - <LocalCounter worker="10">482392</LocalCounter> - <LocalCounter worker="11">667855</LocalCounter> - <LocalCounter worker="12">409336</LocalCounter> - <LocalCounter worker="13">630426</LocalCounter> - <LocalCounter worker="14">408163</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3688829</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="16"> - <LocalCounter worker="0">117285</LocalCounter> - <LocalCounter worker="1">117670</LocalCounter> - <LocalCounter worker="2">117122</LocalCounter> - <LocalCounter worker="3">116813</LocalCounter> - <LocalCounter worker="4">117713</LocalCounter> - <LocalCounter worker="5">117774</LocalCounter> - <LocalCounter worker="6">117459</LocalCounter> - <LocalCounter worker="7">117328</LocalCounter> - <LocalCounter worker="8">303833</LocalCounter> - <LocalCounter worker="9">326784</LocalCounter> - <LocalCounter worker="10">277325</LocalCounter> - <LocalCounter worker="11">373516</LocalCounter> - <LocalCounter worker="12">263215</LocalCounter> - <LocalCounter worker="13">390871</LocalCounter> - <LocalCounter worker="14">446935</LocalCounter> - <LocalCounter worker="15">301501</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3623144</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="17"> - <LocalCounter worker="0">341558</LocalCounter> - <LocalCounter worker="1">231787</LocalCounter> - <LocalCounter worker="2">347677</LocalCounter> - <LocalCounter worker="3">218478</LocalCounter> - <LocalCounter worker="4">303719</LocalCounter> - <LocalCounter worker="5">154437</LocalCounter> - <LocalCounter worker="6">229631</LocalCounter> - <LocalCounter worker="7">216461</LocalCounter> - <LocalCounter worker="8">123537</LocalCounter> - <LocalCounter worker="9">103366</LocalCounter> - <LocalCounter worker="10">55161</LocalCounter> - <LocalCounter worker="11">90025</LocalCounter> - <LocalCounter worker="12">84691</LocalCounter> - <LocalCounter worker="13">68924</LocalCounter> - <LocalCounter worker="14">53786</LocalCounter> - <LocalCounter worker="15">190767</LocalCounter> - <LocalCounter worker="16">986</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2814991</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="18"> - <LocalCounter worker="0">200069</LocalCounter> - <LocalCounter worker="1">264598</LocalCounter> - <LocalCounter worker="2">170182</LocalCounter> - <LocalCounter worker="3">138554</LocalCounter> - <LocalCounter worker="4">102824</LocalCounter> - <LocalCounter worker="5">175867</LocalCounter> - <LocalCounter worker="6">284187</LocalCounter> - <LocalCounter worker="7">164345</LocalCounter> - <LocalCounter worker="8">233732</LocalCounter> - <LocalCounter worker="9">178177</LocalCounter> - <LocalCounter worker="10">140189</LocalCounter> - <LocalCounter worker="11">153958</LocalCounter> - <LocalCounter worker="12">123252</LocalCounter> - <LocalCounter worker="13">227322</LocalCounter> - <LocalCounter worker="14">194095</LocalCounter> - <LocalCounter worker="15">54981</LocalCounter> - <LocalCounter worker="16">1079</LocalCounter> - <LocalCounter worker="17">1026</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2808437</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="19"> - <LocalCounter worker="0">321115</LocalCounter> - <LocalCounter worker="1">371397</LocalCounter> - <LocalCounter worker="2">225899</LocalCounter> - <LocalCounter worker="3">354262</LocalCounter> - <LocalCounter worker="4">361476</LocalCounter> - <LocalCounter worker="5">350114</LocalCounter> - <LocalCounter worker="6">291933</LocalCounter> - <LocalCounter worker="7">196999</LocalCounter> - <LocalCounter worker="8">22397</LocalCounter> - <LocalCounter worker="9">25153</LocalCounter> - <LocalCounter worker="10">102182</LocalCounter> - <LocalCounter worker="11">21372</LocalCounter> - <LocalCounter worker="12">70582</LocalCounter> - <LocalCounter worker="13">29948</LocalCounter> - <LocalCounter worker="14">18969</LocalCounter> - <LocalCounter worker="15">57177</LocalCounter> - <LocalCounter worker="16">477</LocalCounter> - <LocalCounter worker="17">391</LocalCounter> - <LocalCounter worker="18">916</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2822759</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="20"> - <LocalCounter worker="0">393436</LocalCounter> - <LocalCounter worker="1">309283</LocalCounter> - <LocalCounter worker="2">168529</LocalCounter> - <LocalCounter worker="3">224983</LocalCounter> - <LocalCounter worker="4">196844</LocalCounter> - <LocalCounter worker="5">140974</LocalCounter> - <LocalCounter worker="6">197196</LocalCounter> - <LocalCounter worker="7">84830</LocalCounter> - <LocalCounter worker="8">111946</LocalCounter> - <LocalCounter worker="9">111914</LocalCounter> - <LocalCounter worker="10">112325</LocalCounter> - <LocalCounter worker="11">112014</LocalCounter> - <LocalCounter worker="12">168007</LocalCounter> - <LocalCounter worker="13">111972</LocalCounter> - <LocalCounter worker="14">112201</LocalCounter> - <LocalCounter worker="15">252562</LocalCounter> - <LocalCounter worker="16">49</LocalCounter> - <LocalCounter worker="17">41</LocalCounter> - <LocalCounter worker="18">37</LocalCounter> - <LocalCounter worker="19">44</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2809187</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="21"> - <LocalCounter worker="0">183153</LocalCounter> - <LocalCounter worker="1">263091</LocalCounter> - <LocalCounter worker="2">196238</LocalCounter> - <LocalCounter worker="3">56135</LocalCounter> - <LocalCounter worker="4">252253</LocalCounter> - <LocalCounter worker="5">112377</LocalCounter> - <LocalCounter worker="6">168624</LocalCounter> - <LocalCounter worker="7">252596</LocalCounter> - <LocalCounter worker="8">195948</LocalCounter> - <LocalCounter worker="9">43703</LocalCounter> - <LocalCounter worker="10">140073</LocalCounter> - <LocalCounter worker="11">223721</LocalCounter> - <LocalCounter worker="12">251924</LocalCounter> - <LocalCounter worker="13">169611</LocalCounter> - <LocalCounter worker="14">112360</LocalCounter> - <LocalCounter worker="15">168176</LocalCounter> - <LocalCounter worker="16">41</LocalCounter> - <LocalCounter worker="17">14</LocalCounter> - <LocalCounter worker="18">29</LocalCounter> - <LocalCounter worker="19">41</LocalCounter> - <LocalCounter worker="20">41</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2790149</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="22"> - <LocalCounter worker="0">84315</LocalCounter> - <LocalCounter worker="1">168428</LocalCounter> - <LocalCounter worker="2">56084</LocalCounter> - <LocalCounter worker="3">280784</LocalCounter> - <LocalCounter worker="4">160642</LocalCounter> - <LocalCounter worker="5">195812</LocalCounter> - <LocalCounter worker="6">224182</LocalCounter> - <LocalCounter worker="7">112335</LocalCounter> - <LocalCounter worker="8">223416</LocalCounter> - <LocalCounter worker="9">279221</LocalCounter> - <LocalCounter worker="10">223306</LocalCounter> - <LocalCounter worker="11">195550</LocalCounter> - <LocalCounter worker="12">83826</LocalCounter> - <LocalCounter worker="13">83644</LocalCounter> - <LocalCounter worker="14">153478</LocalCounter> - <LocalCounter worker="15">251574</LocalCounter> - <LocalCounter worker="16">31</LocalCounter> - <LocalCounter worker="17">17</LocalCounter> - <LocalCounter worker="18">26</LocalCounter> - <LocalCounter worker="19">27</LocalCounter> - <LocalCounter worker="20">31</LocalCounter> - <LocalCounter worker="21">22</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2776751</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="23"> - <LocalCounter worker="0">251094</LocalCounter> - <LocalCounter worker="1">111612</LocalCounter> - <LocalCounter worker="2">111946</LocalCounter> - <LocalCounter worker="3">250878</LocalCounter> - <LocalCounter worker="4">270360</LocalCounter> - <LocalCounter worker="5">83918</LocalCounter> - <LocalCounter worker="6">167667</LocalCounter> - <LocalCounter worker="7">251032</LocalCounter> - <LocalCounter worker="8">201670</LocalCounter> - <LocalCounter worker="9">195227</LocalCounter> - <LocalCounter worker="10">167446</LocalCounter> - <LocalCounter worker="11">194880</LocalCounter> - <LocalCounter worker="12">194852</LocalCounter> - <LocalCounter worker="13">83768</LocalCounter> - <LocalCounter worker="14">160169</LocalCounter> - <LocalCounter worker="15">83658</LocalCounter> - <LocalCounter worker="16">141</LocalCounter> - <LocalCounter worker="17">133</LocalCounter> - <LocalCounter worker="18">122</LocalCounter> - <LocalCounter worker="19">117</LocalCounter> - <LocalCounter worker="20">136</LocalCounter> - <LocalCounter worker="21">115</LocalCounter> - <LocalCounter worker="22">104</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2781045</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTASLockWithLocalCounter activeWorker="24"> - <LocalCounter worker="0">132034</LocalCounter> - <LocalCounter worker="1">131676</LocalCounter> - <LocalCounter worker="2">132311</LocalCounter> - <LocalCounter worker="3">131443</LocalCounter> - <LocalCounter worker="4">132250</LocalCounter> - <LocalCounter worker="5">131733</LocalCounter> - <LocalCounter worker="6">131193</LocalCounter> - <LocalCounter worker="7">131281</LocalCounter> - <LocalCounter worker="8">122650</LocalCounter> - <LocalCounter worker="9">123113</LocalCounter> - <LocalCounter worker="10">123745</LocalCounter> - <LocalCounter worker="11">123264</LocalCounter> - <LocalCounter worker="12">123158</LocalCounter> - <LocalCounter worker="13">122764</LocalCounter> - <LocalCounter worker="14">123050</LocalCounter> - <LocalCounter worker="15">123616</LocalCounter> - <LocalCounter worker="16">122054</LocalCounter> - <LocalCounter worker="17">122876</LocalCounter> - <LocalCounter worker="18">122080</LocalCounter> - <LocalCounter worker="19">121904</LocalCounter> - <LocalCounter worker="20">122223</LocalCounter> - <LocalCounter worker="21">122088</LocalCounter> - <LocalCounter worker="22">121899</LocalCounter> - <LocalCounter worker="23">122670</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3017075</SumOfLocalCounter> - </GlobalTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="1"> - <LocalCounter worker="0">19645977</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>19645977</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="2"> - <LocalCounter worker="0">4310217</LocalCounter> - <LocalCounter worker="1">15293675</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>19603892</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="3"> - <LocalCounter worker="0">9402863</LocalCounter> - <LocalCounter worker="1">9226207</LocalCounter> - <LocalCounter worker="2">437594</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>19066664</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="4"> - <LocalCounter worker="0">3386951</LocalCounter> - <LocalCounter worker="1">3201931</LocalCounter> - <LocalCounter worker="2">6304744</LocalCounter> - <LocalCounter worker="3">6305238</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>19198864</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="5"> - <LocalCounter worker="0">4092852</LocalCounter> - <LocalCounter worker="1">3899527</LocalCounter> - <LocalCounter worker="2">2520768</LocalCounter> - <LocalCounter worker="3">2175848</LocalCounter> - <LocalCounter worker="4">5948549</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>18637544</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="6"> - <LocalCounter worker="0">2597841</LocalCounter> - <LocalCounter worker="1">2443137</LocalCounter> - <LocalCounter worker="2">3331024</LocalCounter> - <LocalCounter worker="3">2708000</LocalCounter> - <LocalCounter worker="4">4093981</LocalCounter> - <LocalCounter worker="5">3080494</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>18254477</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="7"> - <LocalCounter worker="0">1216614</LocalCounter> - <LocalCounter worker="1">2258952</LocalCounter> - <LocalCounter worker="2">1291063</LocalCounter> - <LocalCounter worker="3">1114575</LocalCounter> - <LocalCounter worker="4">5532606</LocalCounter> - <LocalCounter worker="5">5466345</LocalCounter> - <LocalCounter worker="6">1405693</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>18285848</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="8"> - <LocalCounter worker="0">2086492</LocalCounter> - <LocalCounter worker="1">2244683</LocalCounter> - <LocalCounter worker="2">2112130</LocalCounter> - <LocalCounter worker="3">2067114</LocalCounter> - <LocalCounter worker="4">2081711</LocalCounter> - <LocalCounter worker="5">2090180</LocalCounter> - <LocalCounter worker="6">2168032</LocalCounter> - <LocalCounter worker="7">2534478</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>17384820</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="9"> - <LocalCounter worker="0">634132</LocalCounter> - <LocalCounter worker="1">601192</LocalCounter> - <LocalCounter worker="2">480382</LocalCounter> - <LocalCounter worker="3">657643</LocalCounter> - <LocalCounter worker="4">592079</LocalCounter> - <LocalCounter worker="5">740174</LocalCounter> - <LocalCounter worker="6">465043</LocalCounter> - <LocalCounter worker="7">642726</LocalCounter> - <LocalCounter worker="8">3226</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>4816597</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="10"> - <LocalCounter worker="0">142972</LocalCounter> - <LocalCounter worker="1">387723</LocalCounter> - <LocalCounter worker="2">457567</LocalCounter> - <LocalCounter worker="3">302196</LocalCounter> - <LocalCounter worker="4">314638</LocalCounter> - <LocalCounter worker="5">457645</LocalCounter> - <LocalCounter worker="6">371900</LocalCounter> - <LocalCounter worker="7">428999</LocalCounter> - <LocalCounter worker="8">691</LocalCounter> - <LocalCounter worker="9">362</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2864693</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="11"> - <LocalCounter worker="0">355770</LocalCounter> - <LocalCounter worker="1">383778</LocalCounter> - <LocalCounter worker="2">369646</LocalCounter> - <LocalCounter worker="3">256341</LocalCounter> - <LocalCounter worker="4">327558</LocalCounter> - <LocalCounter worker="5">242178</LocalCounter> - <LocalCounter worker="6">398681</LocalCounter> - <LocalCounter worker="7">483955</LocalCounter> - <LocalCounter worker="8">176</LocalCounter> - <LocalCounter worker="9">201</LocalCounter> - <LocalCounter worker="10">67</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2818351</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="12"> - <LocalCounter worker="0">457238</LocalCounter> - <LocalCounter worker="1">142885</LocalCounter> - <LocalCounter worker="2">416308</LocalCounter> - <LocalCounter worker="3">318737</LocalCounter> - <LocalCounter worker="4">371610</LocalCounter> - <LocalCounter worker="5">228382</LocalCounter> - <LocalCounter worker="6">429095</LocalCounter> - <LocalCounter worker="7">502040</LocalCounter> - <LocalCounter worker="8">160</LocalCounter> - <LocalCounter worker="9">115</LocalCounter> - <LocalCounter worker="10">191</LocalCounter> - <LocalCounter worker="11">108</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2866869</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="13"> - <LocalCounter worker="0">155562</LocalCounter> - <LocalCounter worker="1">155271</LocalCounter> - <LocalCounter worker="2">154524</LocalCounter> - <LocalCounter worker="3">155620</LocalCounter> - <LocalCounter worker="4">155737</LocalCounter> - <LocalCounter worker="5">155945</LocalCounter> - <LocalCounter worker="6">156319</LocalCounter> - <LocalCounter worker="7">155596</LocalCounter> - <LocalCounter worker="8">526245</LocalCounter> - <LocalCounter worker="9">524881</LocalCounter> - <LocalCounter worker="10">495452</LocalCounter> - <LocalCounter worker="11">497374</LocalCounter> - <LocalCounter worker="12">586585</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3875111</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="14"> - <LocalCounter worker="0">862</LocalCounter> - <LocalCounter worker="1">739</LocalCounter> - <LocalCounter worker="2">902</LocalCounter> - <LocalCounter worker="3">876</LocalCounter> - <LocalCounter worker="4">922</LocalCounter> - <LocalCounter worker="5">881</LocalCounter> - <LocalCounter worker="6">877</LocalCounter> - <LocalCounter worker="7">945</LocalCounter> - <LocalCounter worker="8">798225</LocalCounter> - <LocalCounter worker="9">545250</LocalCounter> - <LocalCounter worker="10">758729</LocalCounter> - <LocalCounter worker="11">466001</LocalCounter> - <LocalCounter worker="12">638255</LocalCounter> - <LocalCounter worker="13">660193</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3873657</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="15"> - <LocalCounter worker="0">198289</LocalCounter> - <LocalCounter worker="1">203179</LocalCounter> - <LocalCounter worker="2">199945</LocalCounter> - <LocalCounter worker="3">199124</LocalCounter> - <LocalCounter worker="4">201799</LocalCounter> - <LocalCounter worker="5">199812</LocalCounter> - <LocalCounter worker="6">199839</LocalCounter> - <LocalCounter worker="7">199732</LocalCounter> - <LocalCounter worker="8">314842</LocalCounter> - <LocalCounter worker="9">291197</LocalCounter> - <LocalCounter worker="10">294608</LocalCounter> - <LocalCounter worker="11">286440</LocalCounter> - <LocalCounter worker="12">375388</LocalCounter> - <LocalCounter worker="13">316600</LocalCounter> - <LocalCounter worker="14">354856</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3835650</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="16"> - <LocalCounter worker="0">104577</LocalCounter> - <LocalCounter worker="1">489911</LocalCounter> - <LocalCounter worker="2">466186</LocalCounter> - <LocalCounter worker="3">366690</LocalCounter> - <LocalCounter worker="4">252721</LocalCounter> - <LocalCounter worker="5">460887</LocalCounter> - <LocalCounter worker="6">253823</LocalCounter> - <LocalCounter worker="7">113506</LocalCounter> - <LocalCounter worker="8">120249</LocalCounter> - <LocalCounter worker="9">46275</LocalCounter> - <LocalCounter worker="10">159071</LocalCounter> - <LocalCounter worker="11">83449</LocalCounter> - <LocalCounter worker="12">177618</LocalCounter> - <LocalCounter worker="13">120903</LocalCounter> - <LocalCounter worker="14">191314</LocalCounter> - <LocalCounter worker="15">263287</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>3670467</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="17"> - <LocalCounter worker="0">234559</LocalCounter> - <LocalCounter worker="1">118245</LocalCounter> - <LocalCounter worker="2">219127</LocalCounter> - <LocalCounter worker="3">295109</LocalCounter> - <LocalCounter worker="4">248960</LocalCounter> - <LocalCounter worker="5">181934</LocalCounter> - <LocalCounter worker="6">297815</LocalCounter> - <LocalCounter worker="7">322059</LocalCounter> - <LocalCounter worker="8">163004</LocalCounter> - <LocalCounter worker="9">174212</LocalCounter> - <LocalCounter worker="10">26569</LocalCounter> - <LocalCounter worker="11">77433</LocalCounter> - <LocalCounter worker="12">133062</LocalCounter> - <LocalCounter worker="13">232843</LocalCounter> - <LocalCounter worker="14">33886</LocalCounter> - <LocalCounter worker="15">82456</LocalCounter> - <LocalCounter worker="16">4914</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2846187</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="18"> - <LocalCounter worker="0">271262</LocalCounter> - <LocalCounter worker="1">355312</LocalCounter> - <LocalCounter worker="2">50921</LocalCounter> - <LocalCounter worker="3">148825</LocalCounter> - <LocalCounter worker="4">245230</LocalCounter> - <LocalCounter worker="5">182256</LocalCounter> - <LocalCounter worker="6">187273</LocalCounter> - <LocalCounter worker="7">255451</LocalCounter> - <LocalCounter worker="8">185514</LocalCounter> - <LocalCounter worker="9">44729</LocalCounter> - <LocalCounter worker="10">112757</LocalCounter> - <LocalCounter worker="11">98411</LocalCounter> - <LocalCounter worker="12">207969</LocalCounter> - <LocalCounter worker="13">185668</LocalCounter> - <LocalCounter worker="14">172032</LocalCounter> - <LocalCounter worker="15">109135</LocalCounter> - <LocalCounter worker="16">2423</LocalCounter> - <LocalCounter worker="17">2380</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2817548</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="19"> - <LocalCounter worker="0">261804</LocalCounter> - <LocalCounter worker="1">234937</LocalCounter> - <LocalCounter worker="2">211116</LocalCounter> - <LocalCounter worker="3">198275</LocalCounter> - <LocalCounter worker="4">153636</LocalCounter> - <LocalCounter worker="5">353607</LocalCounter> - <LocalCounter worker="6">368351</LocalCounter> - <LocalCounter worker="7">369817</LocalCounter> - <LocalCounter worker="8">117702</LocalCounter> - <LocalCounter worker="9">41853</LocalCounter> - <LocalCounter worker="10">75374</LocalCounter> - <LocalCounter worker="11">125194</LocalCounter> - <LocalCounter worker="12">87239</LocalCounter> - <LocalCounter worker="13">58610</LocalCounter> - <LocalCounter worker="14">63622</LocalCounter> - <LocalCounter worker="15">96700</LocalCounter> - <LocalCounter worker="16">1021</LocalCounter> - <LocalCounter worker="17">966</LocalCounter> - <LocalCounter worker="18">985</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2820809</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="20"> - <LocalCounter worker="0">251976</LocalCounter> - <LocalCounter worker="1">118001</LocalCounter> - <LocalCounter worker="2">84641</LocalCounter> - <LocalCounter worker="3">140476</LocalCounter> - <LocalCounter worker="4">77669</LocalCounter> - <LocalCounter worker="5">274047</LocalCounter> - <LocalCounter worker="6">318570</LocalCounter> - <LocalCounter worker="7">170363</LocalCounter> - <LocalCounter worker="8">252676</LocalCounter> - <LocalCounter worker="9">140874</LocalCounter> - <LocalCounter worker="10">189186</LocalCounter> - <LocalCounter worker="11">121034</LocalCounter> - <LocalCounter worker="12">161358</LocalCounter> - <LocalCounter worker="13">165381</LocalCounter> - <LocalCounter worker="14">141826</LocalCounter> - <LocalCounter worker="15">205937</LocalCounter> - <LocalCounter worker="16">118</LocalCounter> - <LocalCounter worker="17">77</LocalCounter> - <LocalCounter worker="18">70</LocalCounter> - <LocalCounter worker="19">94</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2814374</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="21"> - <LocalCounter worker="0">84213</LocalCounter> - <LocalCounter worker="1">196158</LocalCounter> - <LocalCounter worker="2">196680</LocalCounter> - <LocalCounter worker="3">112159</LocalCounter> - <LocalCounter worker="4">224637</LocalCounter> - <LocalCounter worker="5">252342</LocalCounter> - <LocalCounter worker="6">140314</LocalCounter> - <LocalCounter worker="7">84179</LocalCounter> - <LocalCounter worker="8">223626</LocalCounter> - <LocalCounter worker="9">196078</LocalCounter> - <LocalCounter worker="10">111882</LocalCounter> - <LocalCounter worker="11">238331</LocalCounter> - <LocalCounter worker="12">252259</LocalCounter> - <LocalCounter worker="13">195491</LocalCounter> - <LocalCounter worker="14">83883</LocalCounter> - <LocalCounter worker="15">195126</LocalCounter> - <LocalCounter worker="16">52</LocalCounter> - <LocalCounter worker="17">26</LocalCounter> - <LocalCounter worker="18">35</LocalCounter> - <LocalCounter worker="19">44</LocalCounter> - <LocalCounter worker="20">41</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2787556</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="22"> - <LocalCounter worker="0">31503</LocalCounter> - <LocalCounter worker="1">252623</LocalCounter> - <LocalCounter worker="2">196406</LocalCounter> - <LocalCounter worker="3">168591</LocalCounter> - <LocalCounter worker="4">140544</LocalCounter> - <LocalCounter worker="5">168154</LocalCounter> - <LocalCounter worker="6">280249</LocalCounter> - <LocalCounter worker="7">168483</LocalCounter> - <LocalCounter worker="8">195559</LocalCounter> - <LocalCounter worker="9">55718</LocalCounter> - <LocalCounter worker="10">139401</LocalCounter> - <LocalCounter worker="11">251481</LocalCounter> - <LocalCounter worker="12">222605</LocalCounter> - <LocalCounter worker="13">111214</LocalCounter> - <LocalCounter worker="14">139519</LocalCounter> - <LocalCounter worker="15">251258</LocalCounter> - <LocalCounter worker="16">46</LocalCounter> - <LocalCounter worker="17">26</LocalCounter> - <LocalCounter worker="18">31</LocalCounter> - <LocalCounter worker="19">39</LocalCounter> - <LocalCounter worker="20">39</LocalCounter> - <LocalCounter worker="21">41</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2773530</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="23"> - <LocalCounter worker="0">139311</LocalCounter> - <LocalCounter worker="1">167336</LocalCounter> - <LocalCounter worker="2">278426</LocalCounter> - <LocalCounter worker="3">55951</LocalCounter> - <LocalCounter worker="4">139626</LocalCounter> - <LocalCounter worker="5">250691</LocalCounter> - <LocalCounter worker="6">223121</LocalCounter> - <LocalCounter worker="7">83809</LocalCounter> - <LocalCounter worker="8">194537</LocalCounter> - <LocalCounter worker="9">278533</LocalCounter> - <LocalCounter worker="10">139061</LocalCounter> - <LocalCounter worker="11">223216</LocalCounter> - <LocalCounter worker="12">194994</LocalCounter> - <LocalCounter worker="13">111343</LocalCounter> - <LocalCounter worker="14">186244</LocalCounter> - <LocalCounter worker="15">111364</LocalCounter> - <LocalCounter worker="16">142</LocalCounter> - <LocalCounter worker="17">126</LocalCounter> - <LocalCounter worker="18">121</LocalCounter> - <LocalCounter worker="19">122</LocalCounter> - <LocalCounter worker="20">124</LocalCounter> - <LocalCounter worker="21">125</LocalCounter> - <LocalCounter worker="22">124</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2778447</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> - <GlobalTTASLockWithLocalCounter activeWorker="24"> - <LocalCounter worker="0">127539</LocalCounter> - <LocalCounter worker="1">128004</LocalCounter> - <LocalCounter worker="2">127243</LocalCounter> - <LocalCounter worker="3">128231</LocalCounter> - <LocalCounter worker="4">128122</LocalCounter> - <LocalCounter worker="5">127956</LocalCounter> - <LocalCounter worker="6">128394</LocalCounter> - <LocalCounter worker="7">128093</LocalCounter> - <LocalCounter worker="8">121225</LocalCounter> - <LocalCounter worker="9">120770</LocalCounter> - <LocalCounter worker="10">120549</LocalCounter> - <LocalCounter worker="11">120785</LocalCounter> - <LocalCounter worker="12">120461</LocalCounter> - <LocalCounter worker="13">120591</LocalCounter> - <LocalCounter worker="14">121214</LocalCounter> - <LocalCounter worker="15">120733</LocalCounter> - <LocalCounter worker="16">120387</LocalCounter> - <LocalCounter worker="17">121153</LocalCounter> - <LocalCounter worker="18">121255</LocalCounter> - <LocalCounter worker="19">120737</LocalCounter> - <LocalCounter worker="20">120859</LocalCounter> - <LocalCounter worker="21">121071</LocalCounter> - <LocalCounter worker="22">121031</LocalCounter> - <LocalCounter worker="23">121163</LocalCounter> - <GlobalCounter>0</GlobalCounter> - <SumOfLocalCounter>2957566</SumOfLocalCounter> - </GlobalTTASLockWithLocalCounter> -</SMPLock01> +*** TEST VERSION: 6.0.0.90c8934179f2ba4c042caa95b3473d37835bed80 +*** TEST STATE: EXPECTED_PASS +*** TEST BUILD: RTEMS_SMP +*** TEST TOOLS: 13.2.0 20230727 (RTEMS 6, RSB d3d738c35a71ca05f675b188539225099401ac79, Newlib a021448) +*** BEGIN OF JSON DATA *** +[ + { + "lock-type": "Ticket Lock", + "lock-object": "global", + "section-type": "local counter", + "results": [ + { + "counter": [1385097], + "global-counter": 0, + "sum-of-local-counter": 1385097 + }, { + "counter": [997876, 997974], + "global-counter": 0, + "sum-of-local-counter": 1995850 + }, { + "counter": [998024, 998123, 998123], + "global-counter": 0, + "sum-of-local-counter": 2994270 + }, { + "counter": [997988, 998086, 998086, 998086], + "global-counter": 0, + "sum-of-local-counter": 3992246 + } + ] + }, { + "lock-type": "MCS Lock", + "lock-object": "global", + "section-type": "local counter", + "results": [ + { + "counter": [1512045], + "global-counter": 0, + "sum-of-local-counter": 1512045 + }, { + "counter": [997877, 997878], + "global-counter": 0, + "sum-of-local-counter": 1995755 + }, { + "counter": [998023, 998122, 998122], + "global-counter": 0, + "sum-of-local-counter": 2994267 + }, { + "counter": [997987, 998086, 998086, 998086], + "global-counter": 0, + "sum-of-local-counter": 3992245 + } + ] + }, { + "lock-type": "Ticket Lock", + "lock-object": "global", + "section-type": "global counter", + "results": [ + { + "counter": [997921, 997945, 997945, 997945], + "global-counter": 3991756, + "sum-of-local-counter": 3991756 + } + ] + }, { + "lock-type": "MCS Lock", + "lock-object": "global", + "section-type": "global counter", + "results": [ + { + "counter": [527090, 527096, 527096, 527096], + "global-counter": 2108378, + "sum-of-local-counter": 2108378 + } + ] + }, { + "lock-type": "Ticket Lock", + "lock-object": "local", + "section-type": "local counter", + "results": [ + { + "counter": [1385769], + "global-counter": 0, + "sum-of-local-counter": 1385769 + }, { + "counter": [1385995, 1387328], + "global-counter": 0, + "sum-of-local-counter": 2773323 + }, { + "counter": [1386191, 1387525, 1387526], + "global-counter": 0, + "sum-of-local-counter": 4161242 + }, { + "counter": [1386136, 1387468, 1387470, 1387407], + "global-counter": 0, + "sum-of-local-counter": 5548481 + } + ] + }, { + "lock-type": "MCS Lock", + "lock-object": "local", + "section-type": "local counter", + "results": [ + { + "counter": [1512021], + "global-counter": 0, + "sum-of-local-counter": 1512021 + }, { + "counter": [1511993, 1513445], + "global-counter": 0, + "sum-of-local-counter": 3025438 + }, { + "counter": [1512208, 1513656, 1513656], + "global-counter": 0, + "sum-of-local-counter": 4539520 + }, { + "counter": [1512149, 1513595, 1513595, 1513533], + "global-counter": 0, + "sum-of-local-counter": 6052872 + } + ] + }, { + "lock-type": "Ticket Lock", + "lock-object": "local", + "section-type": "global counter", + "results": [ + { + "counter": [1160403, 1161527, 1161527, 1161469], + "global-counter": 3727827, + "sum-of-local-counter": 4644926 + } + ] + }, { + "lock-type": "MCS Lock", + "lock-object": "local", + "section-type": "global counter", + "results": [ + { + "counter": [1247164, 1248373, 1248373, 1248313], + "global-counter": 3876384, + "sum-of-local-counter": 4992223 + } + ] + }, { + "lock-type": "Ticket Lock", + "lock-object": "global", + "section-type": "busy loop", + "results": [ + { + "counter": [39932, 39932, 39932, 39932], + "global-counter": 0, + "sum-of-local-counter": 159728 + } + ] + }, { + "lock-type": "MCS Lock", + "lock-object": "global", + "section-type": "busy loop", + "results": [ + { + "counter": [39934, 39935, 39934, 39934], + "global-counter": 0, + "sum-of-local-counter": 159737 + } + ] + }, { + "lock-type": "Sequence Lock", + "lock-object": "global", + "section-type": "two global counter", + "results": [ + { + "counter": [1847772, 666526, 666526, 666488], + "global-counter": 0, + "sum-of-local-counter": 3847312 + } + ] + }, { + "lock-type": "TAS Lock", + "lock-object": "global", + "section-type": "local counter", + "results": [ + { + "counter": [2934600], + "global-counter": 0, + "sum-of-local-counter": 2934600 + }, { + "counter": [2217444, 2219107], + "global-counter": 0, + "sum-of-local-counter": 4436551 + }, { + "counter": [1833240, 1836467, 1835261], + "global-counter": 0, + "sum-of-local-counter": 5504968 + }, { + "counter": [1652247, 1652937, 1653163, 1652725], + "global-counter": 0, + "sum-of-local-counter": 6611072 + } + ] + }, { + "lock-type": "TTAS Lock", + "lock-object": "global", + "section-type": "local counter", + "results": [ + { + "counter": [2935135], + "global-counter": 0, + "sum-of-local-counter": 2935135 + }, { + "counter": [1732426, 1758193], + "global-counter": 0, + "sum-of-local-counter": 3490619 + }, { + "counter": [1202763, 1204087, 1203894], + "global-counter": 0, + "sum-of-local-counter": 3610744 + }, { + "counter": [845721, 846759, 848543, 838946], + "global-counter": 0, + "sum-of-local-counter": 3379969 + } + ] + } +] +*** END OF JSON DATA *** + *** END OF TEST SMPLOCK 1 *** + +cpu 0 in error mode (tt = 0x80) + 1550147550 000091c0: 91d02000 ta 0x0 diff --git a/testsuites/smptests/smplock01/smplock01fair.py b/testsuites/smptests/smplock01/smplock01fair.py index 25dd7710f9..a3851ad4c6 100755 --- a/testsuites/smptests/smplock01/smplock01fair.py +++ b/testsuites/smptests/smplock01/smplock01fair.py @@ -1,9 +1,6 @@ -#!/usr/bin/env python - # SPDX-License-Identifier: BSD-2-Clause -# -# Copyright (c) 2016 embedded brains GmbH & Co. KG +# Copyright (C) 2016, 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 @@ -25,54 +22,50 @@ # 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. -# -import re -import libxml2 +import json import math +import re import statistics -from libxml2 import xmlNode -import matplotlib.pyplot as plt -data = open('smplock01.scn').read() -data = re.sub(r'\*\*\*.*\*\*\*', '', data) -doc = libxml2.parseDoc(data) -ctx = doc.xpathNewContext() +import matplotlib.pyplot as plt # type: ignore +from matplotlib import ticker # type: ignore + + +def _normed_coefficient_of_variation(counter: list[int]) -> float: + return (statistics.stdev(counter) / statistics.mean(counter)) / math.sqrt( + len(counter)) -plt.title('SMP Lock Fairness') -plt.xlabel('Active Workers') -plt.ylabel('Normed Coefficient of Variation') -i = 1 -ticket = [] -mcs = [] -tas = [] -ttas = [] +def _plot(data: dict) -> None: + _, axes = plt.subplots() + axes.set_title("SMP Lock Fairness") + axes.set_xlabel("Active Workers") + axes.set_ylabel("Normed Coefficient of Variation") + axes.set_yscale("symlog", linthresh=1e-6) + x = list(range(2, len(data[0]["results"]) + 1)) + axes.xaxis.set_major_locator(ticker.FixedLocator(x)) + for samples in data: + if samples["lock-object"] != "global": + continue + if samples["section-type"] != "local counter": + continue + y = [ + _normed_coefficient_of_variation(results["counter"]) + for results in samples["results"][1:] + ] + axes.plot(x, y, label=samples["lock-type"], marker="o") + axes.legend(loc="best") + plt.savefig("smplock01fair.png") + plt.savefig("smplock01fair.pdf") + plt.close() -def m(n): - return int(xmlNode.getContent(n)) -def normedCoefficientOfVariation(name, i): - y = map(m, ctx.xpathEval('/SMPLock01/' + name + '[@activeWorker=' + str(i) + ']/LocalCounter')) - if len(y) == 0: - raise - return (statistics.stdev(y) / statistics.mean(y)) / math.sqrt(len(y)) +_JSON_DATA = re.compile( + r"\*\*\* BEGIN OF JSON DATA \*\*\*(.*)" + r"\*\*\* END OF JSON DATA \*\*\*", re.DOTALL) -try: - while True: - i = i + 1 - ticket.append(normedCoefficientOfVariation('GlobalTicketLockWithLocalCounter', i)) - mcs.append(normedCoefficientOfVariation('GlobalMCSLockWithLocalCounter', i)) - tas.append(normedCoefficientOfVariation('GlobalTASLockWithLocalCounter', i)) - ttas.append(normedCoefficientOfVariation('GlobalTTASLockWithLocalCounter', i)) -except: - pass +with open("smplock01.scn", "r", encoding="utf-8") as src: + match = _JSON_DATA.search(src.read()) + data = json.loads(match.group(1)) -x = range(2, len(ticket) + 2) -plt.xticks(x) -plt.yscale('symlog', linthreshy = 1e-6) -plt.plot(x, ticket, label = 'Ticket Lock', marker = 'o') -plt.plot(x, mcs, label = 'MCS Lock', marker = 'o') -plt.plot(x, tas, label = 'TAS Lock', marker = 'o') -plt.plot(x, ttas, label = 'TTAS Lock', marker = 'o') -plt.legend(loc = 'best') -plt.show() +_plot(data) diff --git a/testsuites/smptests/smplock01/smplock01perf.py b/testsuites/smptests/smplock01/smplock01perf.py index d27db9b9fe..09c7fb10b4 100755 --- a/testsuites/smptests/smplock01/smplock01perf.py +++ b/testsuites/smptests/smplock01/smplock01perf.py @@ -1,9 +1,6 @@ -#!/usr/bin/env python - # SPDX-License-Identifier: BSD-2-Clause -# -# Copyright (c) 2016 embedded brains GmbH & Co. KG +# Copyright (C) 2016, 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 @@ -25,34 +22,39 @@ # 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. -# +import json import re -import libxml2 -from libxml2 import xmlNode -import matplotlib.pyplot as plt -data = open('smplock01.scn').read() -data = re.sub(r'\*\*\*.*\*\*\*', '', data) -doc = libxml2.parseDoc(data) -ctx = doc.xpathNewContext() - -plt.title('SMP Lock Performance') -plt.xlabel('Active Workers') -plt.ylabel('Operation Count') - -y = map(xmlNode.getContent, ctx.xpathEval('/SMPLock01/GlobalTicketLockWithLocalCounter/SumOfLocalCounter')) -x = range(1, len(y) + 1) -plt.xticks(x) -plt.plot(x, y, label = 'Ticket Lock', marker = 'o') - -y = map(xmlNode.getContent, ctx.xpathEval('/SMPLock01/GlobalMCSLockWithLocalCounter/SumOfLocalCounter')) -plt.plot(x, y, label = 'MCS Lock', marker = 'o') - -y = map(xmlNode.getContent, ctx.xpathEval('/SMPLock01/GlobalTASLockWithLocalCounter/SumOfLocalCounter')) -plt.plot(x, y, label = 'TAS Lock', marker = 'o') - -y = map(xmlNode.getContent, ctx.xpathEval('/SMPLock01/GlobalTTASLockWithLocalCounter/SumOfLocalCounter')) -plt.plot(x, y, label = 'TTAS Lock', marker = 'o') - -plt.legend(loc = 'best') -plt.show() +import matplotlib.pyplot as plt # type: ignore +from matplotlib import ticker # type: ignore + + +def _plot(data: dict) -> None: + _, axes = plt.subplots() + axes.set_title("SMP Lock Performance") + axes.set_xlabel("Active Workers") + axes.set_ylabel("Operation Count") + x = list(range(1, len(data[0]["results"]) + 1)) + axes.xaxis.set_major_locator(ticker.FixedLocator(x)) + for samples in data: + if samples["lock-object"] != "global": + continue + if samples["section-type"] != "local counter": + continue + y = [sum(results["counter"]) for results in samples["results"]] + axes.plot(x, y, label=samples["lock-type"], marker="o") + axes.legend(loc="best") + plt.savefig("smplock01perf.png") + plt.savefig("smplock01perf.pdf") + plt.close() + + +_JSON_DATA = re.compile( + r"\*\*\* BEGIN OF JSON DATA \*\*\*(.*)" + r"\*\*\* END OF JSON DATA \*\*\*", re.DOTALL) + +with open("smplock01.scn", "r", encoding="utf-8") as src: + match = _JSON_DATA.search(src.read()) + data = json.loads(match.group(1)) + +_plot(data) diff --git a/testsuites/smptests/smpmulticast01/init.c b/testsuites/smptests/smpmulticast01/init.c index ef8a1dbcb4..51a4624ea1 100644 --- a/testsuites/smptests/smpmulticast01/init.c +++ b/testsuites/smptests/smpmulticast01/init.c @@ -563,14 +563,16 @@ static void fatal_extension( bool ok; if (source == RTEMS_FATAL_SOURCE_SMP) { - T_step_eq_int(1, source, RTEMS_FATAL_SOURCE_SMP); - T_step_false(2, always_set_to_false, "unexpected argument value"); - T_step_eq_int(3, code, SMP_FATAL_WRONG_CPU_STATE_TO_PERFORM_JOBS); - T_case_end(); - - ok = T_run_finalize(); - rtems_test_assert(ok); - TEST_END(); + if (code != SMP_FATAL_SHUTDOWN_RESPONSE) { + T_step_eq_int(1, source, RTEMS_FATAL_SOURCE_SMP); + T_step_false(2, always_set_to_false, "unexpected argument value"); + T_step_eq_int(3, code, SMP_FATAL_WRONG_CPU_STATE_TO_PERFORM_JOBS); + T_case_end(); + + ok = T_run_finalize(); + rtems_test_assert(ok); + TEST_END(); + } } else if (source == RTEMS_FATAL_SOURCE_APPLICATION) { ok = T_run_finalize(); rtems_test_assert(ok); diff --git a/testsuites/smptests/smpopenmp01/init.c b/testsuites/smptests/smpopenmp01/init.c index 46577ff4b2..d37fe852cf 100644 --- a/testsuites/smptests/smpopenmp01/init.c +++ b/testsuites/smptests/smpopenmp01/init.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 embedded brains GmbH & Co. KG + * Copyright (C) 2017, 2024 embedded brains GmbH & Co. KG * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at @@ -143,21 +143,31 @@ static void do_bench(const char *name, void (*bench)(void), int n) (*bench)(); } delta = omp_get_wtime() - start; - printf("\t\t<%sBench unit=\"s\">%f</%sBench>\n", name, delta, name); + printf(",\n \"%s-bench\": %f", name, delta); } +static const char *test_sep = ""; + static void microbench(int num_threads, int n) { - printf("\t<Microbench numThreads=\"%i\" majorLoopCount=\"%i\">\n", num_threads, n); omp_set_num_threads(num_threads); - do_bench("Barrier", barrier_bench, n); - do_bench("Parallel", parallel_bench, n); - do_bench("Static", static_bench, n); - do_bench("Dynamic", dynamic_bench, n); - do_bench("Guided", guided_bench, n); - do_bench("Runtime", runtime_bench, n); - do_bench("Single", single_bench, n); - printf("\t</Microbench>\n"); + printf( + "%s{\n" + " \"num-threads\": %i,\n" + " \"major-loop-count\": %i", + test_sep, + num_threads, + n + ); + test_sep = ", "; + do_bench("barrier", barrier_bench, n); + do_bench("parallel", parallel_bench, n); + do_bench("static", static_bench, n); + do_bench("dynamic", dynamic_bench, n); + do_bench("guided", guided_bench, n); + do_bench("runtime", runtime_bench, n); + do_bench("single", single_bench, n); + printf("\n }"); } static int estimate_3s_runtime_with_one_proc(void) @@ -186,7 +196,7 @@ static void test(void) int num_procs; int n; - printf("<SMPOpenMP01>\n"); + printf("*** BEGIN OF JSON DATA ***\n[\n "); n = estimate_3s_runtime_with_one_proc(); num_procs = omp_get_num_procs(); @@ -196,7 +206,7 @@ static void test(void) microbench(i, n); } - printf("</SMPOpenMP01>\n"); + printf("\n]\n*** END OF JSON DATA ***\n"); } #ifdef __rtems__ diff --git a/testsuites/smptests/smpopenmp01/smpopenmp01.py b/testsuites/smptests/smpopenmp01/smpopenmp01.py index 8545d2d91f..227b089926 100644 --- a/testsuites/smptests/smpopenmp01/smpopenmp01.py +++ b/testsuites/smptests/smpopenmp01/smpopenmp01.py @@ -1,9 +1,6 @@ -#!/usr/bin/env python - # SPDX-License-Identifier: BSD-2-Clause -# -# Copyright (c) 2017 embedded brains GmbH & Co. KG +# Copyright (C) 2017, 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 @@ -25,37 +22,39 @@ # 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. -# +import json import re -import libxml2 -from libxml2 import xmlNode -import matplotlib.pyplot as plt -data = open('smpopenmp01.scn').read() -data = re.sub(r'\*\*\*.*', '', data) -doc = libxml2.parseDoc(data) -ctx = doc.xpathNewContext() - -plt.title('OpenMP Microbench') -plt.xlabel('Number of Threads') -plt.ylabel('Relative Duration') - -def m(n): - return float(n.getContent()) - -def p(bench): - d = map(m, ctx.xpathEval('/SMPOpenMP01/Microbench/' + bench)) - y = [x / d[0] for x in d] - x = range(1, len(y) + 1) - plt.xticks(x) - plt.plot(x, y, label = bench, marker = 'o') - -p('BarrierBench') -p('ParallelBench') -p('StaticBench') -p('DynamicBench') -p('GuidedBench') -p('RuntimeBench') -p('SingleBench') -plt.legend(loc = 'best') -plt.show() +import matplotlib.pyplot as plt # type: ignore +from matplotlib import ticker # type: ignore + + +def _plot(data: dict) -> None: + _, axes = plt.subplots() + axes.set_title("OpenMP Microbench") + axes.set_xlabel("Number of Threads") + axes.set_ylabel("Relative Duration") + x = list(range(1, len(data) + 1)) + axes.xaxis.set_major_locator(ticker.FixedLocator(x)) + for key in [ + "barrier-bench", "dynamic-bench", "guided-bench", "parallel-bench", + "runtime-bench", "single-bench", "static-bench" + ]: + d = [results[key] for results in data] + y = [x / d[0] for x in d] + axes.plot(x, y, label=key.replace("-bench", ""), marker="o") + axes.legend(loc="best") + plt.savefig("smpopenmp01.png") + plt.savefig("smpopenmp01.pdf") + plt.close() + + +_JSON_DATA = re.compile( + r"\*\*\* BEGIN OF JSON DATA \*\*\*(.*)" + r"\*\*\* END OF JSON DATA \*\*\*", re.DOTALL) + +with open("smpopenmp01.scn", "r", encoding="utf-8") as src: + match = _JSON_DATA.search(src.read()) + data = json.loads(match.group(1)) + +_plot(data) diff --git a/testsuites/smptests/smpopenmp01/smpopenmp01.scn b/testsuites/smptests/smpopenmp01/smpopenmp01.scn index 6f63ddca1d..2d6c944d3f 100644 --- a/testsuites/smptests/smpopenmp01/smpopenmp01.scn +++ b/testsuites/smptests/smpopenmp01/smpopenmp01.scn @@ -1,81 +1,64 @@ + + SIS - SPARC/RISCV instruction simulator 2.30, copyright Jiri Gaisler 2020 + Bug-reports to jiri@gaisler.se + + GR740/LEON4 emulation enabled, 4 cpus online, delta 50 clocks + + Loaded build/sparc/gr740/testsuites/smptests/smpopenmp01.exe, entry 0x00000000 + + *** BEGIN OF TEST SMPOPENMP 1 *** -*** TEST VERSION: 5.0.0.4c8cffc19865eaa3b033ce2776bcce9992f24b18 +*** TEST VERSION: 6.0.0.43eecff0b1b2915b87d5324ae562888851cabdaf *** TEST STATE: EXPECTED_PASS -*** TEST BUILD: RTEMS_POSIX_API RTEMS_SMP -*** TEST TOOLS: 7.3.0 20180125 (RTEMS 5, RSB 6d9c77c77d271d1fc2dfe8493d6713930b52a6dd, Newlib 3.0.0) -<SMPOpenMP01> - <Microbench numThreads="1" majorLoopCount="20"> - <BarrierBench unit="s">0.720318</BarrierBench> - <ParallelBench unit="s">1.121403</ParallelBench> - <StaticBench unit="s">0.059288</StaticBench> - <DynamicBench unit="s">0.440113</DynamicBench> - <GuidedBench unit="s">0.003230</GuidedBench> - <RuntimeBench unit="s">0.440121</RuntimeBench> - <SingleBench unit="s">0.116486</SingleBench> - </Microbench> - <Microbench numThreads="2" majorLoopCount="20"> - <BarrierBench unit="s">0.416734</BarrierBench> - <ParallelBench unit="s">0.259013</ParallelBench> - <StaticBench unit="s">0.015311</StaticBench> - <DynamicBench unit="s">0.196751</DynamicBench> - <GuidedBench unit="s">0.002367</GuidedBench> - <RuntimeBench unit="s">0.199640</RuntimeBench> - <SingleBench unit="s">0.077629</SingleBench> - </Microbench> - <Microbench numThreads="3" majorLoopCount="20"> - <BarrierBench unit="s">0.748332</BarrierBench> - <ParallelBench unit="s">0.387318</ParallelBench> - <StaticBench unit="s">0.021244</StaticBench> - <DynamicBench unit="s">0.141558</DynamicBench> - <GuidedBench unit="s">0.001544</GuidedBench> - <RuntimeBench unit="s">0.142693</RuntimeBench> - <SingleBench unit="s">0.117683</SingleBench> - </Microbench> - <Microbench numThreads="4" majorLoopCount="20"> - <BarrierBench unit="s">0.552830</BarrierBench> - <ParallelBench unit="s">0.323241</ParallelBench> - <StaticBench unit="s">0.017796</StaticBench> - <DynamicBench unit="s">0.099475</DynamicBench> - <GuidedBench unit="s">0.001259</GuidedBench> - <RuntimeBench unit="s">0.100053</RuntimeBench> - <SingleBench unit="s">0.091069</SingleBench> - </Microbench> - <Microbench numThreads="5" majorLoopCount="20"> - <BarrierBench unit="s">0.882791</BarrierBench> - <ParallelBench unit="s">0.452561</ParallelBench> - <StaticBench unit="s">0.023620</StaticBench> - <DynamicBench unit="s">0.094107</DynamicBench> - <GuidedBench unit="s">0.000989</GuidedBench> - <RuntimeBench unit="s">0.093911</RuntimeBench> - <SingleBench unit="s">0.130070</SingleBench> - </Microbench> - <Microbench numThreads="6" majorLoopCount="20"> - <BarrierBench unit="s">0.670385</BarrierBench> - <ParallelBench unit="s">0.393587</ParallelBench> - <StaticBench unit="s">0.021141</StaticBench> - <DynamicBench unit="s">0.072322</DynamicBench> - <GuidedBench unit="s">0.000937</GuidedBench> - <RuntimeBench unit="s">0.069804</RuntimeBench> - <SingleBench unit="s">0.104107</SingleBench> - </Microbench> - <Microbench numThreads="7" majorLoopCount="20"> - <BarrierBench unit="s">1.031511</BarrierBench> - <ParallelBench unit="s">0.466571</ParallelBench> - <StaticBench unit="s">0.024944</StaticBench> - <DynamicBench unit="s">0.069194</DynamicBench> - <GuidedBench unit="s">0.000814</GuidedBench> - <RuntimeBench unit="s">0.069596</RuntimeBench> - <SingleBench unit="s">0.133137</SingleBench> - </Microbench> - <Microbench numThreads="8" majorLoopCount="20"> - <BarrierBench unit="s">0.761015</BarrierBench> - <ParallelBench unit="s">0.452577</ParallelBench> - <StaticBench unit="s">0.023979</StaticBench> - <DynamicBench unit="s">0.061193</DynamicBench> - <GuidedBench unit="s">0.000799</GuidedBench> - <RuntimeBench unit="s">0.061519</RuntimeBench> - <SingleBench unit="s">0.114285</SingleBench> - </Microbench> -</SMPOpenMP01> +*** TEST BUILD: RTEMS_SMP +*** TEST TOOLS: 13.2.0 20230727 (RTEMS 6, RSB d3d738c35a71ca05f675b188539225099401ac79, Newlib a021448) +*** BEGIN OF JSON DATA *** +[ + { + "num-threads": 1, + "major-loop-count": 1, + "barrier-bench": 0.269517, + "parallel-bench": 1.277477, + "static-bench": 0.073541, + "dynamic-bench": 0.118271, + "guided-bench": 0.008089, + "runtime-bench": 0.142307, + "single-bench": 0.034294 + }, { + "num-threads": 2, + "major-loop-count": 1, + "barrier-bench": 0.269345, + "parallel-bench": 0.557423, + "static-bench": 0.033622, + "dynamic-bench": 0.059762, + "guided-bench": 0.004065, + "runtime-bench": 0.072107, + "single-bench": 0.033129 + }, { + "num-threads": 3, + "major-loop-count": 1, + "barrier-bench": 0.271522, + "parallel-bench": 0.631576, + "static-bench": 0.036074, + "dynamic-bench": 0.039981, + "guided-bench": 0.002757, + "runtime-bench": 0.049072, + "single-bench": 0.033129 + }, { + "num-threads": 4, + "major-loop-count": 1, + "barrier-bench": 0.272048, + "parallel-bench": 0.705746, + "static-bench": 0.039061, + "dynamic-bench": 0.030069, + "guided-bench": 0.002095, + "runtime-bench": 0.037570, + "single-bench": 0.033176 + } +] +*** END OF JSON DATA *** *** END OF TEST SMPOPENMP 1 *** + +cpu 0 in error mode (tt = 0x80) + 706370700 0000cac0: 91d02000 ta 0x0 diff --git a/testsuites/sptests/sp37/init.c b/testsuites/sptests/sp37/init.c index 2ee21b592e..e8af725a75 100644 --- a/testsuites/sptests/sp37/init.c +++ b/testsuites/sptests/sp37/init.c @@ -40,6 +40,8 @@ #define CONFIGURE_INIT #include "system.h" +#include <rtems/sysinit.h> + const char rtems_test_name[] = "SP 37"; /* prototypes */ @@ -67,6 +69,19 @@ rtems_timer_service_routine test_isr_in_progress( #define TEST_ISR_EVENT RTEMS_EVENT_0 +static uint32_t boot_isr_level; + +static void set_boot_isr_level( void ) +{ + boot_isr_level = _ISR_Get_level(); +} + +RTEMS_SYSINIT_ITEM( + set_boot_isr_level, + RTEMS_SYSINIT_DEVICE_DRIVERS, + RTEMS_SYSINIT_ORDER_MIDDLE +); + typedef struct { ISR_Level actual_level; rtems_id master_task_id; @@ -154,6 +169,9 @@ static void test_isr_level( void ) ISR_Level current = 0; ISR_Level last_proper_level; + /* Interrupts shall be disabled during system initialization */ + rtems_test_assert( boot_isr_level != 0 ); + _ISR_Set_level( current ); rtems_test_assert( _ISR_Get_level() == current ); diff --git a/testsuites/sptests/spmisc01/init.c b/testsuites/sptests/spmisc01/init.c index 62b2f69dbc..8c46245af9 100644 --- a/testsuites/sptests/spmisc01/init.c +++ b/testsuites/sptests/spmisc01/init.c @@ -122,9 +122,14 @@ static int obfuscate_variable(int i) return i; } +static int global_symbol_base; + RTEMS_DECLARE_GLOBAL_SYMBOL(a_global_symbol); -RTEMS_DEFINE_GLOBAL_SYMBOL(a_global_symbol, 0xabc); +RTEMS_DEFINE_GLOBAL_SYMBOL( + a_global_symbol, + RTEMS_SYMBOL_NAME(global_symbol_base) + 0xabc +); RTEMS_STATIC_ASSERT(0 != 1, zero_neq_one); @@ -243,7 +248,9 @@ static void Init(rtems_task_argument arg) unreachable(); rtems_test_assert(printflike_func("%i", 0) == 56); rtems_test_assert(obfuscate_variable(63) == 63); - rtems_test_assert((uintptr_t)a_global_symbol == 0xabc); + rtems_test_assert( + (uintptr_t) a_global_symbol - (uintptr_t) &global_symbol_base == 0xabc + ); rtems_test_assert(RTEMS_ARRAY_SIZE(array) == 3); rtems_test_assert(sizeof(zero_length_array_struct) == 4); container_of(); diff --git a/testsuites/sptests/spprintk/init.c b/testsuites/sptests/spprintk/init.c index f8fe224086..4fc1c0cc97 100644 --- a/testsuites/sptests/spprintk/init.c +++ b/testsuites/sptests/spprintk/init.c @@ -32,7 +32,8 @@ #include "config.h" #endif -#include <rtems/score/io.h> +#include <rtems/base64.h> +#include <rtems/dev/io.h> /* * Undefined the RTEMS_PRINTFLIKE and make it nothing. The test code @@ -212,52 +213,52 @@ static void test_io_base64( test_context *ctx ) int n; clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 9, "\n", 0 ); + n = _Base64_Encode( put_char, ctx, buf, 9, "\n", 0 ); rtems_test_assert( n == 14 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZGVm\nZ2hp" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 8, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 8, "\n", 4 ); rtems_test_assert( n == 14 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZGVm\nZ2g=" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 7, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 7, "\n", 4 ); rtems_test_assert( n == 14 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZGVm\nZw==" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 6, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 6, "\n", 4 ); rtems_test_assert( n == 9 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZGVm" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 5, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 5, "\n", 4 ); rtems_test_assert( n == 9 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZGU=" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 4, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 4, "\n", 4 ); rtems_test_assert( n == 9 ); rtems_test_assert( strcmp( ctx->buf, "YWJj\nZA==" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 3, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 3, "\n", 4 ); rtems_test_assert( n == 4 ); rtems_test_assert( strcmp( ctx->buf, "YWJj" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 2, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 2, "\n", 4 ); rtems_test_assert( n == 4 ); rtems_test_assert( strcmp( ctx->buf, "YWI=" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 1, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 1, "\n", 4 ); rtems_test_assert( n == 4 ); rtems_test_assert( strcmp( ctx->buf, "YQ==" ) == 0 ); clear( ctx ); - n = _IO_Base64( put_char, ctx, buf, 0, "\n", 4 ); + n = _Base64_Encode( put_char, ctx, buf, 0, "\n", 4 ); rtems_test_assert( n == 0 ); } @@ -267,7 +268,7 @@ static void test_io_base64url( test_context *ctx ) int n; clear( ctx ); - n = _IO_Base64url( put_char, ctx, buf, sizeof( buf ), "\n", 0 ); + n = _Base64url_Encode( put_char, ctx, buf, sizeof( buf ), "\n", 0 ); rtems_test_assert( n == 9 ); rtems_test_assert( strcmp( ctx->buf, "AAA-\nAAA_" ) == 0 ); } diff --git a/testsuites/sptests/sptimecounter02/init.c b/testsuites/sptests/sptimecounter02/init.c index 95b6292359..ff05f147de 100644 --- a/testsuites/sptests/sptimecounter02/init.c +++ b/testsuites/sptests/sptimecounter02/init.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-2-Clause */ /* - * Copyright (c) 2015 embedded brains GmbH & Co. KG + * Copyright (C) 2015, 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 @@ -61,6 +61,8 @@ const char rtems_test_name[] = "SPTIMECOUNTER 2"; typedef struct { rtems_test_parallel_context base; + const char *test_sep; + const char *counter_sep; struct timecounter tc_null; uint32_t binuptime_per_job[CPU_COUNT]; sbintime_t duration_per_job[CPU_COUNT]; @@ -90,6 +92,45 @@ static void install_tc_null(timecounter_context *ctx) rtems_timecounter_install(tc_cpu); } +static void test_print_results( + const char *driver, + timecounter_context *ctx, + size_t active_workers +) +{ + const char *value_sep; + size_t i; + + if (active_workers == 1) { + printf( + "%s{\n" + " \"timecounter\": \"%s\",\n" + " \"counter\": [", + ctx->test_sep, + driver + ); + ctx->test_sep = ", "; + ctx->counter_sep = "\n "; + } + + printf("%s[", ctx->counter_sep); + ctx->counter_sep = "],\n "; + value_sep = ""; + + for (i = 0; i < active_workers; ++i) { + printf( + "%s%" PRIu32, + value_sep, + ctx->binuptime_per_job[i] + ); + value_sep = ", "; + } + + if (active_workers == rtems_scheduler_get_processor_maximum()) { + printf("]\n ]\n }"); + } +} + static rtems_interval test_bintime_init( rtems_test_parallel_context *base, void *arg, @@ -133,25 +174,14 @@ static void test_bintime_fini( timecounter_context *ctx = (timecounter_context *) base; size_t i; - printf(" <BinuptimeTest activeWorker=\"%zu\">\n", active_workers); - for (i = 0; i < active_workers; ++i) { sbintime_t error; - printf( - " <Counter worker=\"%zu\">%" PRIu32 "</Counter>\n" - " <Duration worker=\"%zu\" unit=\"sbintime\">%" PRId64 "</Duration>\n", - i + 1, - ctx->binuptime_per_job[i], - i + 1, - ctx->duration_per_job[i] - ); - error = DURATION_IN_SECONDS * SBT_1S - ctx->duration_per_job[i]; rtems_test_assert(error * error < SBT_1MS * SBT_1MS); } - printf(" </BinuptimeTest>\n"); + test_print_results("Clock Driver", ctx, active_workers); } static rtems_interval test_bintime_null_init( @@ -192,20 +222,7 @@ static void test_bintime_null_fini( size_t active_workers ) { - timecounter_context *ctx = (timecounter_context *) base; - size_t i; - - printf(" <BinuptimeNullTest activeWorker=\"%zu\">\n", active_workers); - - for (i = 0; i < active_workers; ++i) { - printf( - " <Counter worker=\"%zu\">%" PRIu32 "</Counter>\n", - i + 1, - ctx->binuptime_per_job[i] - ); - } - - printf(" </BinuptimeNullTest>\n"); + test_print_results("Null", (timecounter_context *) base, active_workers); } static const rtems_test_parallel_job timecounter_jobs[] = { @@ -231,8 +248,9 @@ static void Init(rtems_task_argument arg) TEST_BEGIN(); - printf("<SPTimecounter01>\n"); + printf("*** BEGIN OF JSON DATA ***\n[\n "); + ctx->test_sep = ""; rtems_test_parallel( &ctx->base, NULL, @@ -240,6 +258,8 @@ static void Init(rtems_task_argument arg) RTEMS_ARRAY_SIZE(timecounter_jobs) ); + printf("\n]\n*** END OF JSON DATA ***\n"); + /* Check for all functions available in the bsd.h user space */ rtems_bsd_bintime(&bt); @@ -255,8 +275,6 @@ static void Init(rtems_task_argument arg) rtems_bsd_getmicrouptime(&tv); rtems_bsd_getnanouptime(&ts); - printf("</SPTimecounter01>\n"); - TEST_END(); rtems_test_exit(0); } diff --git a/testsuites/sptests/sptimecounter02/sptimecounter02.py b/testsuites/sptests/sptimecounter02/sptimecounter02.py index 0782fe1102..198255c140 100755 --- a/testsuites/sptests/sptimecounter02/sptimecounter02.py +++ b/testsuites/sptests/sptimecounter02/sptimecounter02.py @@ -1,9 +1,6 @@ -#!/usr/bin/env python - # SPDX-License-Identifier: BSD-2-Clause -# -# Copyright (c) 2016 embedded brains GmbH & Co. KG +# Copyright (C) 2016, 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 @@ -25,37 +22,38 @@ # 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. -# +import json import re -import libxml2 -from libxml2 import xmlNode -import matplotlib.pyplot as plt -data = open('sptimecounter02.scn').read() -data = re.sub(r'\*\*\*.*\*\*\*', '', data) -doc = libxml2.parseDoc(data) -ctx = doc.xpathNewContext() - -plt.title('Timestamp Performance') -plt.xlabel('Active Workers') -plt.ylabel('Operation Count') - -def m(n): - return int(n.getContent()) - -def getCounterSums(variant): - w = 1 - y = [] - while True: - c = map(m, ctx.xpathEval('/SPTimecounter01/' + variant + '[@activeWorker="' + str(w) + '"]/Counter')) - if not c: - break - y.append(sum(c)) - w = w + 1 - return y - -y = getCounterSums('BinuptimeTest') -x = range(1, len(y) + 1) -plt.xticks(x) -plt.plot(x, y, marker = 'o') -plt.show() +import matplotlib.pyplot as plt # type: ignore +from matplotlib import ticker # type: ignore + + +def _plot(data: dict) -> None: + _, axes = plt.subplots() + axes.set_title("Timestamp Performance") + axes.set_xlabel("Active Workers") + axes.set_ylabel("Operation Count") + x = list(range(1, len(data[0]["counter"]) + 1)) + axes.xaxis.set_major_locator(ticker.FixedLocator(x)) + for samples in data: + y = [sum(values) for values in samples["counter"]] + axes.plot(x, + y, + label=samples["timecounter"], + marker="o") + axes.legend(loc="best") + plt.savefig("sptimecounter02.png") + plt.savefig("sptimecounter02.pdf") + plt.close() + + +_JSON_DATA = re.compile( + r"\*\*\* BEGIN OF JSON DATA \*\*\*(.*)" + r"\*\*\* END OF JSON DATA \*\*\*", re.DOTALL) + +with open("sptimecounter02.scn", "r", encoding="utf-8") as src: + match = _JSON_DATA.search(src.read()) + data = json.loads(match.group(1)) + +_plot(data) diff --git a/testsuites/sptests/sptimecounter02/sptimecounter02.scn b/testsuites/sptests/sptimecounter02/sptimecounter02.scn index 0ad38c6f4a..6acc521873 100644 --- a/testsuites/sptests/sptimecounter02/sptimecounter02.scn +++ b/testsuites/sptests/sptimecounter02/sptimecounter02.scn @@ -1,1000 +1,40 @@ + + SIS - SPARC/RISCV instruction simulator 2.30, copyright Jiri Gaisler 2020 + Bug-reports to jiri@gaisler.se + + GR740/LEON4 emulation enabled, 4 cpus online, delta 50 clocks + + Loaded build/sparc/gr740/testsuites/sptests/sptimecounter02.exe, entry 0x00000000 + + *** BEGIN OF TEST SPTIMECOUNTER 2 *** -<SPTimecounter01> - <BinuptimeTest activeWorker="1"> - <Counter worker="1">5433429</Counter> - <Duration worker="1" unit="sbintime">4291225979</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="2"> - <Counter worker="1">3832225</Counter> - <Duration worker="1" unit="sbintime">4290792130</Duration> - <Counter worker="2">3834316</Counter> - <Duration worker="2" unit="sbintime">4290790869</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="3"> - <Counter worker="1">2557440</Counter> - <Duration worker="1" unit="sbintime">4294943244</Duration> - <Counter worker="2">2559261</Counter> - <Duration worker="2" unit="sbintime">4294946681</Duration> - <Counter worker="3">2559529</Counter> - <Duration worker="3" unit="sbintime">4294943817</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="4"> - <Counter worker="1">1916358</Counter> - <Duration worker="1" unit="sbintime">4291303174</Duration> - <Counter worker="2">1918101</Counter> - <Duration worker="2" unit="sbintime">4291303746</Duration> - <Counter worker="3">1918236</Counter> - <Duration worker="3" unit="sbintime">4291301112</Duration> - <Counter worker="4">1918182</Counter> - <Duration worker="4" unit="sbintime">4291303861</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="5"> - <Counter worker="1">1437861</Counter> - <Duration worker="1" unit="sbintime">4292771136</Duration> - <Counter worker="2">1439416</Counter> - <Duration worker="2" unit="sbintime">4292769991</Duration> - <Counter worker="3">1439361</Counter> - <Duration worker="3" unit="sbintime">4292774000</Duration> - <Counter worker="4">1439373</Counter> - <Duration worker="4" unit="sbintime">4292773427</Duration> - <Counter worker="5">1919046</Counter> - <Duration worker="5" unit="sbintime">4292771480</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="6"> - <Counter worker="1">1278255</Counter> - <Duration worker="1" unit="sbintime">4292980616</Duration> - <Counter worker="2">1279690</Counter> - <Duration worker="2" unit="sbintime">4292981762</Duration> - <Counter worker="3">1279546</Counter> - <Duration worker="3" unit="sbintime">4292978440</Duration> - <Counter worker="4">1279558</Counter> - <Duration worker="4" unit="sbintime">4292978096</Duration> - <Counter worker="5">1279611</Counter> - <Duration worker="5" unit="sbintime">4292980043</Duration> - <Counter worker="6">1279619</Counter> - <Duration worker="6" unit="sbintime">4292976150</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="7"> - <Counter worker="1">1022765</Counter> - <Duration worker="1" unit="sbintime">4294000413</Duration> - <Counter worker="2">1024240</Counter> - <Duration worker="2" unit="sbintime">4294002246</Duration> - <Counter worker="3">1024022</Counter> - <Duration worker="3" unit="sbintime">4293998007</Duration> - <Counter worker="4">1024036</Counter> - <Duration worker="4" unit="sbintime">4293998924</Duration> - <Counter worker="5">1024020</Counter> - <Duration worker="5" unit="sbintime">4293998809</Duration> - <Counter worker="6">1024010</Counter> - <Duration worker="6" unit="sbintime">4293999382</Duration> - <Counter worker="7">1535866</Counter> - <Duration worker="7" unit="sbintime">4293999955</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="8"> - <Counter worker="1">958721</Counter> - <Duration worker="1" unit="sbintime">4293767683</Duration> - <Counter worker="2">960000</Counter> - <Duration worker="2" unit="sbintime">4293768599</Duration> - <Counter worker="3">960007</Counter> - <Duration worker="3" unit="sbintime">4293764018</Duration> - <Counter worker="4">960007</Counter> - <Duration worker="4" unit="sbintime">4293764132</Duration> - <Counter worker="5">960030</Counter> - <Duration worker="5" unit="sbintime">4293764705</Duration> - <Counter worker="6">960042</Counter> - <Duration worker="6" unit="sbintime">4293764590</Duration> - <Counter worker="7">960019</Counter> - <Duration worker="7" unit="sbintime">4293768026</Duration> - <Counter worker="8">959998</Counter> - <Duration worker="8" unit="sbintime">4293763446</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="9"> - <Counter worker="1">942346</Counter> - <Duration worker="1" unit="sbintime">4292128953</Duration> - <Counter worker="2">943991</Counter> - <Duration worker="2" unit="sbintime">4292136282</Duration> - <Counter worker="3">940622</Counter> - <Duration worker="3" unit="sbintime">4292123913</Duration> - <Counter worker="4">940597</Counter> - <Duration worker="4" unit="sbintime">4292128494</Duration> - <Counter worker="5">941505</Counter> - <Duration worker="5" unit="sbintime">4292126203</Duration> - <Counter worker="6">941481</Counter> - <Duration worker="6" unit="sbintime">4292126204</Duration> - <Counter worker="7">944352</Counter> - <Duration worker="7" unit="sbintime">4292126089</Duration> - <Counter worker="8">944344</Counter> - <Duration worker="8" unit="sbintime">4292126204</Duration> - <Counter worker="9">5373049</Counter> - <Duration worker="9" unit="sbintime">4292132044</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="10"> - <Counter worker="1">958924</Counter> - <Duration worker="1" unit="sbintime">4292784422</Duration> - <Counter worker="2">960306</Counter> - <Duration worker="2" unit="sbintime">4292785452</Duration> - <Counter worker="3">958656</Counter> - <Duration worker="3" unit="sbintime">4292782704</Duration> - <Counter worker="4">958632</Counter> - <Duration worker="4" unit="sbintime">4292782704</Duration> - <Counter worker="5">960299</Counter> - <Duration worker="5" unit="sbintime">4292781444</Duration> - <Counter worker="6">960321</Counter> - <Duration worker="6" unit="sbintime">4292786026</Duration> - <Counter worker="7">959742</Counter> - <Duration worker="7" unit="sbintime">4292778810</Duration> - <Counter worker="8">959726</Counter> - <Duration worker="8" unit="sbintime">4292783162</Duration> - <Counter worker="9">3835189</Counter> - <Duration worker="9" unit="sbintime">4292783734</Duration> - <Counter worker="10">3835159</Counter> - <Duration worker="10" unit="sbintime">4292782475</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="11"> - <Counter worker="1">958317</Counter> - <Duration worker="1" unit="sbintime">4292020376</Duration> - <Counter worker="2">959720</Counter> - <Duration worker="2" unit="sbintime">4292020490</Duration> - <Counter worker="3">959141</Counter> - <Duration worker="3" unit="sbintime">4292016024</Duration> - <Counter worker="4">959171</Counter> - <Duration worker="4" unit="sbintime">4292020376</Duration> - <Counter worker="5">959183</Counter> - <Duration worker="5" unit="sbintime">4292018199</Duration> - <Counter worker="6">959176</Counter> - <Duration worker="6" unit="sbintime">4292022666</Duration> - <Counter worker="7">960245</Counter> - <Duration worker="7" unit="sbintime">4292020376</Duration> - <Counter worker="8">960256</Counter> - <Duration worker="8" unit="sbintime">4292024041</Duration> - <Counter worker="9">2556834</Counter> - <Duration worker="9" unit="sbintime">4292019460</Duration> - <Counter worker="10">2556892</Counter> - <Duration worker="10" unit="sbintime">4292018314</Duration> - <Counter worker="11">2556777</Counter> - <Duration worker="11" unit="sbintime">4292018543</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="12"> - <Counter worker="1">958527</Counter> - <Duration worker="1" unit="sbintime">4291119807</Duration> - <Counter worker="2">959937</Counter> - <Duration worker="2" unit="sbintime">4291119807</Duration> - <Counter worker="3">959932</Counter> - <Duration worker="3" unit="sbintime">4291120379</Duration> - <Counter worker="4">959924</Counter> - <Duration worker="4" unit="sbintime">4291120380</Duration> - <Counter worker="5">959389</Counter> - <Duration worker="5" unit="sbintime">4291120838</Duration> - <Counter worker="6">959393</Counter> - <Duration worker="6" unit="sbintime">4291123701</Duration> - <Counter worker="7">958279</Counter> - <Duration worker="7" unit="sbintime">4291118204</Duration> - <Counter worker="8">958288</Counter> - <Duration worker="8" unit="sbintime">4291118089</Duration> - <Counter worker="9">1917514</Counter> - <Duration worker="9" unit="sbintime">4291120609</Duration> - <Counter worker="10">1917516</Counter> - <Duration worker="10" unit="sbintime">4291118318</Duration> - <Counter worker="11">1917496</Counter> - <Duration worker="11" unit="sbintime">4291119463</Duration> - <Counter worker="12">1917477</Counter> - <Duration worker="12" unit="sbintime">4291116829</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="13"> - <Counter worker="1">957469</Counter> - <Duration worker="1" unit="sbintime">4291772986</Duration> - <Counter worker="2">958901</Counter> - <Duration worker="2" unit="sbintime">4291772184</Duration> - <Counter worker="3">959855</Counter> - <Duration worker="3" unit="sbintime">4291766114</Duration> - <Counter worker="4">959906</Counter> - <Duration worker="4" unit="sbintime">4291770695</Duration> - <Counter worker="5">959953</Counter> - <Duration worker="5" unit="sbintime">4291779743</Duration> - <Counter worker="6">959977</Counter> - <Duration worker="6" unit="sbintime">4291769092</Duration> - <Counter worker="7">959389</Counter> - <Duration worker="7" unit="sbintime">4291770810</Duration> - <Counter worker="8">959385</Counter> - <Duration worker="8" unit="sbintime">4291766228</Duration> - <Counter worker="9">1438521</Counter> - <Duration worker="9" unit="sbintime">4291768748</Duration> - <Counter worker="10">1438502</Counter> - <Duration worker="10" unit="sbintime">4291768977</Duration> - <Counter worker="11">1438548</Counter> - <Duration worker="11" unit="sbintime">4291766687</Duration> - <Counter worker="12">1438497</Counter> - <Duration worker="12" unit="sbintime">4291770237</Duration> - <Counter worker="13">1917953</Counter> - <Duration worker="13" unit="sbintime">4291765999</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="14"> - <Counter worker="1">958554</Counter> - <Duration worker="1" unit="sbintime">4293977506</Duration> - <Counter worker="2">959986</Counter> - <Duration worker="2" unit="sbintime">4293974643</Duration> - <Counter worker="3">959942</Counter> - <Duration worker="3" unit="sbintime">4293976246</Duration> - <Counter worker="4">959946</Counter> - <Duration worker="4" unit="sbintime">4293971894</Duration> - <Counter worker="5">959422</Counter> - <Duration worker="5" unit="sbintime">4293972467</Duration> - <Counter worker="6">959466</Counter> - <Duration worker="6" unit="sbintime">4293976819</Duration> - <Counter worker="7">960436</Counter> - <Duration worker="7" unit="sbintime">4293975216</Duration> - <Counter worker="8">960437</Counter> - <Duration worker="8" unit="sbintime">4293975216</Duration> - <Counter worker="9">1280753</Counter> - <Duration worker="9" unit="sbintime">4293970749</Duration> - <Counter worker="10">1280760</Counter> - <Duration worker="10" unit="sbintime">4293974529</Duration> - <Counter worker="11">1278618</Counter> - <Duration worker="11" unit="sbintime">4293975445</Duration> - <Counter worker="12">1278603</Counter> - <Duration worker="12" unit="sbintime">4293971665</Duration> - <Counter worker="13">1278806</Counter> - <Duration worker="13" unit="sbintime">4293971894</Duration> - <Counter worker="14">1278798</Counter> - <Duration worker="14" unit="sbintime">4293975673</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="15"> - <Counter worker="1">958175</Counter> - <Duration worker="1" unit="sbintime">4291365823</Duration> - <Counter worker="2">959788</Counter> - <Duration worker="2" unit="sbintime">4291366969</Duration> - <Counter worker="3">959270</Counter> - <Duration worker="3" unit="sbintime">4291360783</Duration> - <Counter worker="4">959251</Counter> - <Duration worker="4" unit="sbintime">4291365250</Duration> - <Counter worker="5">958544</Counter> - <Duration worker="5" unit="sbintime">4291366854</Duration> - <Counter worker="6">958536</Counter> - <Duration worker="6" unit="sbintime">4291362502</Duration> - <Counter worker="7">959264</Counter> - <Duration worker="7" unit="sbintime">4291364105</Duration> - <Counter worker="8">959249</Counter> - <Duration worker="8" unit="sbintime">4291368571</Duration> - <Counter worker="9">1021329</Counter> - <Duration worker="9" unit="sbintime">4291362960</Duration> - <Counter worker="10">1021315</Counter> - <Duration worker="10" unit="sbintime">4291366854</Duration> - <Counter worker="11">1022881</Counter> - <Duration worker="11" unit="sbintime">4291367426</Duration> - <Counter worker="12">1022857</Counter> - <Duration worker="12" unit="sbintime">4291365135</Duration> - <Counter worker="13">1022969</Counter> - <Duration worker="13" unit="sbintime">4291365135</Duration> - <Counter worker="14">1022963</Counter> - <Duration worker="14" unit="sbintime">4291364677</Duration> - <Counter worker="15">1536939</Counter> - <Duration worker="15" unit="sbintime">4291362960</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="16"> - <Counter worker="1">958710</Counter> - <Duration worker="1" unit="sbintime">4294622324</Duration> - <Counter worker="2">960272</Counter> - <Duration worker="2" unit="sbintime">4294611444</Duration> - <Counter worker="3">960318</Counter> - <Duration worker="3" unit="sbintime">4294610413</Duration> - <Counter worker="4">960325</Counter> - <Duration worker="4" unit="sbintime">4294610298</Duration> - <Counter worker="5">957982</Counter> - <Duration worker="5" unit="sbintime">4294606977</Duration> - <Counter worker="6">958010</Counter> - <Duration worker="6" unit="sbintime">4294611558</Duration> - <Counter worker="7">960811</Counter> - <Duration worker="7" unit="sbintime">4294608122</Duration> - <Counter worker="8">960866</Counter> - <Duration worker="8" unit="sbintime">4294608123</Duration> - <Counter worker="9">956789</Counter> - <Duration worker="9" unit="sbintime">4294606175</Duration> - <Counter worker="10">956816</Counter> - <Duration worker="10" unit="sbintime">4294610757</Duration> - <Counter worker="11">961812</Counter> - <Duration worker="11" unit="sbintime">4294611787</Duration> - <Counter worker="12">961815</Counter> - <Duration worker="12" unit="sbintime">4294610069</Duration> - <Counter worker="13">959509</Counter> - <Duration worker="13" unit="sbintime">4294610183</Duration> - <Counter worker="14">959511</Counter> - <Duration worker="14" unit="sbintime">4294610070</Duration> - <Counter worker="15">960164</Counter> - <Duration worker="15" unit="sbintime">4294612474</Duration> - <Counter worker="16">960191</Counter> - <Duration worker="16" unit="sbintime">4294607893</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="17"> - <Counter worker="1">944571</Counter> - <Duration worker="1" unit="sbintime">4290823168</Duration> - <Counter worker="2">946274</Counter> - <Duration worker="2" unit="sbintime">4290823855</Duration> - <Counter worker="3">945546</Counter> - <Duration worker="3" unit="sbintime">4290821565</Duration> - <Counter worker="4">945535</Counter> - <Duration worker="4" unit="sbintime">4290821564</Duration> - <Counter worker="5">943940</Counter> - <Duration worker="5" unit="sbintime">4290819274</Duration> - <Counter worker="6">943961</Counter> - <Duration worker="6" unit="sbintime">4290823741</Duration> - <Counter worker="7">945996</Counter> - <Duration worker="7" unit="sbintime">4290821565</Duration> - <Counter worker="8">945999</Counter> - <Duration worker="8" unit="sbintime">4290821564</Duration> - <Counter worker="9">944038</Counter> - <Duration worker="9" unit="sbintime">4290823969</Duration> - <Counter worker="10">944031</Counter> - <Duration worker="10" unit="sbintime">4290819503</Duration> - <Counter worker="11">944055</Counter> - <Duration worker="11" unit="sbintime">4290824543</Duration> - <Counter worker="12">944036</Counter> - <Duration worker="12" unit="sbintime">4290820076</Duration> - <Counter worker="13">945985</Counter> - <Duration worker="13" unit="sbintime">4290821221</Duration> - <Counter worker="14">945985</Counter> - <Duration worker="14" unit="sbintime">4290821221</Duration> - <Counter worker="15">946541</Counter> - <Duration worker="15" unit="sbintime">4290819503</Duration> - <Counter worker="16">946539</Counter> - <Duration worker="16" unit="sbintime">4290819388</Duration> - <Counter worker="17">5319165</Counter> - <Duration worker="17" unit="sbintime">4290821221</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="18"> - <Counter worker="1">957435</Counter> - <Duration worker="1" unit="sbintime">4292140979</Duration> - <Counter worker="2">959052</Counter> - <Duration worker="2" unit="sbintime">4292138230</Duration> - <Counter worker="3">959020</Counter> - <Duration worker="3" unit="sbintime">4292138115</Duration> - <Counter worker="4">959034</Counter> - <Duration worker="4" unit="sbintime">4292138230</Duration> - <Counter worker="5">959057</Counter> - <Duration worker="5" unit="sbintime">4292137199</Duration> - <Counter worker="6">959078</Counter> - <Duration worker="6" unit="sbintime">4292136969</Duration> - <Counter worker="7">959758</Counter> - <Duration worker="7" unit="sbintime">4292139375</Duration> - <Counter worker="8">959770</Counter> - <Duration worker="8" unit="sbintime">4292139261</Duration> - <Counter worker="9">959102</Counter> - <Duration worker="9" unit="sbintime">4292136855</Duration> - <Counter worker="10">959101</Counter> - <Duration worker="10" unit="sbintime">4292141322</Duration> - <Counter worker="11">957493</Counter> - <Duration worker="11" unit="sbintime">4292141322</Duration> - <Counter worker="12">957490</Counter> - <Duration worker="12" unit="sbintime">4292136741</Duration> - <Counter worker="13">960923</Counter> - <Duration worker="13" unit="sbintime">4292141895</Duration> - <Counter worker="14">960933</Counter> - <Duration worker="14" unit="sbintime">4292139146</Duration> - <Counter worker="15">958227</Counter> - <Duration worker="15" unit="sbintime">4292139032</Duration> - <Counter worker="16">958201</Counter> - <Duration worker="16" unit="sbintime">4292134565</Duration> - <Counter worker="17">3833107</Counter> - <Duration worker="17" unit="sbintime">4292138229</Duration> - <Counter worker="18">3833100</Counter> - <Duration worker="18" unit="sbintime">4292137085</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="19"> - <Counter worker="1">959131</Counter> - <Duration worker="1" unit="sbintime">4295003603</Duration> - <Counter worker="2">960752</Counter> - <Duration worker="2" unit="sbintime">4295005321</Duration> - <Counter worker="3">958958</Counter> - <Duration worker="3" unit="sbintime">4295009444</Duration> - <Counter worker="4">958960</Counter> - <Duration worker="4" unit="sbintime">4295001312</Duration> - <Counter worker="5">960052</Counter> - <Duration worker="5" unit="sbintime">4295001771</Duration> - <Counter worker="6">960086</Counter> - <Duration worker="6" unit="sbintime">4295001885</Duration> - <Counter worker="7">960031</Counter> - <Duration worker="7" unit="sbintime">4295003603</Duration> - <Counter worker="8">960043</Counter> - <Duration worker="8" unit="sbintime">4294999021</Duration> - <Counter worker="9">961650</Counter> - <Duration worker="9" unit="sbintime">4295005435</Duration> - <Counter worker="10">961687</Counter> - <Duration worker="10" unit="sbintime">4295001885</Duration> - <Counter worker="11">960613</Counter> - <Duration worker="11" unit="sbintime">4295011276</Duration> - <Counter worker="12">960593</Counter> - <Duration worker="12" unit="sbintime">4295000854</Duration> - <Counter worker="13">959538</Counter> - <Duration worker="13" unit="sbintime">4295001427</Duration> - <Counter worker="14">959574</Counter> - <Duration worker="14" unit="sbintime">4295001427</Duration> - <Counter worker="15">956810</Counter> - <Duration worker="15" unit="sbintime">4295003717</Duration> - <Counter worker="16">956818</Counter> - <Duration worker="16" unit="sbintime">4295003603</Duration> - <Counter worker="17">2557866</Counter> - <Duration worker="17" unit="sbintime">4295002687</Duration> - <Counter worker="18">2557901</Counter> - <Duration worker="18" unit="sbintime">4295000969</Duration> - <Counter worker="19">2557791</Counter> - <Duration worker="19" unit="sbintime">4295000968</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="20"> - <Counter worker="1">956818</Counter> - <Duration worker="1" unit="sbintime">4290849167</Duration> - <Counter worker="2">958477</Counter> - <Duration worker="2" unit="sbintime">4290849052</Duration> - <Counter worker="3">959502</Counter> - <Duration worker="3" unit="sbintime">4290848594</Duration> - <Counter worker="4">959493</Counter> - <Duration worker="4" unit="sbintime">4290848594</Duration> - <Counter worker="5">959067</Counter> - <Duration worker="5" unit="sbintime">4290848021</Duration> - <Counter worker="6">959118</Counter> - <Duration worker="6" unit="sbintime">4290848021</Duration> - <Counter worker="7">958349</Counter> - <Duration worker="7" unit="sbintime">4290853175</Duration> - <Counter worker="8">958323</Counter> - <Duration worker="8" unit="sbintime">4290846303</Duration> - <Counter worker="9">957048</Counter> - <Duration worker="9" unit="sbintime">4290847563</Duration> - <Counter worker="10">957074</Counter> - <Duration worker="10" unit="sbintime">4290847678</Duration> - <Counter worker="11">960084</Counter> - <Duration worker="11" unit="sbintime">4290846418</Duration> - <Counter worker="12">960074</Counter> - <Duration worker="12" unit="sbintime">4290846418</Duration> - <Counter worker="13">959020</Counter> - <Duration worker="13" unit="sbintime">4290845846</Duration> - <Counter worker="14">959039</Counter> - <Duration worker="14" unit="sbintime">4290850426</Duration> - <Counter worker="15">958126</Counter> - <Duration worker="15" unit="sbintime">4290845960</Duration> - <Counter worker="16">958095</Counter> - <Duration worker="16" unit="sbintime">4290845845</Duration> - <Counter worker="17">1916573</Counter> - <Duration worker="17" unit="sbintime">4290848136</Duration> - <Counter worker="18">1916534</Counter> - <Duration worker="18" unit="sbintime">4290845845</Duration> - <Counter worker="19">1916572</Counter> - <Duration worker="19" unit="sbintime">4290848136</Duration> - <Counter worker="20">1916533</Counter> - <Duration worker="20" unit="sbintime">4290845845</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="21"> - <Counter worker="1">958421</Counter> - <Duration worker="1" unit="sbintime">4294761939</Duration> - <Counter worker="2">960077</Counter> - <Duration worker="2" unit="sbintime">4294760221</Duration> - <Counter worker="3">959148</Counter> - <Duration worker="3" unit="sbintime">4294754953</Duration> - <Counter worker="4">959141</Counter> - <Duration worker="4" unit="sbintime">4294759649</Duration> - <Counter worker="5">959688</Counter> - <Duration worker="5" unit="sbintime">4294754494</Duration> - <Counter worker="6">959736</Counter> - <Duration worker="6" unit="sbintime">4294759076</Duration> - <Counter worker="7">960425</Counter> - <Duration worker="7" unit="sbintime">4294760221</Duration> - <Counter worker="8">960396</Counter> - <Duration worker="8" unit="sbintime">4294755755</Duration> - <Counter worker="9">958447</Counter> - <Duration worker="9" unit="sbintime">4294756213</Duration> - <Counter worker="10">958469</Counter> - <Duration worker="10" unit="sbintime">4294756327</Duration> - <Counter worker="11">960168</Counter> - <Duration worker="11" unit="sbintime">4294759076</Duration> - <Counter worker="12">960140</Counter> - <Duration worker="12" unit="sbintime">4294754495</Duration> - <Counter worker="13">961301</Counter> - <Duration worker="13" unit="sbintime">4294767323</Duration> - <Counter worker="14">961331</Counter> - <Duration worker="14" unit="sbintime">4294756785</Duration> - <Counter worker="15">958210</Counter> - <Duration worker="15" unit="sbintime">4294757358</Duration> - <Counter worker="16">958203</Counter> - <Duration worker="16" unit="sbintime">4294757358</Duration> - <Counter worker="17">1439060</Counter> - <Duration worker="17" unit="sbintime">4294757931</Duration> - <Counter worker="18">1439023</Counter> - <Duration worker="18" unit="sbintime">4294758159</Duration> - <Counter worker="19">1439103</Counter> - <Duration worker="19" unit="sbintime">4294758045</Duration> - <Counter worker="20">1439064</Counter> - <Duration worker="20" unit="sbintime">4294757930</Duration> - <Counter worker="21">1918367</Counter> - <Duration worker="21" unit="sbintime">4294758045</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="22"> - <Counter worker="1">958582</Counter> - <Duration worker="1" unit="sbintime">4291633485</Duration> - <Counter worker="2">960264</Counter> - <Duration worker="2" unit="sbintime">4291633599</Duration> - <Counter worker="3">958919</Counter> - <Duration worker="3" unit="sbintime">4291636921</Duration> - <Counter worker="4">958961</Counter> - <Duration worker="4" unit="sbintime">4291632912</Duration> - <Counter worker="5">958913</Counter> - <Duration worker="5" unit="sbintime">4291634631</Duration> - <Counter worker="6">958982</Counter> - <Duration worker="6" unit="sbintime">4291634630</Duration> - <Counter worker="7">957838</Counter> - <Duration worker="7" unit="sbintime">4291633027</Duration> - <Counter worker="8">957849</Counter> - <Duration worker="8" unit="sbintime">4291632912</Duration> - <Counter worker="9">958935</Counter> - <Duration worker="9" unit="sbintime">4291632340</Duration> - <Counter worker="10">958978</Counter> - <Duration worker="10" unit="sbintime">4291632455</Duration> - <Counter worker="11">958040</Counter> - <Duration worker="11" unit="sbintime">4291631194</Duration> - <Counter worker="12">958060</Counter> - <Duration worker="12" unit="sbintime">4291635203</Duration> - <Counter worker="13">958031</Counter> - <Duration worker="13" unit="sbintime">4291634745</Duration> - <Counter worker="14">958035</Counter> - <Duration worker="14" unit="sbintime">4291630163</Duration> - <Counter worker="15">959809</Counter> - <Duration worker="15" unit="sbintime">4291635776</Duration> - <Counter worker="16">959833</Counter> - <Duration worker="16" unit="sbintime">4291631309</Duration> - <Counter worker="17">1278240</Counter> - <Duration worker="17" unit="sbintime">4291631194</Duration> - <Counter worker="18">1278239</Counter> - <Duration worker="18" unit="sbintime">4291634745</Duration> - <Counter worker="19">1278855</Counter> - <Duration worker="19" unit="sbintime">4291629591</Duration> - <Counter worker="20">1278855</Counter> - <Duration worker="20" unit="sbintime">4291632913</Duration> - <Counter worker="21">1277332</Counter> - <Duration worker="21" unit="sbintime">4291632912</Duration> - <Counter worker="22">1277327</Counter> - <Duration worker="22" unit="sbintime">4291635891</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="23"> - <Counter worker="1">958870</Counter> - <Duration worker="1" unit="sbintime">4294362908</Duration> - <Counter worker="2">960652</Counter> - <Duration worker="2" unit="sbintime">4294358327</Duration> - <Counter worker="3">957192</Counter> - <Duration worker="3" unit="sbintime">4294358327</Duration> - <Counter worker="4">957194</Counter> - <Duration worker="4" unit="sbintime">4294362793</Duration> - <Counter worker="5">960437</Counter> - <Duration worker="5" unit="sbintime">4294358900</Duration> - <Counter worker="6">960480</Counter> - <Duration worker="6" unit="sbintime">4294359014</Duration> - <Counter worker="7">958820</Counter> - <Duration worker="7" unit="sbintime">4294362908</Duration> - <Counter worker="8">958835</Counter> - <Duration worker="8" unit="sbintime">4294360045</Duration> - <Counter worker="9">956488</Counter> - <Duration worker="9" unit="sbintime">4294360617</Duration> - <Counter worker="10">956549</Counter> - <Duration worker="10" unit="sbintime">4294356151</Duration> - <Counter worker="11">961870</Counter> - <Duration worker="11" unit="sbintime">4294356151</Duration> - <Counter worker="12">961835</Counter> - <Duration worker="12" unit="sbintime">4294360732</Duration> - <Counter worker="13">961302</Counter> - <Duration worker="13" unit="sbintime">4294361191</Duration> - <Counter worker="14">961345</Counter> - <Duration worker="14" unit="sbintime">4294356724</Duration> - <Counter worker="15">956489</Counter> - <Duration worker="15" unit="sbintime">4294360045</Duration> - <Counter worker="16">956506</Counter> - <Duration worker="16" unit="sbintime">4294360160</Duration> - <Counter worker="17">1021387</Counter> - <Duration worker="17" unit="sbintime">4294356952</Duration> - <Counter worker="18">1021417</Counter> - <Duration worker="18" unit="sbintime">4294360961</Duration> - <Counter worker="19">1021929</Counter> - <Duration worker="19" unit="sbintime">4294359243</Duration> - <Counter worker="20">1021926</Counter> - <Duration worker="20" unit="sbintime">4294359930</Duration> - <Counter worker="21">1024098</Counter> - <Duration worker="21" unit="sbintime">4294358327</Duration> - <Counter worker="22">1024083</Counter> - <Duration worker="22" unit="sbintime">4294358098</Duration> - <Counter worker="23">1537525</Counter> - <Duration worker="23" unit="sbintime">4294361076</Duration> - </BinuptimeTest> - <BinuptimeTest activeWorker="24"> - <Counter worker="1">958462</Counter> - <Duration worker="1" unit="sbintime">4294344239</Duration> - <Counter worker="2">960113</Counter> - <Duration worker="2" unit="sbintime">4294339773</Duration> - <Counter worker="3">959461</Counter> - <Duration worker="3" unit="sbintime">4294341949</Duration> - <Counter worker="4">959473</Counter> - <Duration worker="4" unit="sbintime">4294344812</Duration> - <Counter worker="5">958912</Counter> - <Duration worker="5" unit="sbintime">4294341490</Duration> - <Counter worker="6">958938</Counter> - <Duration worker="6" unit="sbintime">4294341376</Duration> - <Counter worker="7">958935</Counter> - <Duration worker="7" unit="sbintime">4294340230</Duration> - <Counter worker="8">958921</Counter> - <Duration worker="8" unit="sbintime">4294340345</Duration> - <Counter worker="9">959876</Counter> - <Duration worker="9" unit="sbintime">4294341491</Duration> - <Counter worker="10">959892</Counter> - <Duration worker="10" unit="sbintime">4294337138</Duration> - <Counter worker="11">959045</Counter> - <Duration worker="11" unit="sbintime">4294338284</Duration> - <Counter worker="12">959020</Counter> - <Duration worker="12" unit="sbintime">4294342636</Duration> - <Counter worker="13">961635</Counter> - <Duration worker="13" unit="sbintime">4294341033</Duration> - <Counter worker="14">961646</Counter> - <Duration worker="14" unit="sbintime">4294343782</Duration> - <Counter worker="15">956010</Counter> - <Duration worker="15" unit="sbintime">4294338856</Duration> - <Counter worker="16">956016</Counter> - <Duration worker="16" unit="sbintime">4294343208</Duration> - <Counter worker="17">960207</Counter> - <Duration worker="17" unit="sbintime">4294339887</Duration> - <Counter worker="18">960171</Counter> - <Duration worker="18" unit="sbintime">4294339772</Duration> - <Counter worker="19">960089</Counter> - <Duration worker="19" unit="sbintime">4294340346</Duration> - <Counter worker="20">960077</Counter> - <Duration worker="20" unit="sbintime">4294340346</Duration> - <Counter worker="21">957194</Counter> - <Duration worker="21" unit="sbintime">4294339315</Duration> - <Counter worker="22">957184</Counter> - <Duration worker="22" unit="sbintime">4294339200</Duration> - <Counter worker="23">959119</Counter> - <Duration worker="23" unit="sbintime">4294344812</Duration> - <Counter worker="24">959094</Counter> - <Duration worker="24" unit="sbintime">4294341948</Duration> - </BinuptimeTest> - <BinuptimeNullTest activeWorker="1"> - <Counter worker="1">19386783</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="2"> - <Counter worker="1">18966996</Counter> - <Counter worker="2">18976413</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="3"> - <Counter worker="1">18974430</Counter> - <Counter worker="2">18983328</Counter> - <Counter worker="3">19416623</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="4"> - <Counter worker="1">19008674</Counter> - <Counter worker="2">19018198</Counter> - <Counter worker="3">19008964</Counter> - <Counter worker="4">19008692</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="5"> - <Counter worker="1">19020812</Counter> - <Counter worker="2">19030365</Counter> - <Counter worker="3">19005570</Counter> - <Counter worker="4">19005064</Counter> - <Counter worker="5">19403356</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="6"> - <Counter worker="1">19022252</Counter> - <Counter worker="2">19032184</Counter> - <Counter worker="3">18989113</Counter> - <Counter worker="4">18988868</Counter> - <Counter worker="5">19032006</Counter> - <Counter worker="6">19033563</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="7"> - <Counter worker="1">19030040</Counter> - <Counter worker="2">19040103</Counter> - <Counter worker="3">19027768</Counter> - <Counter worker="4">19027395</Counter> - <Counter worker="5">19032442</Counter> - <Counter worker="6">19034065</Counter> - <Counter worker="7">19412449</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="8"> - <Counter worker="1">19025699</Counter> - <Counter worker="2">19035838</Counter> - <Counter worker="3">19004615</Counter> - <Counter worker="4">19004706</Counter> - <Counter worker="5">19030244</Counter> - <Counter worker="6">19032199</Counter> - <Counter worker="7">19024756</Counter> - <Counter worker="8">19023713</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="9"> - <Counter worker="1">19013669</Counter> - <Counter worker="2">19023620</Counter> - <Counter worker="3">19002201</Counter> - <Counter worker="4">19002347</Counter> - <Counter worker="5">19045897</Counter> - <Counter worker="6">19048005</Counter> - <Counter worker="7">19008510</Counter> - <Counter worker="8">19007710</Counter> - <Counter worker="9">19395234</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="10"> - <Counter worker="1">19027122</Counter> - <Counter worker="2">19037161</Counter> - <Counter worker="3">19009823</Counter> - <Counter worker="4">19010172</Counter> - <Counter worker="5">19038718</Counter> - <Counter worker="6">19040747</Counter> - <Counter worker="7">19031970</Counter> - <Counter worker="8">19031243</Counter> - <Counter worker="9">19073032</Counter> - <Counter worker="10">19074455</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="11"> - <Counter worker="1">19028856</Counter> - <Counter worker="2">19038950</Counter> - <Counter worker="3">19011087</Counter> - <Counter worker="4">19010918</Counter> - <Counter worker="5">19042804</Counter> - <Counter worker="6">19044814</Counter> - <Counter worker="7">19009000</Counter> - <Counter worker="8">19008045</Counter> - <Counter worker="9">19062056</Counter> - <Counter worker="10">19063324</Counter> - <Counter worker="11">19425237</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="12"> - <Counter worker="1">19000686</Counter> - <Counter worker="2">19010524</Counter> - <Counter worker="3">19011200</Counter> - <Counter worker="4">19011161</Counter> - <Counter worker="5">19040651</Counter> - <Counter worker="6">19042336</Counter> - <Counter worker="7">19008991</Counter> - <Counter worker="8">19008322</Counter> - <Counter worker="9">19057966</Counter> - <Counter worker="10">19059942</Counter> - <Counter worker="11">19025294</Counter> - <Counter worker="12">19024237</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="13"> - <Counter worker="1">19035788</Counter> - <Counter worker="2">19045670</Counter> - <Counter worker="3">19019672</Counter> - <Counter worker="4">19019535</Counter> - <Counter worker="5">19057435</Counter> - <Counter worker="6">19059507</Counter> - <Counter worker="7">19015462</Counter> - <Counter worker="8">19015005</Counter> - <Counter worker="9">19075133</Counter> - <Counter worker="10">19076837</Counter> - <Counter worker="11">19015711</Counter> - <Counter worker="12">19014041</Counter> - <Counter worker="13">19397278</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="14"> - <Counter worker="1">19042430</Counter> - <Counter worker="2">19052163</Counter> - <Counter worker="3">18991353</Counter> - <Counter worker="4">18991104</Counter> - <Counter worker="5">19055723</Counter> - <Counter worker="6">19057975</Counter> - <Counter worker="7">19037925</Counter> - <Counter worker="8">19037320</Counter> - <Counter worker="9">19093382</Counter> - <Counter worker="10">19095573</Counter> - <Counter worker="11">19013959</Counter> - <Counter worker="12">19012664</Counter> - <Counter worker="13">19047902</Counter> - <Counter worker="14">19049501</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="15"> - <Counter worker="1">19031341</Counter> - <Counter worker="2">19041295</Counter> - <Counter worker="3">19021603</Counter> - <Counter worker="4">19021349</Counter> - <Counter worker="5">19070154</Counter> - <Counter worker="6">19072132</Counter> - <Counter worker="7">19012455</Counter> - <Counter worker="8">19011763</Counter> - <Counter worker="9">19078313</Counter> - <Counter worker="10">19081070</Counter> - <Counter worker="11">19007359</Counter> - <Counter worker="12">19006010</Counter> - <Counter worker="13">19079061</Counter> - <Counter worker="14">19080701</Counter> - <Counter worker="15">19419748</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="16"> - <Counter worker="1">19026392</Counter> - <Counter worker="2">19036011</Counter> - <Counter worker="3">19020535</Counter> - <Counter worker="4">19020505</Counter> - <Counter worker="5">19027761</Counter> - <Counter worker="6">19029769</Counter> - <Counter worker="7">19007387</Counter> - <Counter worker="8">19006701</Counter> - <Counter worker="9">19079449</Counter> - <Counter worker="10">19081866</Counter> - <Counter worker="11">19016942</Counter> - <Counter worker="12">19015669</Counter> - <Counter worker="13">19053837</Counter> - <Counter worker="14">19056122</Counter> - <Counter worker="15">19017232</Counter> - <Counter worker="16">19015864</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="17"> - <Counter worker="1">19024720</Counter> - <Counter worker="2">19034397</Counter> - <Counter worker="3">19010358</Counter> - <Counter worker="4">19009952</Counter> - <Counter worker="5">19045360</Counter> - <Counter worker="6">19047250</Counter> - <Counter worker="7">19015505</Counter> - <Counter worker="8">19014894</Counter> - <Counter worker="9">19067467</Counter> - <Counter worker="10">19069766</Counter> - <Counter worker="11">19001455</Counter> - <Counter worker="12">19000148</Counter> - <Counter worker="13">19062397</Counter> - <Counter worker="14">19064161</Counter> - <Counter worker="15">18988213</Counter> - <Counter worker="16">18986839</Counter> - <Counter worker="17">19392710</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="18"> - <Counter worker="1">19014459</Counter> - <Counter worker="2">19024385</Counter> - <Counter worker="3">19004536</Counter> - <Counter worker="4">19004360</Counter> - <Counter worker="5">19059651</Counter> - <Counter worker="6">19061446</Counter> - <Counter worker="7">18995175</Counter> - <Counter worker="8">18994526</Counter> - <Counter worker="9">19069645</Counter> - <Counter worker="10">19072049</Counter> - <Counter worker="11">19020094</Counter> - <Counter worker="12">19018465</Counter> - <Counter worker="13">19084049</Counter> - <Counter worker="14">19085700</Counter> - <Counter worker="15">19010799</Counter> - <Counter worker="16">19009469</Counter> - <Counter worker="17">19062621</Counter> - <Counter worker="18">19062665</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="19"> - <Counter worker="1">19027369</Counter> - <Counter worker="2">19037193</Counter> - <Counter worker="3">19017667</Counter> - <Counter worker="4">19017624</Counter> - <Counter worker="5">19025425</Counter> - <Counter worker="6">19027799</Counter> - <Counter worker="7">19017922</Counter> - <Counter worker="8">19017381</Counter> - <Counter worker="9">19029266</Counter> - <Counter worker="10">19031825</Counter> - <Counter worker="11">19025025</Counter> - <Counter worker="12">19023564</Counter> - <Counter worker="13">19057381</Counter> - <Counter worker="14">19059412</Counter> - <Counter worker="15">19025461</Counter> - <Counter worker="16">19023734</Counter> - <Counter worker="17">19049991</Counter> - <Counter worker="18">19051542</Counter> - <Counter worker="19">19418712</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="20"> - <Counter worker="1">19042934</Counter> - <Counter worker="2">19052696</Counter> - <Counter worker="3">19038771</Counter> - <Counter worker="4">19038516</Counter> - <Counter worker="5">19033526</Counter> - <Counter worker="6">19035338</Counter> - <Counter worker="7">19043236</Counter> - <Counter worker="8">19042713</Counter> - <Counter worker="9">19086859</Counter> - <Counter worker="10">19089153</Counter> - <Counter worker="11">19022766</Counter> - <Counter worker="12">19021740</Counter> - <Counter worker="13">19061402</Counter> - <Counter worker="14">19063648</Counter> - <Counter worker="15">19019723</Counter> - <Counter worker="16">19018344</Counter> - <Counter worker="17">19049944</Counter> - <Counter worker="18">19051860</Counter> - <Counter worker="19">19024515</Counter> - <Counter worker="20">19024160</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="21"> - <Counter worker="1">19024204</Counter> - <Counter worker="2">19034080</Counter> - <Counter worker="3">19000776</Counter> - <Counter worker="4">19000755</Counter> - <Counter worker="5">19051386</Counter> - <Counter worker="6">19053223</Counter> - <Counter worker="7">18986331</Counter> - <Counter worker="8">18985787</Counter> - <Counter worker="9">19090476</Counter> - <Counter worker="10">19093070</Counter> - <Counter worker="11">19014901</Counter> - <Counter worker="12">19013812</Counter> - <Counter worker="13">19076062</Counter> - <Counter worker="14">19077825</Counter> - <Counter worker="15">19009098</Counter> - <Counter worker="16">19007749</Counter> - <Counter worker="17">19068241</Counter> - <Counter worker="18">19070586</Counter> - <Counter worker="19">18985454</Counter> - <Counter worker="20">18984893</Counter> - <Counter worker="21">19400999</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="22"> - <Counter worker="1">19031656</Counter> - <Counter worker="2">19041556</Counter> - <Counter worker="3">19002695</Counter> - <Counter worker="4">19002754</Counter> - <Counter worker="5">19077008</Counter> - <Counter worker="6">19078695</Counter> - <Counter worker="7">18989542</Counter> - <Counter worker="8">18988653</Counter> - <Counter worker="9">19044533</Counter> - <Counter worker="10">19046959</Counter> - <Counter worker="11">19004288</Counter> - <Counter worker="12">19003156</Counter> - <Counter worker="13">19062162</Counter> - <Counter worker="14">19064009</Counter> - <Counter worker="15">19034105</Counter> - <Counter worker="16">19032889</Counter> - <Counter worker="17">19067368</Counter> - <Counter worker="18">19070169</Counter> - <Counter worker="19">19008530</Counter> - <Counter worker="20">19008397</Counter> - <Counter worker="21">19037841</Counter> - <Counter worker="22">19040158</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="23"> - <Counter worker="1">19019317</Counter> - <Counter worker="2">19029201</Counter> - <Counter worker="3">19010298</Counter> - <Counter worker="4">19010487</Counter> - <Counter worker="5">19030794</Counter> - <Counter worker="6">19032697</Counter> - <Counter worker="7">19001815</Counter> - <Counter worker="8">19001431</Counter> - <Counter worker="9">19067361</Counter> - <Counter worker="10">19069729</Counter> - <Counter worker="11">19001399</Counter> - <Counter worker="12">19000051</Counter> - <Counter worker="13">19070247</Counter> - <Counter worker="14">19072221</Counter> - <Counter worker="15">19020770</Counter> - <Counter worker="16">19019396</Counter> - <Counter worker="17">19085756</Counter> - <Counter worker="18">19088597</Counter> - <Counter worker="19">19014748</Counter> - <Counter worker="20">19014660</Counter> - <Counter worker="21">19044229</Counter> - <Counter worker="22">19046314</Counter> - <Counter worker="23">19421247</Counter> - </BinuptimeNullTest> - <BinuptimeNullTest activeWorker="24"> - <Counter worker="1">19016838</Counter> - <Counter worker="2">19026664</Counter> - <Counter worker="3">18978854</Counter> - <Counter worker="4">18978559</Counter> - <Counter worker="5">19034822</Counter> - <Counter worker="6">19036646</Counter> - <Counter worker="7">19006174</Counter> - <Counter worker="8">19005608</Counter> - <Counter worker="9">19042579</Counter> - <Counter worker="10">19044966</Counter> - <Counter worker="11">19007697</Counter> - <Counter worker="12">19006331</Counter> - <Counter worker="13">19053232</Counter> - <Counter worker="14">19054892</Counter> - <Counter worker="15">18999211</Counter> - <Counter worker="16">18997906</Counter> - <Counter worker="17">19065292</Counter> - <Counter worker="18">19067828</Counter> - <Counter worker="19">19014259</Counter> - <Counter worker="20">19013886</Counter> - <Counter worker="21">19047296</Counter> - <Counter worker="22">19048410</Counter> - <Counter worker="23">19017171</Counter> - <Counter worker="24">19016766</Counter> - </BinuptimeNullTest> -</SPTimecounter01> +*** TEST VERSION: 6.0.0.105c3e541c26113503080c65006ad775d31fca3d +*** TEST STATE: EXPECTED_PASS +*** TEST BUILD: RTEMS_SMP +*** TEST TOOLS: 13.2.0 20230727 (RTEMS 6, RSB d3d738c35a71ca05f675b188539225099401ac79, Newlib a021448) +*** BEGIN OF JSON DATA *** +[ + { + "timecounter": "Clock Driver", + "counter": [ + [523086], + [523088, 528231], + [523088, 528232, 528231], + [523088, 528215, 528215, 527992] + ] + }, { + "timecounter": "Null", + "counter": [ + [528630], + [528662, 533818], + [528684, 533839, 533840], + [528664, 533821, 533821, 533582] + ] + } +] +*** END OF JSON DATA *** + *** END OF TEST SPTIMECOUNTER 2 *** + +cpu 0 in error mode (tt = 0x80) + 400337050 00009120: 91d02000 ta 0x0 diff --git a/testsuites/sptests/sptimecounter03/init.c b/testsuites/sptests/sptimecounter03/init.c index df305ab2f9..d1a9d58886 100644 --- a/testsuites/sptests/sptimecounter03/init.c +++ b/testsuites/sptests/sptimecounter03/init.c @@ -41,7 +41,7 @@ const char rtems_test_name[] = "SPTIMECOUNTER 3"; #define CPU_COUNT 32 -static rtems_test_parallel_context ctx;; +static rtems_test_parallel_context ctx; static rtems_interval test_binuptime_init( rtems_test_parallel_context *ctx, diff --git a/testsuites/sptests/sptls01/init.c b/testsuites/sptests/sptls01/init.c index acb5d43a5e..d6beeedf90 100644 --- a/testsuites/sptests/sptls01/init.c +++ b/testsuites/sptests/sptls01/init.c @@ -32,6 +32,8 @@ #include <rtems/bspIo.h> #include <rtems/stackchk.h> #include <rtems/sysinit.h> +#include <rtems/score/cpuimpl.h> +#include <rtems/score/threadimpl.h> #include <rtems/score/tls.h> #include "tmacros.h" @@ -57,6 +59,7 @@ static void task(rtems_task_argument arg) rtems_status_code sc; check_tls_item(123); + tls_item = 42; sc = rtems_event_transient_send(master_task); rtems_test_assert(sc == RTEMS_SUCCESSFUL); @@ -67,9 +70,11 @@ static void task(rtems_task_argument arg) static void check_tls_size(void) { + const volatile TLS_Configuration *config; uintptr_t tls_size; - tls_size = _TLS_Get_size(); + config = &_TLS_Configuration; + tls_size = (uintptr_t) config->size; if (tls_size != 1) { printk( @@ -83,10 +88,27 @@ static void check_tls_size(void) } } +static Thread_Control *get_thread(rtems_id id) +{ + Thread_Control *the_thread; + ISR_lock_Context lock_context; + + the_thread = _Thread_Get(id, &lock_context); + _ISR_lock_ISR_enable(&lock_context); + return the_thread; +} + static void test(void) { rtems_id id; rtems_status_code sc; + Thread_Control *self; + Thread_Control *other; + char *self_tp; + char *other_tp; + uintptr_t tls_item_offset; + char *self_tls_item; + char *other_tls_item; master_task = rtems_task_self(); @@ -109,9 +131,22 @@ static void test(void) sc = rtems_task_start(id, task, 0); rtems_test_assert(sc == RTEMS_SUCCESSFUL); + self = get_thread(master_task); + other = get_thread(id); + self_tp = _CPU_Get_TLS_thread_pointer(&self->Registers); + other_tp = _CPU_Get_TLS_thread_pointer(&other->Registers); + tls_item_offset = (uintptr_t) (&tls_item - self_tp); + self_tls_item = self_tp + tls_item_offset; + other_tls_item = other_tp + tls_item_offset; + rtems_test_assert(*self_tls_item == 5); + rtems_test_assert(*other_tls_item == 123); + sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT); rtems_test_assert(sc == RTEMS_SUCCESSFUL); + rtems_test_assert(*self_tls_item == 5); + rtems_test_assert(*other_tls_item == 42); + sc = rtems_task_delete(id); rtems_test_assert(sc == RTEMS_SUCCESSFUL); diff --git a/testsuites/support/include/tmacros.h b/testsuites/support/include/tmacros.h index 0dc35ea21d..aa20411623 100644 --- a/testsuites/support/include/tmacros.h +++ b/testsuites/support/include/tmacros.h @@ -46,6 +46,7 @@ #include <string.h> #include <rtems/error.h> #include <rtems/test-info.h> +#include <rtems/test-printer.h> #include <rtems/score/threaddispatch.h> #include <buffer_test_io.h> diff --git a/testsuites/tmtests/tm01/system.h b/testsuites/tmtests/tm01/system.h index 10f694482f..d5f60d3c83 100644 --- a/testsuites/tmtests/tm01/system.h +++ b/testsuites/tmtests/tm01/system.h @@ -50,7 +50,6 @@ rtems_id Task_id[ OPERATION_COUNT+1 ]; /* array of task ids */ #define CONFIGURE_MAXIMUM_TASKS 2 #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm02/system.h b/testsuites/tmtests/tm02/system.h index 0b2e4fb59a..66d3912f5a 100644 --- a/testsuites/tmtests/tm02/system.h +++ b/testsuites/tmtests/tm02/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (3 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm03/system.h b/testsuites/tmtests/tm03/system.h index 0b2e4fb59a..66d3912f5a 100644 --- a/testsuites/tmtests/tm03/system.h +++ b/testsuites/tmtests/tm03/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (3 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm04/system.h b/testsuites/tmtests/tm04/system.h index ecad2b492f..a330fde825 100644 --- a/testsuites/tmtests/tm04/system.h +++ b/testsuites/tmtests/tm04/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (4 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm05/system.h b/testsuites/tmtests/tm05/system.h index f00b626c36..28263f3051 100644 --- a/testsuites/tmtests/tm05/system.h +++ b/testsuites/tmtests/tm05/system.h @@ -46,7 +46,6 @@ rtems_task Init( #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS (2 + OPERATION_COUNT) -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm06/system.h b/testsuites/tmtests/tm06/system.h index f00b626c36..28263f3051 100644 --- a/testsuites/tmtests/tm06/system.h +++ b/testsuites/tmtests/tm06/system.h @@ -46,7 +46,6 @@ rtems_task Init( #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS (2 + OPERATION_COUNT) -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm07/system.h b/testsuites/tmtests/tm07/system.h index f00b626c36..28263f3051 100644 --- a/testsuites/tmtests/tm07/system.h +++ b/testsuites/tmtests/tm07/system.h @@ -46,7 +46,6 @@ rtems_task Init( #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS (2 + OPERATION_COUNT) -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm08/system.h b/testsuites/tmtests/tm08/system.h index 253cdaba54..7d642bd0a8 100644 --- a/testsuites/tmtests/tm08/system.h +++ b/testsuites/tmtests/tm08/system.h @@ -46,7 +46,6 @@ rtems_task Init( #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS 3 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm09/system.h b/testsuites/tmtests/tm09/system.h index 3d12c68d07..da2da0b2ec 100644 --- a/testsuites/tmtests/tm09/system.h +++ b/testsuites/tmtests/tm09/system.h @@ -51,7 +51,6 @@ rtems_id Task_id[ OPERATION_COUNT+1 ]; /* array of task ids */ #define CONFIGURE_MAXIMUM_TASKS 2 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_MESSAGE_BUFFER_MEMORY \ CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(OPERATION_COUNT, MESSAGE_SIZE) diff --git a/testsuites/tmtests/tm10/system.h b/testsuites/tmtests/tm10/system.h index ed5e9a12bb..e4c296f625 100644 --- a/testsuites/tmtests/tm10/system.h +++ b/testsuites/tmtests/tm10/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (2 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_MESSAGE_BUFFER_MEMORY \ CONFIGURE_MESSAGE_BUFFERS_FOR_QUEUE(OPERATION_COUNT, 16) diff --git a/testsuites/tmtests/tm11/system.h b/testsuites/tmtests/tm11/system.h index d4fa9fd404..9a2fc14aab 100644 --- a/testsuites/tmtests/tm11/system.h +++ b/testsuites/tmtests/tm11/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (3 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm12/system.h b/testsuites/tmtests/tm12/system.h index d4fa9fd404..9a2fc14aab 100644 --- a/testsuites/tmtests/tm12/system.h +++ b/testsuites/tmtests/tm12/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (3 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm13/system.h b/testsuites/tmtests/tm13/system.h index d4fa9fd404..9a2fc14aab 100644 --- a/testsuites/tmtests/tm13/system.h +++ b/testsuites/tmtests/tm13/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (3 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm14/system.h b/testsuites/tmtests/tm14/system.h index d4fa9fd404..9a2fc14aab 100644 --- a/testsuites/tmtests/tm14/system.h +++ b/testsuites/tmtests/tm14/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (3 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm15/system.h b/testsuites/tmtests/tm15/system.h index 9586199d27..fffabdf844 100644 --- a/testsuites/tmtests/tm15/system.h +++ b/testsuites/tmtests/tm15/system.h @@ -48,7 +48,6 @@ rtems_id Task_id[ OPERATION_COUNT+1 ]; /* array of task ids */ #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS (2 + OPERATION_COUNT) -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm16/system.h b/testsuites/tmtests/tm16/system.h index b495e374b2..9eb6d69e85 100644 --- a/testsuites/tmtests/tm16/system.h +++ b/testsuites/tmtests/tm16/system.h @@ -48,7 +48,6 @@ rtems_id Task_id[ OPERATION_COUNT+1 ]; /* array of task ids */ #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS (3 + OPERATION_COUNT) -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm17/system.h b/testsuites/tmtests/tm17/system.h index 9586199d27..fffabdf844 100644 --- a/testsuites/tmtests/tm17/system.h +++ b/testsuites/tmtests/tm17/system.h @@ -48,7 +48,6 @@ rtems_id Task_id[ OPERATION_COUNT+1 ]; /* array of task ids */ #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS (2 + OPERATION_COUNT) -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm18/system.h b/testsuites/tmtests/tm18/system.h index f00b626c36..28263f3051 100644 --- a/testsuites/tmtests/tm18/system.h +++ b/testsuites/tmtests/tm18/system.h @@ -46,7 +46,6 @@ rtems_task Init( #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS (2 + OPERATION_COUNT) -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm19/system.h b/testsuites/tmtests/tm19/system.h index 3051d62961..bbae1e537f 100644 --- a/testsuites/tmtests/tm19/system.h +++ b/testsuites/tmtests/tm19/system.h @@ -48,7 +48,6 @@ rtems_id Task_id[ OPERATION_COUNT+1 ]; /* array of task ids */ #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS 4 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm20/system.h b/testsuites/tmtests/tm20/system.h index 3128bad743..145477232d 100644 --- a/testsuites/tmtests/tm20/system.h +++ b/testsuites/tmtests/tm20/system.h @@ -51,7 +51,6 @@ rtems_id Task_id[ OPERATION_COUNT+1 ]; /* array of task ids */ #define CONFIGURE_MAXIMUM_TASKS 3 #define CONFIGURE_MAXIMUM_PARTITIONS 1 #define CONFIGURE_MAXIMUM_REGIONS 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm21/system.h b/testsuites/tmtests/tm21/system.h index 53f3c01353..ef4e35fc7d 100644 --- a/testsuites/tmtests/tm21/system.h +++ b/testsuites/tmtests/tm21/system.h @@ -58,7 +58,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_PORTS OPERATION_COUNT #define CONFIGURE_MAXIMUM_PERIODS OPERATION_COUNT -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm22/system.h b/testsuites/tmtests/tm22/system.h index d256595fe7..621043dc7c 100644 --- a/testsuites/tmtests/tm22/system.h +++ b/testsuites/tmtests/tm22/system.h @@ -49,7 +49,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS 4 #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_MESSAGE_BUFFER_MEMORY \ diff --git a/testsuites/tmtests/tm23/system.h b/testsuites/tmtests/tm23/system.h index edee889a9e..41722a2c39 100644 --- a/testsuites/tmtests/tm23/system.h +++ b/testsuites/tmtests/tm23/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (1 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_TIMERS OPERATION_COUNT -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm24/system.h b/testsuites/tmtests/tm24/system.h index f00b626c36..28263f3051 100644 --- a/testsuites/tmtests/tm24/system.h +++ b/testsuites/tmtests/tm24/system.h @@ -46,7 +46,6 @@ rtems_task Init( #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS (2 + OPERATION_COUNT) -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm25/system.h b/testsuites/tmtests/tm25/system.h index 112881f52a..423a30eba8 100644 --- a/testsuites/tmtests/tm25/system.h +++ b/testsuites/tmtests/tm25/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (2 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm26/system.h b/testsuites/tmtests/tm26/system.h index 762a7051b0..d66dfa81dd 100644 --- a/testsuites/tmtests/tm26/system.h +++ b/testsuites/tmtests/tm26/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (6 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_SEMAPHORES 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT_TASK_ATTRIBUTES RTEMS_FLOATING_POINT diff --git a/testsuites/tmtests/tm27/system.h b/testsuites/tmtests/tm27/system.h index b3f40c9d8c..4a2723bcd4 100644 --- a/testsuites/tmtests/tm27/system.h +++ b/testsuites/tmtests/tm27/system.h @@ -48,7 +48,6 @@ rtems_id Task_id[ OPERATION_COUNT+1 ]; /* array of task ids */ #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS 3 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm28/system.h b/testsuites/tmtests/tm28/system.h index f570f52849..bec8393510 100644 --- a/testsuites/tmtests/tm28/system.h +++ b/testsuites/tmtests/tm28/system.h @@ -49,7 +49,6 @@ rtems_id Task_id[ OPERATION_COUNT+1 ]; /* array of task ids */ #define CONFIGURE_MAXIMUM_TASKS 2 #define CONFIGURE_MAXIMUM_PORTS 1 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tm29/system.h b/testsuites/tmtests/tm29/system.h index 0c8e6e48cf..380878abb0 100644 --- a/testsuites/tmtests/tm29/system.h +++ b/testsuites/tmtests/tm29/system.h @@ -47,7 +47,6 @@ rtems_task Init( #define CONFIGURE_MAXIMUM_TASKS (2 + OPERATION_COUNT) #define CONFIGURE_MAXIMUM_PERIODS OPERATION_COUNT -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE #define CONFIGURE_INIT_TASK_STACK_SIZE (RTEMS_MINIMUM_STACK_SIZE * 2) diff --git a/testsuites/tmtests/tmck/system.h b/testsuites/tmtests/tmck/system.h index 6a33ed4374..6fad74389e 100644 --- a/testsuites/tmtests/tmck/system.h +++ b/testsuites/tmtests/tmck/system.h @@ -48,7 +48,6 @@ rtems_name Task_name[ OPERATION_COUNT+1 ]; /* array of task names */ #define CONFIGURE_APPLICATION_NEEDS_TIMER_DRIVER #define CONFIGURE_MAXIMUM_TASKS 2 -#define CONFIGURE_TICKS_PER_TIMESLICE 0 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE diff --git a/testsuites/tmtests/tmcontext01/init.c b/testsuites/tmtests/tmcontext01/init.c index 15ac4baae6..dc1da718c7 100644 --- a/testsuites/tmtests/tmcontext01/init.c +++ b/testsuites/tmtests/tmcontext01/init.c @@ -49,8 +49,6 @@ const char rtems_test_name[] = "TMCONTEXT 1"; static rtems_counter_ticks t[SAMPLES]; -static volatile int prevent_optimization; - static size_t cache_line_size; static size_t data_size; @@ -72,43 +70,31 @@ static int dirty_data_cache(volatile int *data, size_t n, size_t clsz, int j) return i + j; } -static int call_at_level( +static __attribute__((__noipa__)) void call_at_level( int start, int fl, - int s, - bool dirty + int s ) { - int prevent_optimization;; - - prevent_optimization = start + fl; - +#if defined(__sparc__) if (fl == start) { - /* - * Some architectures like the SPARC have register windows. A side-effect - * of this context switch is that we start with a fresh window set. On - * architectures like ARM or PowerPC this context switch has no effect. - */ - _Context_Switch(&ctx, &ctx); + /* Flush register windows */ + __asm__ volatile ("ta 3" : : : "memory"); } +#endif if (fl > 0) { call_at_level( start, fl - 1, - s, - dirty + s ); + __asm__ volatile ("" : : : "memory"); } else { char *volatile space; rtems_counter_ticks a; rtems_counter_ticks b; - if (dirty) { - dirty_data_cache(main_data, data_size, cache_line_size, fl); - rtems_cache_invalidate_entire_instruction(); - } - a = rtems_counter_read(); /* Ensure that we use an untouched stack area */ @@ -120,8 +106,6 @@ static int call_at_level( b = rtems_counter_read(); t[s] = rtems_counter_difference(b, a); } - - return prevent_optimization; } static void load_task(rtems_task_argument arg) @@ -149,7 +133,7 @@ static void sort_t(void) qsort(&t[0], SAMPLES, sizeof(t[0]), cmp); } -static void test_by_function_level(int fl, bool dirty) +static __attribute__((__noipa__)) void test_by_function_level(int fl, bool dirty) { RTEMS_INTERRUPT_LOCK_DECLARE(, lock) rtems_interrupt_lock_context lock_context; @@ -160,13 +144,16 @@ static void test_by_function_level(int fl, bool dirty) uint64_t q3; uint64_t max; - fl += prevent_optimization; - rtems_interrupt_lock_initialize(&lock, "test"); rtems_interrupt_lock_acquire(&lock, &lock_context); for (s = 0; s < SAMPLES; ++s) { - call_at_level(fl, fl, s, dirty); + if (dirty) { + dirty_data_cache(main_data, data_size, cache_line_size, fl); + rtems_cache_invalidate_entire_instruction(); + } + + call_at_level(fl, fl, s); } rtems_interrupt_lock_release(&lock, &lock_context); @@ -181,14 +168,8 @@ static void test_by_function_level(int fl, bool dirty) max = t[SAMPLES - 1]; printf( - " <Sample functionNestLevel=\"%i\">\n" - " <Min unit=\"ns\">%" PRIu64 "</Min>" - "<Q1 unit=\"ns\">%" PRIu64 "</Q1>" - "<Q2 unit=\"ns\">%" PRIu64 "</Q2>" - "<Q3 unit=\"ns\">%" PRIu64 "</Q3>" - "<Max unit=\"ns\">%" PRIu64 "</Max>\n" - " </Sample>\n", - fl, + "%s\n [%" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 ", %" PRIu64 "]", + fl == 0 ? "" : ",", rtems_counter_ticks_to_nanoseconds(min), rtems_counter_ticks_to_nanoseconds(q1), rtems_counter_ticks_to_nanoseconds(q2), @@ -197,26 +178,38 @@ static void test_by_function_level(int fl, bool dirty) ); } -static void test(bool dirty, uint32_t load) +static void test(bool first, bool dirty, uint32_t load) { int fl; printf( - " <ContextSwitchTest environment=\"%s\"", - dirty ? "dirty" : "normal" + "\n %s{\n" + " \"environment\": \"", + first ? "" : "}, " ); - if (load > 0) { - printf(" load=\"%" PRIu32 "\"", load); + if (dirty) { + if (load > 0) { + printf("Load/%" PRIu32 "", load); + } else { + printf("DirtyCache"); + } + } else { + printf("HotCache"); } - printf(">\n"); + printf( + "\",\n" + " \"stats-by-function-nest-level\": [" + ); for (fl = 0; fl < FUNCTION_LEVELS; ++fl) { test_by_function_level(fl, dirty); } - printf(" </ContextSwitchTest>\n"); + printf( + "\n ]" + ); } static void Init(rtems_task_argument arg) @@ -225,7 +218,7 @@ static void Init(rtems_task_argument arg) TEST_BEGIN(); - printf("<Test>\n"); + printf("*** BEGIN OF JSON DATA ***\n["); cache_line_size = rtems_cache_get_data_line_size(); if (cache_line_size == 0) { @@ -240,8 +233,8 @@ static void Init(rtems_task_argument arg) main_data = malloc(data_size); rtems_test_assert(main_data != NULL); - test(false, load); - test(true, load); + test(true, false, load); + test(false, true, load); for (load = 1; load < rtems_scheduler_get_processor_maximum(); ++load) { rtems_status_code sc; @@ -266,10 +259,10 @@ static void Init(rtems_task_argument arg) sc = rtems_task_start(id, load_task, (rtems_task_argument) load_data); rtems_test_assert(sc == RTEMS_SUCCESSFUL); - test(true, load); + test(false, true, load); } - printf("</Test>\n"); + printf("\n }\n]\n*** END OF JSON DATA ***\n"); TEST_END(); rtems_test_exit(0); diff --git a/testsuites/tmtests/tmcontext01/plot.py b/testsuites/tmtests/tmcontext01/plot.py index ce59efabe3..944a5962c2 100644 --- a/testsuites/tmtests/tmcontext01/plot.py +++ b/testsuites/tmtests/tmcontext01/plot.py @@ -1,7 +1,6 @@ # SPDX-License-Identifier: BSD-2-Clause -# -# Copyright (c) 2014 embedded brains GmbH & Co. KG +# Copyright (C) 2014, 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 @@ -23,48 +22,38 @@ # 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. -# -import libxml2 -from libxml2 import xmlNode -import matplotlib.pyplot as plt -doc = libxml2.parseFile("tmcontext01.scn") -ctx = doc.xpathNewContext() +import json +import re +import matplotlib.pyplot as plt # type: ignore +from matplotlib import ticker # type: ignore + + +def _plot(data: dict) -> None: + _, axes = plt.subplots() + axes.set_title("Context Switch Timing Test") + axes.set_xlabel("Function Nest Level") + axes.set_ylabel("Context Switch Time [μs]") + x = list(range(0, len(data[0]["stats-by-function-nest-level"]))) + axes.xaxis.set_major_locator(ticker.FixedLocator(x)) + for samples in data: + y = [ + values[2] / 1000.0 + for values in samples["stats-by-function-nest-level"] + ] + axes.plot(x, y, label=samples["environment"], marker='o') + axes.legend(loc='best') + plt.savefig("tmcontext01.png") + plt.savefig("tmcontext01.pdf") + plt.close() -colors = ['k', 'r', 'b', 'g', 'y', 'm'] -def plot(y, color, label, first): - n=len(y) - x=range(0, n) - if first: - plt.plot(x, y, color=color, label=label) - else: - plt.plot(x, y, color=color) +_JSON_DATA = re.compile( + r"\*\*\* BEGIN OF JSON DATA \*\*\*(.*)" + r"\*\*\* END OF JSON DATA \*\*\*", re.DOTALL) -plt.title("context switch timing test") -plt.xlabel('function nest level') -plt.ylabel('context switch time [ns]') +with open("tmcontext01.scn", "r", encoding="utf-8") as src: + match = _JSON_DATA.search(src.read()) + data = json.loads(match.group(1)) -c = 0 -for e in ["normal", "dirty"]: - first = True - for i in ["Min", "Q1", "Q2", "Q3", "Max"]: - y=map(xmlNode.getContent, ctx.xpathEval("/Test/ContextSwitchTest[@environment='" + e + "' and not(@load)]/Sample/" + i)) - plot(y, colors[c], e, first) - first = False - c = c + 1 -load = 1 -while load > 0: - first = True - for i in ["Min", "Q1", "Q2", "Q3", "Max"]: - y=map(xmlNode.getContent, ctx.xpathEval("/Test/ContextSwitchTest[@environment='dirty' and @load='" + str(load) + "']/Sample/" + i)) - if len(y) > 0: - plot(y, colors[c], "load " + str(load), first) - first = False - else: - load = 0 - if load > 0: - load = load + 1 - c = c + 1 -plt.legend() -plt.show() +_plot(data) diff --git a/testsuites/tmtests/tmcontext01/tmcontext01.scn b/testsuites/tmtests/tmcontext01/tmcontext01.scn index 9044619319..8347d8b3fb 100644 --- a/testsuites/tmtests/tmcontext01/tmcontext01.scn +++ b/testsuites/tmtests/tmcontext01/tmcontext01.scn @@ -1,255 +1,124 @@ -<?xml version="1.0"?> -<!-- *** TEST TMCONTEXT 1 *** --> -<Test> - <ContextSwitchTest environment="normal"> - <Sample functionNestLevel="0"> - <Min unit="ns">2440</Min><Q1 unit="ns">2440</Q1><Q2 unit="ns">2480</Q2><Q3 unit="ns">2480</Q3><Max unit="ns">2800</Max> - </Sample> - <Sample functionNestLevel="1"> - <Min unit="ns">3520</Min><Q1 unit="ns">3760</Q1><Q2 unit="ns">3800</Q2><Q3 unit="ns">3800</Q3><Max unit="ns">4120</Max> - </Sample> - <Sample functionNestLevel="2"> - <Min unit="ns">4280</Min><Q1 unit="ns">4720</Q1><Q2 unit="ns">4720</Q2><Q3 unit="ns">5040</Q3><Max unit="ns">5080</Max> - </Sample> - <Sample functionNestLevel="3"> - <Min unit="ns">5320</Min><Q1 unit="ns">5640</Q1><Q2 unit="ns">5680</Q2><Q3 unit="ns">5960</Q3><Max unit="ns">6000</Max> - </Sample> - <Sample functionNestLevel="4"> - <Min unit="ns">6360</Min><Q1 unit="ns">6600</Q1><Q2 unit="ns">6600</Q2><Q3 unit="ns">6920</Q3><Max unit="ns">6920</Max> - </Sample> - <Sample functionNestLevel="5"> - <Min unit="ns">7480</Min><Q1 unit="ns">7520</Q1><Q2 unit="ns">7840</Q2><Q3 unit="ns">7840</Q3><Max unit="ns">7880</Max> - </Sample> - <Sample functionNestLevel="6"> - <Min unit="ns">8480</Min><Q1 unit="ns">8480</Q1><Q2 unit="ns">8800</Q2><Q3 unit="ns">8800</Q3><Max unit="ns">8840</Max> - </Sample> - <Sample functionNestLevel="7"> - <Min unit="ns">8840</Min><Q1 unit="ns">8960</Q1><Q2 unit="ns">9280</Q2><Q3 unit="ns">9280</Q3><Max unit="ns">9320</Max> - </Sample> - <Sample functionNestLevel="8"> - <Min unit="ns">8920</Min><Q1 unit="ns">8960</Q1><Q2 unit="ns">9280</Q2><Q3 unit="ns">9280</Q3><Max unit="ns">9320</Max> - </Sample> - <Sample functionNestLevel="9"> - <Min unit="ns">8920</Min><Q1 unit="ns">8960</Q1><Q2 unit="ns">8960</Q2><Q3 unit="ns">9280</Q3><Max unit="ns">9280</Max> - </Sample> - <Sample functionNestLevel="10"> - <Min unit="ns">8800</Min><Q1 unit="ns">8960</Q1><Q2 unit="ns">9240</Q2><Q3 unit="ns">9280</Q3><Max unit="ns">9280</Max> - </Sample> - <Sample functionNestLevel="11"> - <Min unit="ns">8920</Min><Q1 unit="ns">8960</Q1><Q2 unit="ns">9280</Q2><Q3 unit="ns">9280</Q3><Max unit="ns">9280</Max> - </Sample> - <Sample functionNestLevel="12"> - <Min unit="ns">8920</Min><Q1 unit="ns">8960</Q1><Q2 unit="ns">9240</Q2><Q3 unit="ns">9280</Q3><Max unit="ns">9320</Max> - </Sample> - <Sample functionNestLevel="13"> - <Min unit="ns">8920</Min><Q1 unit="ns">8960</Q1><Q2 unit="ns">9240</Q2><Q3 unit="ns">9280</Q3><Max unit="ns">9280</Max> - </Sample> - <Sample functionNestLevel="14"> - <Min unit="ns">8920</Min><Q1 unit="ns">8960</Q1><Q2 unit="ns">9240</Q2><Q3 unit="ns">9280</Q3><Max unit="ns">9280</Max> - </Sample> - <Sample functionNestLevel="15"> - <Min unit="ns">8920</Min><Q1 unit="ns">8960</Q1><Q2 unit="ns">8960</Q2><Q3 unit="ns">9280</Q3><Max unit="ns">9280</Max> - </Sample> - </ContextSwitchTest> - <ContextSwitchTest environment="dirty"> - <Sample functionNestLevel="0"> - <Min unit="ns">9720</Min><Q1 unit="ns">10560</Q1><Q2 unit="ns">10600</Q2><Q3 unit="ns">10680</Q3><Max unit="ns">11160</Max> - </Sample> - <Sample functionNestLevel="1"> - <Min unit="ns">11840</Min><Q1 unit="ns">12280</Q1><Q2 unit="ns">12560</Q2><Q3 unit="ns">12600</Q3><Max unit="ns">12640</Max> - </Sample> - <Sample functionNestLevel="2"> - <Min unit="ns">12880</Min><Q1 unit="ns">13560</Q1><Q2 unit="ns">13600</Q2><Q3 unit="ns">13640</Q3><Max unit="ns">13680</Max> - </Sample> - <Sample functionNestLevel="3"> - <Min unit="ns">13960</Min><Q1 unit="ns">14640</Q1><Q2 unit="ns">14680</Q2><Q3 unit="ns">14720</Q3><Max unit="ns">14720</Max> - </Sample> - <Sample functionNestLevel="4"> - <Min unit="ns">15000</Min><Q1 unit="ns">15680</Q1><Q2 unit="ns">15760</Q2><Q3 unit="ns">15760</Q3><Max unit="ns">15800</Max> - </Sample> - <Sample functionNestLevel="5"> - <Min unit="ns">16320</Min><Q1 unit="ns">16720</Q1><Q2 unit="ns">16800</Q2><Q3 unit="ns">16800</Q3><Max unit="ns">17040</Max> - </Sample> - <Sample functionNestLevel="6"> - <Min unit="ns">17320</Min><Q1 unit="ns">17560</Q1><Q2 unit="ns">17800</Q2><Q3 unit="ns">17880</Q3><Max unit="ns">18160</Max> - </Sample> - <Sample functionNestLevel="7"> - <Min unit="ns">17440</Min><Q1 unit="ns">17800</Q1><Q2 unit="ns">17840</Q2><Q3 unit="ns">17880</Q3><Max unit="ns">18160</Max> - </Sample> - <Sample functionNestLevel="8"> - <Min unit="ns">17360</Min><Q1 unit="ns">17800</Q1><Q2 unit="ns">17840</Q2><Q3 unit="ns">17880</Q3><Max unit="ns">18200</Max> - </Sample> - <Sample functionNestLevel="9"> - <Min unit="ns">17400</Min><Q1 unit="ns">17800</Q1><Q2 unit="ns">17840</Q2><Q3 unit="ns">17880</Q3><Max unit="ns">18120</Max> - </Sample> - <Sample functionNestLevel="10"> - <Min unit="ns">17320</Min><Q1 unit="ns">17800</Q1><Q2 unit="ns">17840</Q2><Q3 unit="ns">17880</Q3><Max unit="ns">18200</Max> - </Sample> - <Sample functionNestLevel="11"> - <Min unit="ns">17360</Min><Q1 unit="ns">17840</Q1><Q2 unit="ns">17840</Q2><Q3 unit="ns">17880</Q3><Max unit="ns">18160</Max> - </Sample> - <Sample functionNestLevel="12"> - <Min unit="ns">17360</Min><Q1 unit="ns">17800</Q1><Q2 unit="ns">17840</Q2><Q3 unit="ns">17880</Q3><Max unit="ns">18160</Max> - </Sample> - <Sample functionNestLevel="13"> - <Min unit="ns">17360</Min><Q1 unit="ns">17800</Q1><Q2 unit="ns">17840</Q2><Q3 unit="ns">17880</Q3><Max unit="ns">18200</Max> - </Sample> - <Sample functionNestLevel="14"> - <Min unit="ns">17760</Min><Q1 unit="ns">17840</Q1><Q2 unit="ns">17840</Q2><Q3 unit="ns">17880</Q3><Max unit="ns">18200</Max> - </Sample> - <Sample functionNestLevel="15"> - <Min unit="ns">17360</Min><Q1 unit="ns">17800</Q1><Q2 unit="ns">17840</Q2><Q3 unit="ns">17880</Q3><Max unit="ns">18200</Max> - </Sample> - </ContextSwitchTest> - <ContextSwitchTest environment="dirty" load="1"> - <Sample functionNestLevel="0"> - <Min unit="ns">23800</Min><Q1 unit="ns">24440</Q1><Q2 unit="ns">24640</Q2><Q3 unit="ns">24720</Q3><Max unit="ns">25080</Max> - </Sample> - <Sample functionNestLevel="1"> - <Min unit="ns">28040</Min><Q1 unit="ns">28560</Q1><Q2 unit="ns">28640</Q2><Q3 unit="ns">28680</Q3><Max unit="ns">28720</Max> - </Sample> - <Sample functionNestLevel="2"> - <Min unit="ns">31600</Min><Q1 unit="ns">32160</Q1><Q2 unit="ns">32160</Q2><Q3 unit="ns">32200</Q3><Max unit="ns">32280</Max> - </Sample> - <Sample functionNestLevel="3"> - <Min unit="ns">35400</Min><Q1 unit="ns">35720</Q1><Q2 unit="ns">35760</Q2><Q3 unit="ns">35920</Q3><Max unit="ns">36080</Max> - </Sample> - <Sample functionNestLevel="4"> - <Min unit="ns">38960</Min><Q1 unit="ns">39280</Q1><Q2 unit="ns">39320</Q2><Q3 unit="ns">39560</Q3><Max unit="ns">39640</Max> - </Sample> - <Sample functionNestLevel="5"> - <Min unit="ns">42480</Min><Q1 unit="ns">42840</Q1><Q2 unit="ns">43080</Q2><Q3 unit="ns">43120</Q3><Max unit="ns">43200</Max> - </Sample> - <Sample functionNestLevel="6"> - <Min unit="ns">46120</Min><Q1 unit="ns">46600</Q1><Q2 unit="ns">46640</Q2><Q3 unit="ns">46680</Q3><Max unit="ns">46880</Max> - </Sample> - <Sample functionNestLevel="7"> - <Min unit="ns">46080</Min><Q1 unit="ns">46600</Q1><Q2 unit="ns">46640</Q2><Q3 unit="ns">46680</Q3><Max unit="ns">46760</Max> - </Sample> - <Sample functionNestLevel="8"> - <Min unit="ns">46320</Min><Q1 unit="ns">46600</Q1><Q2 unit="ns">46640</Q2><Q3 unit="ns">46680</Q3><Max unit="ns">47040</Max> - </Sample> - <Sample functionNestLevel="9"> - <Min unit="ns">46040</Min><Q1 unit="ns">46600</Q1><Q2 unit="ns">46640</Q2><Q3 unit="ns">46680</Q3><Max unit="ns">46960</Max> - </Sample> - <Sample functionNestLevel="10"> - <Min unit="ns">45960</Min><Q1 unit="ns">46600</Q1><Q2 unit="ns">46640</Q2><Q3 unit="ns">46680</Q3><Max unit="ns">46960</Max> - </Sample> - <Sample functionNestLevel="11"> - <Min unit="ns">46040</Min><Q1 unit="ns">46600</Q1><Q2 unit="ns">46640</Q2><Q3 unit="ns">46680</Q3><Max unit="ns">46720</Max> - </Sample> - <Sample functionNestLevel="12"> - <Min unit="ns">46080</Min><Q1 unit="ns">46600</Q1><Q2 unit="ns">46640</Q2><Q3 unit="ns">46680</Q3><Max unit="ns">46920</Max> - </Sample> - <Sample functionNestLevel="13"> - <Min unit="ns">46080</Min><Q1 unit="ns">46600</Q1><Q2 unit="ns">46640</Q2><Q3 unit="ns">46680</Q3><Max unit="ns">46720</Max> - </Sample> - <Sample functionNestLevel="14"> - <Min unit="ns">46280</Min><Q1 unit="ns">46600</Q1><Q2 unit="ns">46640</Q2><Q3 unit="ns">46680</Q3><Max unit="ns">46760</Max> - </Sample> - <Sample functionNestLevel="15"> - <Min unit="ns">46360</Min><Q1 unit="ns">46600</Q1><Q2 unit="ns">46640</Q2><Q3 unit="ns">46680</Q3><Max unit="ns">47040</Max> - </Sample> - </ContextSwitchTest> - <ContextSwitchTest environment="dirty" load="2"> - <Sample functionNestLevel="0"> - <Min unit="ns">37560</Min><Q1 unit="ns">38200</Q1><Q2 unit="ns">38240</Q2><Q3 unit="ns">38480</Q3><Max unit="ns">38600</Max> - </Sample> - <Sample functionNestLevel="1"> - <Min unit="ns">44880</Min><Q1 unit="ns">45480</Q1><Q2 unit="ns">45560</Q2><Q3 unit="ns">45600</Q3><Max unit="ns">45640</Max> - </Sample> - <Sample functionNestLevel="2"> - <Min unit="ns">50920</Min><Q1 unit="ns">51560</Q1><Q2 unit="ns">51600</Q2><Q3 unit="ns">51800</Q3><Max unit="ns">51960</Max> - </Sample> - <Sample functionNestLevel="3"> - <Min unit="ns">57320</Min><Q1 unit="ns">57640</Q1><Q2 unit="ns">57880</Q2><Q3 unit="ns">57920</Q3><Max unit="ns">58240</Max> - </Sample> - <Sample functionNestLevel="4"> - <Min unit="ns">63320</Min><Q1 unit="ns">63920</Q1><Q2 unit="ns">63960</Q2><Q3 unit="ns">64000</Q3><Max unit="ns">64600</Max> - </Sample> - <Sample functionNestLevel="5"> - <Min unit="ns">69840</Min><Q1 unit="ns">69960</Q1><Q2 unit="ns">70040</Q2><Q3 unit="ns">70240</Q3><Max unit="ns">70400</Max> - </Sample> - <Sample functionNestLevel="6"> - <Min unit="ns">75600</Min><Q1 unit="ns">76200</Q1><Q2 unit="ns">76280</Q2><Q3 unit="ns">76320</Q3><Max unit="ns">76880</Max> - </Sample> - <Sample functionNestLevel="7"> - <Min unit="ns">75440</Min><Q1 unit="ns">76240</Q1><Q2 unit="ns">76280</Q2><Q3 unit="ns">76320</Q3><Max unit="ns">76840</Max> - </Sample> - <Sample functionNestLevel="8"> - <Min unit="ns">75640</Min><Q1 unit="ns">76200</Q1><Q2 unit="ns">76280</Q2><Q3 unit="ns">76320</Q3><Max unit="ns">76960</Max> - </Sample> - <Sample functionNestLevel="9"> - <Min unit="ns">75640</Min><Q1 unit="ns">76240</Q1><Q2 unit="ns">76280</Q2><Q3 unit="ns">76320</Q3><Max unit="ns">76440</Max> - </Sample> - <Sample functionNestLevel="10"> - <Min unit="ns">75920</Min><Q1 unit="ns">76240</Q1><Q2 unit="ns">76280</Q2><Q3 unit="ns">76320</Q3><Max unit="ns">76400</Max> - </Sample> - <Sample functionNestLevel="11"> - <Min unit="ns">75600</Min><Q1 unit="ns">76200</Q1><Q2 unit="ns">76280</Q2><Q3 unit="ns">76320</Q3><Max unit="ns">76920</Max> - </Sample> - <Sample functionNestLevel="12"> - <Min unit="ns">75360</Min><Q1 unit="ns">76200</Q1><Q2 unit="ns">76280</Q2><Q3 unit="ns">76320</Q3><Max unit="ns">76440</Max> - </Sample> - <Sample functionNestLevel="13"> - <Min unit="ns">75360</Min><Q1 unit="ns">76200</Q1><Q2 unit="ns">76280</Q2><Q3 unit="ns">76320</Q3><Max unit="ns">76960</Max> - </Sample> - <Sample functionNestLevel="14"> - <Min unit="ns">75640</Min><Q1 unit="ns">76160</Q1><Q2 unit="ns">76280</Q2><Q3 unit="ns">76320</Q3><Max unit="ns">76960</Max> - </Sample> - <Sample functionNestLevel="15"> - <Min unit="ns">75960</Min><Q1 unit="ns">76240</Q1><Q2 unit="ns">76280</Q2><Q3 unit="ns">76320</Q3><Max unit="ns">76400</Max> - </Sample> - </ContextSwitchTest> - <ContextSwitchTest environment="dirty" load="3"> - <Sample functionNestLevel="0"> - <Min unit="ns">52400</Min><Q1 unit="ns">52480</Q1><Q2 unit="ns">52520</Q2><Q3 unit="ns">52800</Q3><Max unit="ns">53720</Max> - </Sample> - <Sample functionNestLevel="1"> - <Min unit="ns">61680</Min><Q1 unit="ns">62600</Q1><Q2 unit="ns">62640</Q2><Q3 unit="ns">62680</Q3><Max unit="ns">62800</Max> - </Sample> - <Sample functionNestLevel="2"> - <Min unit="ns">70160</Min><Q1 unit="ns">71160</Q1><Q2 unit="ns">71360</Q2><Q3 unit="ns">71480</Q3><Max unit="ns">72160</Max> - </Sample> - <Sample functionNestLevel="3"> - <Min unit="ns">79000</Min><Q1 unit="ns">79960</Q1><Q2 unit="ns">80000</Q2><Q3 unit="ns">80000</Q3><Max unit="ns">80920</Max> - </Sample> - <Sample functionNestLevel="4"> - <Min unit="ns">87600</Min><Q1 unit="ns">88480</Q1><Q2 unit="ns">88760</Q2><Q3 unit="ns">88800</Q3><Max unit="ns">88880</Max> - </Sample> - <Sample functionNestLevel="5"> - <Min unit="ns">96320</Min><Q1 unit="ns">97280</Q1><Q2 unit="ns">97320</Q2><Q3 unit="ns">97360</Q3><Max unit="ns">98600</Max> - </Sample> - <Sample functionNestLevel="6"> - <Min unit="ns">105160</Min><Q1 unit="ns">105840</Q1><Q2 unit="ns">106080</Q2><Q3 unit="ns">106160</Q3><Max unit="ns">107120</Max> - </Sample> - <Sample functionNestLevel="7"> - <Min unit="ns">105200</Min><Q1 unit="ns">106040</Q1><Q2 unit="ns">106120</Q2><Q3 unit="ns">106160</Q3><Max unit="ns">107080</Max> - </Sample> - <Sample functionNestLevel="8"> - <Min unit="ns">104880</Min><Q1 unit="ns">105920</Q1><Q2 unit="ns">106080</Q2><Q3 unit="ns">106160</Q3><Max unit="ns">106280</Max> - </Sample> - <Sample functionNestLevel="9"> - <Min unit="ns">105760</Min><Q1 unit="ns">106000</Q1><Q2 unit="ns">106120</Q2><Q3 unit="ns">106160</Q3><Max unit="ns">106280</Max> - </Sample> - <Sample functionNestLevel="10"> - <Min unit="ns">104880</Min><Q1 unit="ns">105880</Q1><Q2 unit="ns">106080</Q2><Q3 unit="ns">106160</Q3><Max unit="ns">107080</Max> - </Sample> - <Sample functionNestLevel="11"> - <Min unit="ns">105720</Min><Q1 unit="ns">105960</Q1><Q2 unit="ns">106120</Q2><Q3 unit="ns">106160</Q3><Max unit="ns">106240</Max> - </Sample> - <Sample functionNestLevel="12"> - <Min unit="ns">104960</Min><Q1 unit="ns">105880</Q1><Q2 unit="ns">106080</Q2><Q3 unit="ns">106160</Q3><Max unit="ns">106280</Max> - </Sample> - <Sample functionNestLevel="13"> - <Min unit="ns">104880</Min><Q1 unit="ns">105880</Q1><Q2 unit="ns">106120</Q2><Q3 unit="ns">106160</Q3><Max unit="ns">106280</Max> - </Sample> - <Sample functionNestLevel="14"> - <Min unit="ns">105720</Min><Q1 unit="ns">105880</Q1><Q2 unit="ns">106080</Q2><Q3 unit="ns">106160</Q3><Max unit="ns">106240</Max> - </Sample> - <Sample functionNestLevel="15"> - <Min unit="ns">104920</Min><Q1 unit="ns">105840</Q1><Q2 unit="ns">106120</Q2><Q3 unit="ns">106160</Q3><Max unit="ns">106280</Max> - </Sample> - </ContextSwitchTest> -</Test> -<!-- *** END OF TEST TMCONTEXT 1 *** --> + + SIS - SPARC/RISCV instruction simulator 2.30, copyright Jiri Gaisler 2020 + Bug-reports to jiri@gaisler.se + + GR740/LEON4 emulation enabled, 4 cpus online, delta 50 clocks + + Loaded build/sparc/gr740/testsuites/tmtests/tmcontext01.exe, entry 0x00000000 + + +*** BEGIN OF TEST TMCONTEXT 1 *** +*** TEST VERSION: 6.0.0.aa07dc10645c3dc855c3df2b53520aebc2751b06 +*** TEST STATE: EXPECTED_PASS +*** TEST BUILD: RTEMS_SMP +*** TEST TOOLS: 13.2.0 20230727 (RTEMS 6, RSB d3d738c35a71ca05f675b188539225099401ac79, Newlib a021448) +*** BEGIN OF JSON DATA *** +[ + { + "environment": "HotCache", + "stats-by-function-nest-level": [ + [2820, 2820, 2820, 2820, 2820], + [3640, 3640, 3640, 3640, 3640], + [4460, 4460, 4460, 4460, 4460], + [5280, 5280, 5280, 5280, 5280], + [6100, 6100, 6100, 6100, 6100], + [6920, 6920, 6920, 6920, 6920], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740] + ] + }, { + "environment": "DirtyCache", + "stats-by-function-nest-level": [ + [2820, 2820, 2820, 2820, 2820], + [3640, 3640, 3640, 3640, 3640], + [4460, 4460, 4460, 4460, 4460], + [5280, 5280, 5280, 5280, 5280], + [6100, 6100, 6100, 6100, 6100], + [6920, 6920, 6920, 6920, 6920], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740] + ] + }, { + "environment": "Load/1", + "stats-by-function-nest-level": [ + [2820, 2820, 2820, 2820, 2820], + [3640, 3640, 3640, 3640, 3640], + [4460, 4460, 4460, 4460, 4460], + [5280, 5280, 5280, 5280, 5280], + [6100, 6100, 6100, 6100, 6100], + [6920, 6920, 6920, 6920, 6920], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740] + ] + }, { + "environment": "Load/2", + "stats-by-function-nest-level": [ + [2820, 2820, 2820, 2820, 2820], + [3640, 3640, 3640, 3640, 3640], + [4460, 4460, 4460, 4460, 4460], + [5280, 5280, 5280, 5280, 5280], + [6100, 6100, 6100, 6100, 6100], + [6920, 6920, 6920, 6920, 6920], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740] + ] + }, { + "environment": "Load/3", + "stats-by-function-nest-level": [ + [2820, 2820, 2820, 2820, 2820], + [3640, 3640, 3640, 3640, 3640], + [4460, 4460, 4460, 4460, 4460], + [5280, 5280, 5280, 5280, 5280], + [6100, 6100, 6100, 6100, 6100], + [6920, 6920, 6920, 6920, 6920], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740], + [7740, 7740, 7740, 7740, 7740] + ] + } +] +*** END OF JSON DATA *** + +*** END OF TEST TMCONTEXT 1 *** + +cpu 3 in error mode (tt = 0x80) + 2081487650 00009060: 91d02000 ta 0x0 diff --git a/testsuites/tmtests/tmfine01/init.c b/testsuites/tmtests/tmfine01/init.c index 931946ee94..c05894f6da 100644 --- a/testsuites/tmtests/tmfine01/init.c +++ b/testsuites/tmtests/tmfine01/init.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-2-Clause */ /* - * Copyright (C) 2015, 2017 embedded brains GmbH & Co. KG + * Copyright (C) 2015, 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 @@ -55,6 +55,8 @@ typedef struct { typedef struct { rtems_test_parallel_context base; + const char *test_sep; + const char *counter_sep; rtems_id master; rtems_id sema; rtems_id mq[CPU_COUNT]; @@ -89,24 +91,46 @@ static rtems_interval test_init( } static void test_fini( - const char *name, + test_context *ctx, + const char *type, + const char *description, uint32_t *counters, size_t active_workers ) { + const char *value_sep; size_t i; - printf(" <%s activeWorker=\"%zu\">\n", name, active_workers); + if (active_workers == 1) { + printf( + "%s{\n" + " \"type\": \"%s\",\n" + " \"description\": \"%s\",\n" + " \"counter\": [", + ctx->test_sep, + type, + description + ); + ctx->test_sep = ", "; + ctx->counter_sep = "\n "; + } + + printf("%s[", ctx->counter_sep); + ctx->counter_sep = "],\n "; + value_sep = ""; for (i = 0; i < active_workers; ++i) { printf( - " <Counter worker=\"%zu\">%" PRIu32 "</Counter>\n", - i, + "%s%" PRIu32, + value_sep, counters[i] ); + value_sep = ", "; } - printf(" </%s>\n", name); + if (active_workers == rtems_scheduler_get_processor_maximum()) { + printf("]\n ]\n }"); + } } static void test_self_event_body( @@ -150,7 +174,9 @@ static void test_self_event_fini( test_context *ctx = (test_context *) base; test_fini( - "SelfEvent", + ctx, + "event", + "Send Event to Self", &ctx->self_event_ops[active_workers - 1][0], active_workers ); @@ -201,7 +227,9 @@ static void test_all_to_one_event_fini( test_context *ctx = (test_context *) base; test_fini( - "AllToOneEvent", + ctx, + "event", + "Send Event to One", &ctx->all_to_one_event_ops[active_workers - 1][0], active_workers ); @@ -242,7 +270,9 @@ static void test_one_mutex_fini( test_context *ctx = (test_context *) base; test_fini( - "OneMutex", + ctx, + "contested-mutex", + "Obtain/Release Contested Classic Inheritance Mutex", &ctx->one_mutex_ops[active_workers - 1][0], active_workers ); @@ -296,7 +326,9 @@ static void test_many_mutex_fini( test_context *ctx = (test_context *) base; test_fini( - "ManyMutex", + ctx, + "private-mutex", + "Obtain/Release Private Classic Inheritance Mutex", &ctx->many_mutex_ops[active_workers - 1][0], active_workers ); @@ -347,7 +379,9 @@ static void test_self_msg_fini( test_context *ctx = (test_context *) base; test_fini( - "SelfMsg", + ctx, + "message", + "Send Message to Self", &ctx->self_msg_ops[active_workers - 1][0], active_workers ); @@ -401,7 +435,9 @@ static void test_many_to_one_msg_fini( test_context *ctx = (test_context *) base; test_fini( - "ManyToOneMsg", + ctx, + "message", + "Send Message to One Receiver", &ctx->many_to_one_msg_ops[active_workers - 1][0], active_workers ); @@ -439,7 +475,9 @@ static void test_many_sys_lock_mutex_fini( test_context *ctx = (test_context *) base; test_fini( - "ManySysLockMutex", + ctx, + "private-mutex", + "Obtain/Release Private <sys/lock.h> Mutex", &ctx->many_sys_lock_mutex_ops[active_workers - 1][0], active_workers ); @@ -493,7 +531,9 @@ static void test_many_classic_ceiling_fini( test_context *ctx = (test_context *) base; test_fini( - "ManyClassicCeilingMutex", + ctx, + "private-mutex", + "Obtain/Release Private Classic Ceiling Mutex", &ctx->many_classic_ceiling_ops[active_workers - 1][0], active_workers ); @@ -548,7 +588,9 @@ static void test_many_classic_mrsp_fini( test_context *ctx = (test_context *) base; test_fini( - "ManyClassicMrsPMutex", + ctx, + "private-mutex", + "Obtain/Release Private Classic MrsP Mutex", &ctx->many_classic_mrsp_ops[active_workers - 1][0], active_workers ); @@ -591,7 +633,9 @@ static void test_many_pthread_spinlock_fini( test_context *ctx = (test_context *) base; test_fini( - "ManyPthreadSpinlock", + ctx, + "private-mutex", + "Obtain/Release Private Pthread Spinlock", &ctx->many_pthread_spinlock_ops[active_workers - 1][0], active_workers ); @@ -645,7 +689,9 @@ static void test_many_pthread_mutex_inherit_fini( test_context *ctx = (test_context *) base; test_fini( - "ManyPthreadMutexInherit", + ctx, + "private-mutex", + "Obtain/Release Private Pthread Inheritance Mutex", &ctx->many_pthread_mutex_inherit_ops[active_workers - 1][0], active_workers ); @@ -705,7 +751,9 @@ static void test_many_pthread_mutex_protect_fini( test_context *ctx = (test_context *) base; test_fini( - "ManyPthreadMutexProtect", + ctx, + "private-mutex", + "Obtain/Release Private Pthread Ceiling Mutex", &ctx->many_pthread_mutex_protect_ops[active_workers - 1][0], active_workers ); @@ -729,11 +777,6 @@ static const rtems_test_parallel_job test_jobs[] = { .cascade = true }, { .init = test_init, - .body = test_many_mutex_body, - .fini = test_many_mutex_fini, - .cascade = true - }, { - .init = test_init, .body = test_self_msg_body, .fini = test_self_msg_fini, .cascade = true @@ -744,33 +787,38 @@ static const rtems_test_parallel_job test_jobs[] = { .cascade = true }, { .init = test_init, + .body = test_many_pthread_spinlock_body, + .fini = test_many_pthread_spinlock_fini, + .cascade = true + }, { + .init = test_init, .body = test_many_sys_lock_mutex_body, .fini = test_many_sys_lock_mutex_fini, .cascade = true }, { .init = test_init, - .body = test_many_classic_ceiling_body, - .fini = test_many_classic_ceiling_fini, + .body = test_many_pthread_mutex_inherit_body, + .fini = test_many_pthread_mutex_inherit_fini, .cascade = true }, { .init = test_init, - .body = test_many_classic_mrsp_body, - .fini = test_many_classic_mrsp_fini, + .body = test_many_mutex_body, + .fini = test_many_mutex_fini, .cascade = true }, { .init = test_init, - .body = test_many_pthread_spinlock_body, - .fini = test_many_pthread_spinlock_fini, + .body = test_many_pthread_mutex_protect_body, + .fini = test_many_pthread_mutex_protect_fini, .cascade = true }, { .init = test_init, - .body = test_many_pthread_mutex_inherit_body, - .fini = test_many_pthread_mutex_inherit_fini, + .body = test_many_classic_ceiling_body, + .fini = test_many_classic_ceiling_fini, .cascade = true }, { .init = test_init, - .body = test_many_pthread_mutex_protect_body, - .fini = test_many_pthread_mutex_protect_fini, + .body = test_many_classic_mrsp_body, + .fini = test_many_classic_mrsp_fini, .cascade = true } }; @@ -778,7 +826,6 @@ static const rtems_test_parallel_job test_jobs[] = { static void Init(rtems_task_argument arg) { test_context *ctx = &test_instance; - const char *test = "TestTimeFine01"; rtems_status_code sc; size_t i; @@ -806,8 +853,9 @@ static void Init(rtems_task_argument arg) rtems_test_assert(sc == RTEMS_SUCCESSFUL); } - printf("<%s>\n", test); + printf("*** BEGIN OF JSON DATA ***\n[\n "); + ctx->test_sep = ""; rtems_test_parallel( &ctx->base, NULL, @@ -815,7 +863,7 @@ static void Init(rtems_task_argument arg) RTEMS_ARRAY_SIZE(test_jobs) ); - printf("</%s>\n", test); + printf("\n]\n*** END OF JSON DATA ***\n"); TEST_END(); rtems_test_exit(0); diff --git a/testsuites/tmtests/tmfine01/tmfine01.py b/testsuites/tmtests/tmfine01/tmfine01.py index 54a168a02f..54363bee34 100644 --- a/testsuites/tmtests/tmfine01/tmfine01.py +++ b/testsuites/tmtests/tmfine01/tmfine01.py @@ -1,9 +1,6 @@ # SPDX-License-Identifier: BSD-2-Clause -#!/usr/bin/env python - -# -# Copyright (c) 2016 embedded brains GmbH & Co. KG +# Copyright (C) 2016, 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 @@ -25,57 +22,41 @@ # 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. -# +import json import re -import libxml2 -from libxml2 import xmlNode -import matplotlib.pyplot as plt -data = open('tmfine01.scn').read() -data = re.sub(r'\*\*\*.*\*\*\*', '', data) -doc = libxml2.parseDoc(data) -ctx = doc.xpathNewContext() - -plt.yscale('log') -plt.title('Uncontested Mutex Performance') -plt.xlabel('Active Workers') -plt.ylabel('Operation Count') - -def m(n): - return int(n.getContent()) - -def getCounterSums(variant): - w = 1 - y = [] - while True: - c = map(m, ctx.xpathEval('/TestTimeFine01/' + variant + '[@activeWorker="' + str(w) + '"]/Counter')) - if not c: - break - y.append(sum(c)) - w = w + 1 - return y - -y = getCounterSums('ManySysLockMutex') -x = range(1, len(y) + 1) -plt.plot(x, y, label = 'Sys Lock Mutex', marker = 'o') - -y = getCounterSums('ManyMutex') -plt.plot(x, y, label = 'Classic Inheritance Mutex', marker = 'o') - -y = getCounterSums('ManyClassicCeilingMutex') -plt.plot(x, y, label = 'Classic Ceiling Mutex', marker = 'o') - -y = getCounterSums('ManyClassicMrsPMutex') -plt.plot(x, y, label = 'Classic MrsP Mutex', marker = 'o') - -y = getCounterSums('ManyPthreadSpinlock') -plt.plot(x, y, label = 'Pthread Spinlock', marker = 'o') - -y = getCounterSums('ManyPthreadMutexInherit') -plt.plot(x, y, label = 'Pthread Mutex Inherit', marker = 'o') - -y = getCounterSums('ManyPthreadMutexProtect') -plt.plot(x, y, label = 'Pthread Mutex Protect', marker = 'o') - -plt.legend(loc = 'best') -plt.show() +import matplotlib.pyplot as plt # type: ignore +from matplotlib import ticker # type: ignore + + +def _plot(data: dict) -> None: + _, axes = plt.subplots() + axes.set_title("Uncontested Mutex Performance") + axes.set_xlabel("Active Workers") + axes.set_ylabel("Operation Count") + x = list(range(1, len(data[0]["counter"]) + 1)) + axes.xaxis.set_major_locator(ticker.FixedLocator(x)) + for samples in data: + if samples["type"] != "private-mutex": + continue + y = [sum(values) for values in samples["counter"]] + axes.plot(x, + y, + label=samples["description"].replace( + "Obtain/Release Private ", ""), + marker="o") + axes.legend(loc="best") + plt.savefig("tmfine01.png") + plt.savefig("tmfine01.pdf") + plt.close() + + +_JSON_DATA = re.compile( + r"\*\*\* BEGIN OF JSON DATA \*\*\*(.*)" + r"\*\*\* END OF JSON DATA \*\*\*", re.DOTALL) + +with open("tmfine01.scn", "r", encoding="utf-8") as src: + match = _JSON_DATA.search(src.read()) + data = json.loads(match.group(1)) + +_plot(data) diff --git a/testsuites/tmtests/tmfine01/tmfine01.scn b/testsuites/tmtests/tmfine01/tmfine01.scn index e3dfd7757f..cf356f0806 100644 --- a/testsuites/tmtests/tmfine01/tmfine01.scn +++ b/testsuites/tmtests/tmfine01/tmfine01.scn @@ -1,4180 +1,132 @@ + + SIS - SPARC/RISCV instruction simulator 2.30, copyright Jiri Gaisler 2020 + Bug-reports to jiri@gaisler.se + + GR740/LEON4 emulation enabled, 4 cpus online, delta 50 clocks + + Loaded build/sparc/gr740/testsuites/tmtests/tmfine01.exe, entry 0x00000000 + + *** BEGIN OF TEST TMFINE 1 *** -<TestTimeFine01> - <SelfEvent activeWorker="1"> - <Counter worker="0">4676131</Counter> - </SelfEvent> - <SelfEvent activeWorker="2"> - <Counter worker="0">4641176</Counter> - <Counter worker="1">4641467</Counter> - </SelfEvent> - <SelfEvent activeWorker="3"> - <Counter worker="0">4588420</Counter> - <Counter worker="1">4588713</Counter> - <Counter worker="2">4588730</Counter> - </SelfEvent> - <SelfEvent activeWorker="4"> - <Counter worker="0">4552423</Counter> - <Counter worker="1">4552717</Counter> - <Counter worker="2">4552773</Counter> - <Counter worker="3">4552785</Counter> - </SelfEvent> - <SelfEvent activeWorker="5"> - <Counter worker="0">4503050</Counter> - <Counter worker="1">4503310</Counter> - <Counter worker="2">4503408</Counter> - <Counter worker="3">4503447</Counter> - <Counter worker="4">4503380</Counter> - </SelfEvent> - <SelfEvent activeWorker="6"> - <Counter worker="0">4506318</Counter> - <Counter worker="1">4506592</Counter> - <Counter worker="2">4506673</Counter> - <Counter worker="3">4506688</Counter> - <Counter worker="4">4506663</Counter> - <Counter worker="5">4506666</Counter> - </SelfEvent> - <SelfEvent activeWorker="7"> - <Counter worker="0">4479255</Counter> - <Counter worker="1">4479516</Counter> - <Counter worker="2">4479651</Counter> - <Counter worker="3">4479614</Counter> - <Counter worker="4">4479578</Counter> - <Counter worker="5">4479616</Counter> - <Counter worker="6">4479670</Counter> - </SelfEvent> - <SelfEvent activeWorker="8"> - <Counter worker="0">4430941</Counter> - <Counter worker="1">4431230</Counter> - <Counter worker="2">4431182</Counter> - <Counter worker="3">4431299</Counter> - <Counter worker="4">4430884</Counter> - <Counter worker="5">4430883</Counter> - <Counter worker="6">4431032</Counter> - <Counter worker="7">4431022</Counter> - </SelfEvent> - <SelfEvent activeWorker="9"> - <Counter worker="0">4448824</Counter> - <Counter worker="1">4449100</Counter> - <Counter worker="2">4448994</Counter> - <Counter worker="3">4449146</Counter> - <Counter worker="4">4448725</Counter> - <Counter worker="5">4448726</Counter> - <Counter worker="6">4448812</Counter> - <Counter worker="7">4448856</Counter> - <Counter worker="8">4683748</Counter> - </SelfEvent> - <SelfEvent activeWorker="10"> - <Counter worker="0">4434217</Counter> - <Counter worker="1">4434522</Counter> - <Counter worker="2">4434464</Counter> - <Counter worker="3">4434566</Counter> - <Counter worker="4">4434201</Counter> - <Counter worker="5">4434183</Counter> - <Counter worker="6">4434380</Counter> - <Counter worker="7">4434377</Counter> - <Counter worker="8">4645492</Counter> - <Counter worker="9">4645490</Counter> - </SelfEvent> - <SelfEvent activeWorker="11"> - <Counter worker="0">4462864</Counter> - <Counter worker="1">4463155</Counter> - <Counter worker="2">4463110</Counter> - <Counter worker="3">4463229</Counter> - <Counter worker="4">4462874</Counter> - <Counter worker="5">4462844</Counter> - <Counter worker="6">4462957</Counter> - <Counter worker="7">4462977</Counter> - <Counter worker="8">4590235</Counter> - <Counter worker="9">4590243</Counter> - <Counter worker="10">4590208</Counter> - </SelfEvent> - <SelfEvent activeWorker="12"> - <Counter worker="0">4448372</Counter> - <Counter worker="1">4448670</Counter> - <Counter worker="2">4448618</Counter> - <Counter worker="3">4448756</Counter> - <Counter worker="4">4448391</Counter> - <Counter worker="5">4448389</Counter> - <Counter worker="6">4448491</Counter> - <Counter worker="7">4448501</Counter> - <Counter worker="8">4552401</Counter> - <Counter worker="9">4552390</Counter> - <Counter worker="10">4552353</Counter> - <Counter worker="11">4552386</Counter> - </SelfEvent> - <SelfEvent activeWorker="13"> - <Counter worker="0">4427993</Counter> - <Counter worker="1">4428270</Counter> - <Counter worker="2">4428290</Counter> - <Counter worker="3">4428406</Counter> - <Counter worker="4">4428081</Counter> - <Counter worker="5">4428077</Counter> - <Counter worker="6">4428183</Counter> - <Counter worker="7">4428187</Counter> - <Counter worker="8">4507321</Counter> - <Counter worker="9">4507322</Counter> - <Counter worker="10">4507311</Counter> - <Counter worker="11">4507332</Counter> - <Counter worker="12">4507311</Counter> - </SelfEvent> - <SelfEvent activeWorker="14"> - <Counter worker="0">4456343</Counter> - <Counter worker="1">4456632</Counter> - <Counter worker="2">4456672</Counter> - <Counter worker="3">4456758</Counter> - <Counter worker="4">4456495</Counter> - <Counter worker="5">4456482</Counter> - <Counter worker="6">4456584</Counter> - <Counter worker="7">4456575</Counter> - <Counter worker="8">4507973</Counter> - <Counter worker="9">4507951</Counter> - <Counter worker="10">4507951</Counter> - <Counter worker="11">4507937</Counter> - <Counter worker="12">4507952</Counter> - <Counter worker="13">4507971</Counter> - </SelfEvent> - <SelfEvent activeWorker="15"> - <Counter worker="0">4441428</Counter> - <Counter worker="1">4441718</Counter> - <Counter worker="2">4441692</Counter> - <Counter worker="3">4441802</Counter> - <Counter worker="4">4441407</Counter> - <Counter worker="5">4441408</Counter> - <Counter worker="6">4441556</Counter> - <Counter worker="7">4441569</Counter> - <Counter worker="8">4478368</Counter> - <Counter worker="9">4478360</Counter> - <Counter worker="10">4478594</Counter> - <Counter worker="11">4478573</Counter> - <Counter worker="12">4478347</Counter> - <Counter worker="13">4478367</Counter> - <Counter worker="14">4478443</Counter> - </SelfEvent> - <SelfEvent activeWorker="16"> - <Counter worker="0">4470668</Counter> - <Counter worker="1">4470970</Counter> - <Counter worker="2">4470950</Counter> - <Counter worker="3">4471049</Counter> - <Counter worker="4">4470638</Counter> - <Counter worker="5">4470599</Counter> - <Counter worker="6">4470866</Counter> - <Counter worker="7">4470888</Counter> - <Counter worker="8">4462941</Counter> - <Counter worker="9">4462934</Counter> - <Counter worker="10">4462925</Counter> - <Counter worker="11">4463059</Counter> - <Counter worker="12">4462612</Counter> - <Counter worker="13">4462636</Counter> - <Counter worker="14">4462669</Counter> - <Counter worker="15">4462676</Counter> - </SelfEvent> - <SelfEvent activeWorker="17"> - <Counter worker="0">4451094</Counter> - <Counter worker="1">4451396</Counter> - <Counter worker="2">4451343</Counter> - <Counter worker="3">4451471</Counter> - <Counter worker="4">4451083</Counter> - <Counter worker="5">4451099</Counter> - <Counter worker="6">4451193</Counter> - <Counter worker="7">4451191</Counter> - <Counter worker="8">4450420</Counter> - <Counter worker="9">4450424</Counter> - <Counter worker="10">4450398</Counter> - <Counter worker="11">4450533</Counter> - <Counter worker="12">4450111</Counter> - <Counter worker="13">4450105</Counter> - <Counter worker="14">4450218</Counter> - <Counter worker="15">4450237</Counter> - <Counter worker="16">4682169</Counter> - </SelfEvent> - <SelfEvent activeWorker="18"> - <Counter worker="0">4435091</Counter> - <Counter worker="1">4435372</Counter> - <Counter worker="2">4435353</Counter> - <Counter worker="3">4435493</Counter> - <Counter worker="4">4435073</Counter> - <Counter worker="5">4435101</Counter> - <Counter worker="6">4435297</Counter> - <Counter worker="7">4435279</Counter> - <Counter worker="8">4435219</Counter> - <Counter worker="9">4435244</Counter> - <Counter worker="10">4435166</Counter> - <Counter worker="11">4435291</Counter> - <Counter worker="12">4434894</Counter> - <Counter worker="13">4434866</Counter> - <Counter worker="14">4435038</Counter> - <Counter worker="15">4435019</Counter> - <Counter worker="16">4644910</Counter> - <Counter worker="17">4644922</Counter> - </SelfEvent> - <SelfEvent activeWorker="19"> - <Counter worker="0">4467049</Counter> - <Counter worker="1">4467345</Counter> - <Counter worker="2">4467193</Counter> - <Counter worker="3">4467343</Counter> - <Counter worker="4">4466881</Counter> - <Counter worker="5">4466868</Counter> - <Counter worker="6">4466971</Counter> - <Counter worker="7">4466993</Counter> - <Counter worker="8">4457734</Counter> - <Counter worker="9">4457707</Counter> - <Counter worker="10">4457717</Counter> - <Counter worker="11">4457828</Counter> - <Counter worker="12">4457399</Counter> - <Counter worker="13">4457360</Counter> - <Counter worker="14">4457515</Counter> - <Counter worker="15">4457488</Counter> - <Counter worker="16">4585770</Counter> - <Counter worker="17">4585760</Counter> - <Counter worker="18">4585688</Counter> - </SelfEvent> - <SelfEvent activeWorker="20"> - <Counter worker="0">4446007</Counter> - <Counter worker="1">4446279</Counter> - <Counter worker="2">4446256</Counter> - <Counter worker="3">4446376</Counter> - <Counter worker="4">4445955</Counter> - <Counter worker="5">4445940</Counter> - <Counter worker="6">4446119</Counter> - <Counter worker="7">4446087</Counter> - <Counter worker="8">4445074</Counter> - <Counter worker="9">4445042</Counter> - <Counter worker="10">4444971</Counter> - <Counter worker="11">4445114</Counter> - <Counter worker="12">4444692</Counter> - <Counter worker="13">4444706</Counter> - <Counter worker="14">4444765</Counter> - <Counter worker="15">4444747</Counter> - <Counter worker="16">4548340</Counter> - <Counter worker="17">4548325</Counter> - <Counter worker="18">4548353</Counter> - <Counter worker="19">4548347</Counter> - </SelfEvent> - <SelfEvent activeWorker="21"> - <Counter worker="0">4427980</Counter> - <Counter worker="1">4428254</Counter> - <Counter worker="2">4428184</Counter> - <Counter worker="3">4428372</Counter> - <Counter worker="4">4427834</Counter> - <Counter worker="5">4427816</Counter> - <Counter worker="6">4427990</Counter> - <Counter worker="7">4428014</Counter> - <Counter worker="8">4427634</Counter> - <Counter worker="9">4427642</Counter> - <Counter worker="10">4427639</Counter> - <Counter worker="11">4427737</Counter> - <Counter worker="12">4427339</Counter> - <Counter worker="13">4427323</Counter> - <Counter worker="14">4427446</Counter> - <Counter worker="15">4427427</Counter> - <Counter worker="16">4504730</Counter> - <Counter worker="17">4504744</Counter> - <Counter worker="18">4504739</Counter> - <Counter worker="19">4504744</Counter> - <Counter worker="20">4504678</Counter> - </SelfEvent> - <SelfEvent activeWorker="22"> - <Counter worker="0">4452075</Counter> - <Counter worker="1">4452381</Counter> - <Counter worker="2">4452154</Counter> - <Counter worker="3">4452302</Counter> - <Counter worker="4">4451944</Counter> - <Counter worker="5">4451919</Counter> - <Counter worker="6">4451965</Counter> - <Counter worker="7">4452004</Counter> - <Counter worker="8">4451917</Counter> - <Counter worker="9">4451934</Counter> - <Counter worker="10">4451935</Counter> - <Counter worker="11">4452019</Counter> - <Counter worker="12">4451627</Counter> - <Counter worker="13">4451630</Counter> - <Counter worker="14">4451689</Counter> - <Counter worker="15">4451672</Counter> - <Counter worker="16">4506836</Counter> - <Counter worker="17">4506837</Counter> - <Counter worker="18">4506830</Counter> - <Counter worker="19">4506828</Counter> - <Counter worker="20">4506811</Counter> - <Counter worker="21">4506822</Counter> - </SelfEvent> - <SelfEvent activeWorker="23"> - <Counter worker="0">4435063</Counter> - <Counter worker="1">4435355</Counter> - <Counter worker="2">4435353</Counter> - <Counter worker="3">4435496</Counter> - <Counter worker="4">4435090</Counter> - <Counter worker="5">4435092</Counter> - <Counter worker="6">4435188</Counter> - <Counter worker="7">4435200</Counter> - <Counter worker="8">4432230</Counter> - <Counter worker="9">4432253</Counter> - <Counter worker="10">4432620</Counter> - <Counter worker="11">4432748</Counter> - <Counter worker="12">4431935</Counter> - <Counter worker="13">4431916</Counter> - <Counter worker="14">4432042</Counter> - <Counter worker="15">4432055</Counter> - <Counter worker="16">4476758</Counter> - <Counter worker="17">4476739</Counter> - <Counter worker="18">4476783</Counter> - <Counter worker="19">4476776</Counter> - <Counter worker="20">4476730</Counter> - <Counter worker="21">4476742</Counter> - <Counter worker="22">4476861</Counter> - </SelfEvent> - <SelfEvent activeWorker="24"> - <Counter worker="0">4462678</Counter> - <Counter worker="1">4462968</Counter> - <Counter worker="2">4462933</Counter> - <Counter worker="3">4463030</Counter> - <Counter worker="4">4462726</Counter> - <Counter worker="5">4462724</Counter> - <Counter worker="6">4462873</Counter> - <Counter worker="7">4462866</Counter> - <Counter worker="8">4464841</Counter> - <Counter worker="9">4464847</Counter> - <Counter worker="10">4464793</Counter> - <Counter worker="11">4464948</Counter> - <Counter worker="12">4464503</Counter> - <Counter worker="13">4464493</Counter> - <Counter worker="14">4464580</Counter> - <Counter worker="15">4464597</Counter> - <Counter worker="16">4475030</Counter> - <Counter worker="17">4475042</Counter> - <Counter worker="18">4474978</Counter> - <Counter worker="19">4475018</Counter> - <Counter worker="20">4474858</Counter> - <Counter worker="21">4474851</Counter> - <Counter worker="22">4475125</Counter> - <Counter worker="23">4475172</Counter> - </SelfEvent> - <AllToOneEvent activeWorker="1"> - <Counter worker="0">4512749</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="2"> - <Counter worker="0">4478766</Counter> - <Counter worker="1">8957974</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="3"> - <Counter worker="0">4507485</Counter> - <Counter worker="1">9015419</Counter> - <Counter worker="2">9015694</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="4"> - <Counter worker="0">4404320</Counter> - <Counter worker="1">8809091</Counter> - <Counter worker="2">8809371</Counter> - <Counter worker="3">8809388</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="5"> - <Counter worker="0">4380598</Counter> - <Counter worker="1">8788711</Counter> - <Counter worker="2">8768400</Counter> - <Counter worker="3">8768539</Counter> - <Counter worker="4">8947075</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="6"> - <Counter worker="0">4384177</Counter> - <Counter worker="1">8775468</Counter> - <Counter worker="2">8770900</Counter> - <Counter worker="3">8771021</Counter> - <Counter worker="4">8778460</Counter> - <Counter worker="5">8778497</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="7"> - <Counter worker="0">4375929</Counter> - <Counter worker="1">8753666</Counter> - <Counter worker="2">8752767</Counter> - <Counter worker="3">8752874</Counter> - <Counter worker="4">8753367</Counter> - <Counter worker="5">8753374</Counter> - <Counter worker="6">8840563</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="8"> - <Counter worker="0">4347550</Counter> - <Counter worker="1">8697434</Counter> - <Counter worker="2">8696453</Counter> - <Counter worker="3">8696601</Counter> - <Counter worker="4">8697025</Counter> - <Counter worker="5">8696969</Counter> - <Counter worker="6">8696444</Counter> - <Counter worker="7">8696417</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="9"> - <Counter worker="0">4328236</Counter> - <Counter worker="1">8682051</Counter> - <Counter worker="2">8671656</Counter> - <Counter worker="3">8671719</Counter> - <Counter worker="4">8674666</Counter> - <Counter worker="5">8674727</Counter> - <Counter worker="6">8670649</Counter> - <Counter worker="7">8667287</Counter> - <Counter worker="8">9254597</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="10"> - <Counter worker="0">4311205</Counter> - <Counter worker="1">8653563</Counter> - <Counter worker="2">8640229</Counter> - <Counter worker="3">8640342</Counter> - <Counter worker="4">8643904</Counter> - <Counter worker="5">8643865</Counter> - <Counter worker="6">8639106</Counter> - <Counter worker="7">8634769</Counter> - <Counter worker="8">9212001</Counter> - <Counter worker="9">9212064</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="11"> - <Counter worker="0">4338650</Counter> - <Counter worker="1">8703013</Counter> - <Counter worker="2">8692866</Counter> - <Counter worker="3">8692981</Counter> - <Counter worker="4">8695787</Counter> - <Counter worker="5">8695808</Counter> - <Counter worker="6">8691894</Counter> - <Counter worker="7">8687943</Counter> - <Counter worker="8">9103496</Counter> - <Counter worker="9">9103489</Counter> - <Counter worker="10">9103538</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="12"> - <Counter worker="0">4326588</Counter> - <Counter worker="1">8680078</Counter> - <Counter worker="2">8669077</Counter> - <Counter worker="3">8669207</Counter> - <Counter worker="4">8672685</Counter> - <Counter worker="5">8672667</Counter> - <Counter worker="6">8667903</Counter> - <Counter worker="7">8664528</Counter> - <Counter worker="8">8907170</Counter> - <Counter worker="9">8907137</Counter> - <Counter worker="10">8907177</Counter> - <Counter worker="11">8907256</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="13"> - <Counter worker="0">4309927</Counter> - <Counter worker="1">8643768</Counter> - <Counter worker="2">8634342</Counter> - <Counter worker="3">8634451</Counter> - <Counter worker="4">8636838</Counter> - <Counter worker="5">8636892</Counter> - <Counter worker="6">8633550</Counter> - <Counter worker="7">8629506</Counter> - <Counter worker="8">8899997</Counter> - <Counter worker="9">8900014</Counter> - <Counter worker="10">8900104</Counter> - <Counter worker="11">8900144</Counter> - <Counter worker="12">8900125</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="14"> - <Counter worker="0">4335662</Counter> - <Counter worker="1">8700274</Counter> - <Counter worker="2">8688657</Counter> - <Counter worker="3">8688789</Counter> - <Counter worker="4">8692110</Counter> - <Counter worker="5">8692102</Counter> - <Counter worker="6">8687544</Counter> - <Counter worker="7">8683259</Counter> - <Counter worker="8">8808142</Counter> - <Counter worker="9">8808143</Counter> - <Counter worker="10">8808118</Counter> - <Counter worker="11">8808151</Counter> - <Counter worker="12">8808088</Counter> - <Counter worker="13">8808120</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="15"> - <Counter worker="0">4314045</Counter> - <Counter worker="1">8661973</Counter> - <Counter worker="2">8648592</Counter> - <Counter worker="3">8648764</Counter> - <Counter worker="4">8652271</Counter> - <Counter worker="5">8652318</Counter> - <Counter worker="6">8647390</Counter> - <Counter worker="7">8641916</Counter> - <Counter worker="8">8797415</Counter> - <Counter worker="9">8797422</Counter> - <Counter worker="10">8797305</Counter> - <Counter worker="11">8797328</Counter> - <Counter worker="12">8797322</Counter> - <Counter worker="13">8797357</Counter> - <Counter worker="14">8802341</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="16"> - <Counter worker="0">4346816</Counter> - <Counter worker="1">8715982</Counter> - <Counter worker="2">8706981</Counter> - <Counter worker="3">8707143</Counter> - <Counter worker="4">8708920</Counter> - <Counter worker="5">8708960</Counter> - <Counter worker="6">8706447</Counter> - <Counter worker="7">8703043</Counter> - <Counter worker="8">8712344</Counter> - <Counter worker="9">8712289</Counter> - <Counter worker="10">8712131</Counter> - <Counter worker="11">8712215</Counter> - <Counter worker="12">8712289</Counter> - <Counter worker="13">8712244</Counter> - <Counter worker="14">8712147</Counter> - <Counter worker="15">8712227</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="17"> - <Counter worker="0">4325645</Counter> - <Counter worker="1">8685016</Counter> - <Counter worker="2">8671607</Counter> - <Counter worker="3">8671728</Counter> - <Counter worker="4">8675196</Counter> - <Counter worker="5">8675203</Counter> - <Counter worker="6">8670269</Counter> - <Counter worker="7">8665153</Counter> - <Counter worker="8">8673438</Counter> - <Counter worker="9">8673444</Counter> - <Counter worker="10">8673183</Counter> - <Counter worker="11">8673276</Counter> - <Counter worker="12">8673321</Counter> - <Counter worker="13">8673304</Counter> - <Counter worker="14">8673230</Counter> - <Counter worker="15">8673240</Counter> - <Counter worker="16">9251521</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="18"> - <Counter worker="0">4309289</Counter> - <Counter worker="1">8647898</Counter> - <Counter worker="2">8636314</Counter> - <Counter worker="3">8636411</Counter> - <Counter worker="4">8639557</Counter> - <Counter worker="5">8639645</Counter> - <Counter worker="6">8635149</Counter> - <Counter worker="7">8630636</Counter> - <Counter worker="8">8641335</Counter> - <Counter worker="9">8641320</Counter> - <Counter worker="10">8641131</Counter> - <Counter worker="11">8641178</Counter> - <Counter worker="12">8641173</Counter> - <Counter worker="13">8641229</Counter> - <Counter worker="14">8641116</Counter> - <Counter worker="15">8641130</Counter> - <Counter worker="16">9208457</Counter> - <Counter worker="17">9208447</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="19"> - <Counter worker="0">4339177</Counter> - <Counter worker="1">8712486</Counter> - <Counter worker="2">8698865</Counter> - <Counter worker="3">8699011</Counter> - <Counter worker="4">8702321</Counter> - <Counter worker="5">8702299</Counter> - <Counter worker="6">8697706</Counter> - <Counter worker="7">8692411</Counter> - <Counter worker="8">8691700</Counter> - <Counter worker="9">8691718</Counter> - <Counter worker="10">8691530</Counter> - <Counter worker="11">8691574</Counter> - <Counter worker="12">8691598</Counter> - <Counter worker="13">8691595</Counter> - <Counter worker="14">8691515</Counter> - <Counter worker="15">8691555</Counter> - <Counter worker="16">9098995</Counter> - <Counter worker="17">9098975</Counter> - <Counter worker="18">9098976</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="20"> - <Counter worker="0">4323231</Counter> - <Counter worker="1">8670659</Counter> - <Counter worker="2">8660830</Counter> - <Counter worker="3">8660891</Counter> - <Counter worker="4">8663710</Counter> - <Counter worker="5">8663717</Counter> - <Counter worker="6">8659875</Counter> - <Counter worker="7">8656639</Counter> - <Counter worker="8">8654156</Counter> - <Counter worker="9">8654183</Counter> - <Counter worker="10">8654050</Counter> - <Counter worker="11">8654092</Counter> - <Counter worker="12">8654106</Counter> - <Counter worker="13">8654141</Counter> - <Counter worker="14">8654084</Counter> - <Counter worker="15">8654064</Counter> - <Counter worker="16">8891464</Counter> - <Counter worker="17">8891387</Counter> - <Counter worker="18">8891423</Counter> - <Counter worker="19">8891522</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="21"> - <Counter worker="0">4306028</Counter> - <Counter worker="1">8633314</Counter> - <Counter worker="2">8624564</Counter> - <Counter worker="3">8624678</Counter> - <Counter worker="4">8627581</Counter> - <Counter worker="5">8627623</Counter> - <Counter worker="6">8623580</Counter> - <Counter worker="7">8621273</Counter> - <Counter worker="8">8630481</Counter> - <Counter worker="9">8630453</Counter> - <Counter worker="10">8630282</Counter> - <Counter worker="11">8630331</Counter> - <Counter worker="12">8630383</Counter> - <Counter worker="13">8630377</Counter> - <Counter worker="14">8630254</Counter> - <Counter worker="15">8630302</Counter> - <Counter worker="16">8882786</Counter> - <Counter worker="17">8882786</Counter> - <Counter worker="18">8882842</Counter> - <Counter worker="19">8882888</Counter> - <Counter worker="20">8901459</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="22"> - <Counter worker="0">4332214</Counter> - <Counter worker="1">8694309</Counter> - <Counter worker="2">8682276</Counter> - <Counter worker="3">8682411</Counter> - <Counter worker="4">8685904</Counter> - <Counter worker="5">8685918</Counter> - <Counter worker="6">8681134</Counter> - <Counter worker="7">8676778</Counter> - <Counter worker="8">8690139</Counter> - <Counter worker="9">8690092</Counter> - <Counter worker="10">8689940</Counter> - <Counter worker="11">8689995</Counter> - <Counter worker="12">8690031</Counter> - <Counter worker="13">8690036</Counter> - <Counter worker="14">8689958</Counter> - <Counter worker="15">8689930</Counter> - <Counter worker="16">8792896</Counter> - <Counter worker="17">8792916</Counter> - <Counter worker="18">8792896</Counter> - <Counter worker="19">8792966</Counter> - <Counter worker="20">8792943</Counter> - <Counter worker="21">8792939</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="23"> - <Counter worker="0">4316784</Counter> - <Counter worker="1">8662468</Counter> - <Counter worker="2">8650651</Counter> - <Counter worker="3">8650782</Counter> - <Counter worker="4">8654092</Counter> - <Counter worker="5">8654022</Counter> - <Counter worker="6">8649506</Counter> - <Counter worker="7">8645904</Counter> - <Counter worker="8">8639667</Counter> - <Counter worker="9">8639654</Counter> - <Counter worker="10">8639505</Counter> - <Counter worker="11">8639593</Counter> - <Counter worker="12">8639683</Counter> - <Counter worker="13">8639686</Counter> - <Counter worker="14">8639487</Counter> - <Counter worker="15">8639547</Counter> - <Counter worker="16">8786893</Counter> - <Counter worker="17">8786917</Counter> - <Counter worker="18">8786678</Counter> - <Counter worker="19">8786756</Counter> - <Counter worker="20">8786878</Counter> - <Counter worker="21">8786879</Counter> - <Counter worker="22">8794112</Counter> - </AllToOneEvent> - <AllToOneEvent activeWorker="24"> - <Counter worker="0">4340462</Counter> - <Counter worker="1">8708543</Counter> - <Counter worker="2">8696739</Counter> - <Counter worker="3">8696800</Counter> - <Counter worker="4">8699717</Counter> - <Counter worker="5">8699709</Counter> - <Counter worker="6">8695657</Counter> - <Counter worker="7">8691968</Counter> - <Counter worker="8">8714142</Counter> - <Counter worker="9">8714066</Counter> - <Counter worker="10">8714016</Counter> - <Counter worker="11">8714062</Counter> - <Counter worker="12">8714040</Counter> - <Counter worker="13">8714116</Counter> - <Counter worker="14">8714041</Counter> - <Counter worker="15">8714021</Counter> - <Counter worker="16">8722288</Counter> - <Counter worker="17">8722251</Counter> - <Counter worker="18">8722033</Counter> - <Counter worker="19">8722156</Counter> - <Counter worker="20">8722336</Counter> - <Counter worker="21">8722308</Counter> - <Counter worker="22">8722297</Counter> - <Counter worker="23">8722331</Counter> - </AllToOneEvent> - <OneMutex activeWorker="1"> - <Counter worker="0">4931822</Counter> - </OneMutex> - <OneMutex activeWorker="2"> - <Counter worker="0">245503</Counter> - <Counter worker="1">245503</Counter> - </OneMutex> - <OneMutex activeWorker="3"> - <Counter worker="0">68887</Counter> - <Counter worker="1">68887</Counter> - <Counter worker="2">68886</Counter> - </OneMutex> - <OneMutex activeWorker="4"> - <Counter worker="0">65075</Counter> - <Counter worker="1">65075</Counter> - <Counter worker="2">65075</Counter> - <Counter worker="3">65075</Counter> - </OneMutex> - <OneMutex activeWorker="5"> - <Counter worker="0">39944</Counter> - <Counter worker="1">39944</Counter> - <Counter worker="2">39944</Counter> - <Counter worker="3">39945</Counter> - <Counter worker="4">39944</Counter> - </OneMutex> - <OneMutex activeWorker="6"> - <Counter worker="0">49925</Counter> - <Counter worker="1">49925</Counter> - <Counter worker="2">49924</Counter> - <Counter worker="3">49925</Counter> - <Counter worker="4">49924</Counter> - <Counter worker="5">49925</Counter> - </OneMutex> - <OneMutex activeWorker="7"> - <Counter worker="0">27616</Counter> - <Counter worker="1">27615</Counter> - <Counter worker="2">27616</Counter> - <Counter worker="3">27616</Counter> - <Counter worker="4">27616</Counter> - <Counter worker="5">27615</Counter> - <Counter worker="6">27615</Counter> - </OneMutex> - <OneMutex activeWorker="8"> - <Counter worker="0">22376</Counter> - <Counter worker="1">22377</Counter> - <Counter worker="2">22377</Counter> - <Counter worker="3">22376</Counter> - <Counter worker="4">22377</Counter> - <Counter worker="5">22376</Counter> - <Counter worker="6">22377</Counter> - <Counter worker="7">22377</Counter> - </OneMutex> - <OneMutex activeWorker="9"> - <Counter worker="0">19838</Counter> - <Counter worker="1">19838</Counter> - <Counter worker="2">19838</Counter> - <Counter worker="3">19838</Counter> - <Counter worker="4">19838</Counter> - <Counter worker="5">19838</Counter> - <Counter worker="6">19838</Counter> - <Counter worker="7">19838</Counter> - <Counter worker="8">19838</Counter> - </OneMutex> - <OneMutex activeWorker="10"> - <Counter worker="0">12036</Counter> - <Counter worker="1">12036</Counter> - <Counter worker="2">12036</Counter> - <Counter worker="3">12036</Counter> - <Counter worker="4">12037</Counter> - <Counter worker="5">12037</Counter> - <Counter worker="6">12036</Counter> - <Counter worker="7">12037</Counter> - <Counter worker="8">12036</Counter> - <Counter worker="9">12036</Counter> - </OneMutex> - <OneMutex activeWorker="11"> - <Counter worker="0">14679</Counter> - <Counter worker="1">14679</Counter> - <Counter worker="2">14679</Counter> - <Counter worker="3">14679</Counter> - <Counter worker="4">14679</Counter> - <Counter worker="5">14679</Counter> - <Counter worker="6">14679</Counter> - <Counter worker="7">14679</Counter> - <Counter worker="8">14679</Counter> - <Counter worker="9">14678</Counter> - <Counter worker="10">14679</Counter> - </OneMutex> - <OneMutex activeWorker="12"> - <Counter worker="0">9715</Counter> - <Counter worker="1">9715</Counter> - <Counter worker="2">9715</Counter> - <Counter worker="3">9714</Counter> - <Counter worker="4">9714</Counter> - <Counter worker="5">9714</Counter> - <Counter worker="6">9714</Counter> - <Counter worker="7">9715</Counter> - <Counter worker="8">9714</Counter> - <Counter worker="9">9714</Counter> - <Counter worker="10">9715</Counter> - <Counter worker="11">9714</Counter> - </OneMutex> - <OneMutex activeWorker="13"> - <Counter worker="0">8614</Counter> - <Counter worker="1">8614</Counter> - <Counter worker="2">8614</Counter> - <Counter worker="3">8614</Counter> - <Counter worker="4">8613</Counter> - <Counter worker="5">8613</Counter> - <Counter worker="6">8615</Counter> - <Counter worker="7">8613</Counter> - <Counter worker="8">8613</Counter> - <Counter worker="9">8613</Counter> - <Counter worker="10">8613</Counter> - <Counter worker="11">8613</Counter> - <Counter worker="12">8614</Counter> - </OneMutex> - <OneMutex activeWorker="14"> - <Counter worker="0">8930</Counter> - <Counter worker="1">8929</Counter> - <Counter worker="2">8929</Counter> - <Counter worker="3">8930</Counter> - <Counter worker="4">8930</Counter> - <Counter worker="5">8930</Counter> - <Counter worker="6">8929</Counter> - <Counter worker="7">8929</Counter> - <Counter worker="8">8929</Counter> - <Counter worker="9">8930</Counter> - <Counter worker="10">8929</Counter> - <Counter worker="11">8929</Counter> - <Counter worker="12">8930</Counter> - <Counter worker="13">8929</Counter> - </OneMutex> - <OneMutex activeWorker="15"> - <Counter worker="0">6001</Counter> - <Counter worker="1">6002</Counter> - <Counter worker="2">6002</Counter> - <Counter worker="3">6002</Counter> - <Counter worker="4">6003</Counter> - <Counter worker="5">6001</Counter> - <Counter worker="6">6002</Counter> - <Counter worker="7">6002</Counter> - <Counter worker="8">6002</Counter> - <Counter worker="9">6002</Counter> - <Counter worker="10">6002</Counter> - <Counter worker="11">6002</Counter> - <Counter worker="12">6001</Counter> - <Counter worker="13">6002</Counter> - <Counter worker="14">6002</Counter> - </OneMutex> - <OneMutex activeWorker="16"> - <Counter worker="0">7934</Counter> - <Counter worker="1">7934</Counter> - <Counter worker="2">7936</Counter> - <Counter worker="3">7935</Counter> - <Counter worker="4">7935</Counter> - <Counter worker="5">7934</Counter> - <Counter worker="6">7935</Counter> - <Counter worker="7">7935</Counter> - <Counter worker="8">7934</Counter> - <Counter worker="9">7934</Counter> - <Counter worker="10">7934</Counter> - <Counter worker="11">7934</Counter> - <Counter worker="12">7935</Counter> - <Counter worker="13">7935</Counter> - <Counter worker="14">7935</Counter> - <Counter worker="15">7934</Counter> - </OneMutex> - <OneMutex activeWorker="17"> - <Counter worker="0">4099</Counter> - <Counter worker="1">4099</Counter> - <Counter worker="2">4098</Counter> - <Counter worker="3">4098</Counter> - <Counter worker="4">4098</Counter> - <Counter worker="5">4098</Counter> - <Counter worker="6">4098</Counter> - <Counter worker="7">4098</Counter> - <Counter worker="8">4098</Counter> - <Counter worker="9">4098</Counter> - <Counter worker="10">4098</Counter> - <Counter worker="11">4098</Counter> - <Counter worker="12">4098</Counter> - <Counter worker="13">4098</Counter> - <Counter worker="14">4098</Counter> - <Counter worker="15">4099</Counter> - <Counter worker="16">4098</Counter> - </OneMutex> - <OneMutex activeWorker="18"> - <Counter worker="0">6990</Counter> - <Counter worker="1">6989</Counter> - <Counter worker="2">6989</Counter> - <Counter worker="3">6989</Counter> - <Counter worker="4">6989</Counter> - <Counter worker="5">6990</Counter> - <Counter worker="6">6989</Counter> - <Counter worker="7">6989</Counter> - <Counter worker="8">6989</Counter> - <Counter worker="9">6990</Counter> - <Counter worker="10">6989</Counter> - <Counter worker="11">6989</Counter> - <Counter worker="12">6989</Counter> - <Counter worker="13">6990</Counter> - <Counter worker="14">6990</Counter> - <Counter worker="15">6990</Counter> - <Counter worker="16">6990</Counter> - <Counter worker="17">6989</Counter> - </OneMutex> - <OneMutex activeWorker="19"> - <Counter worker="0">3939</Counter> - <Counter worker="1">3938</Counter> - <Counter worker="2">3938</Counter> - <Counter worker="3">3938</Counter> - <Counter worker="4">3939</Counter> - <Counter worker="5">3938</Counter> - <Counter worker="6">3939</Counter> - <Counter worker="7">3938</Counter> - <Counter worker="8">3939</Counter> - <Counter worker="9">3938</Counter> - <Counter worker="10">3939</Counter> - <Counter worker="11">3938</Counter> - <Counter worker="12">3939</Counter> - <Counter worker="13">3939</Counter> - <Counter worker="14">3939</Counter> - <Counter worker="15">3938</Counter> - <Counter worker="16">3938</Counter> - <Counter worker="17">3938</Counter> - <Counter worker="18">3939</Counter> - </OneMutex> - <OneMutex activeWorker="20"> - <Counter worker="0">3096</Counter> - <Counter worker="1">3096</Counter> - <Counter worker="2">3097</Counter> - <Counter worker="3">3097</Counter> - <Counter worker="4">3097</Counter> - <Counter worker="5">3096</Counter> - <Counter worker="6">3096</Counter> - <Counter worker="7">3097</Counter> - <Counter worker="8">3097</Counter> - <Counter worker="9">3097</Counter> - <Counter worker="10">3097</Counter> - <Counter worker="11">3097</Counter> - <Counter worker="12">3097</Counter> - <Counter worker="13">3098</Counter> - <Counter worker="14">3097</Counter> - <Counter worker="15">3097</Counter> - <Counter worker="16">3097</Counter> - <Counter worker="17">3097</Counter> - <Counter worker="18">3097</Counter> - <Counter worker="19">3097</Counter> - </OneMutex> - <OneMutex activeWorker="21"> - <Counter worker="0">2721</Counter> - <Counter worker="1">2722</Counter> - <Counter worker="2">2721</Counter> - <Counter worker="3">2721</Counter> - <Counter worker="4">2722</Counter> - <Counter worker="5">2721</Counter> - <Counter worker="6">2721</Counter> - <Counter worker="7">2721</Counter> - <Counter worker="8">2721</Counter> - <Counter worker="9">2721</Counter> - <Counter worker="10">2722</Counter> - <Counter worker="11">2721</Counter> - <Counter worker="12">2722</Counter> - <Counter worker="13">2722</Counter> - <Counter worker="14">2721</Counter> - <Counter worker="15">2721</Counter> - <Counter worker="16">2721</Counter> - <Counter worker="17">2721</Counter> - <Counter worker="18">2722</Counter> - <Counter worker="19">2722</Counter> - <Counter worker="20">2721</Counter> - </OneMutex> - <OneMutex activeWorker="22"> - <Counter worker="0">5060</Counter> - <Counter worker="1">5060</Counter> - <Counter worker="2">5060</Counter> - <Counter worker="3">5060</Counter> - <Counter worker="4">5060</Counter> - <Counter worker="5">5060</Counter> - <Counter worker="6">5060</Counter> - <Counter worker="7">5060</Counter> - <Counter worker="8">5060</Counter> - <Counter worker="9">5060</Counter> - <Counter worker="10">5060</Counter> - <Counter worker="11">5060</Counter> - <Counter worker="12">5060</Counter> - <Counter worker="13">5060</Counter> - <Counter worker="14">5060</Counter> - <Counter worker="15">5060</Counter> - <Counter worker="16">5060</Counter> - <Counter worker="17">5060</Counter> - <Counter worker="18">5060</Counter> - <Counter worker="19">5060</Counter> - <Counter worker="20">5060</Counter> - <Counter worker="21">5060</Counter> - </OneMutex> - <OneMutex activeWorker="23"> - <Counter worker="0">4582</Counter> - <Counter worker="1">4582</Counter> - <Counter worker="2">4582</Counter> - <Counter worker="3">4582</Counter> - <Counter worker="4">4581</Counter> - <Counter worker="5">4581</Counter> - <Counter worker="6">4582</Counter> - <Counter worker="7">4581</Counter> - <Counter worker="8">4582</Counter> - <Counter worker="9">4582</Counter> - <Counter worker="10">4581</Counter> - <Counter worker="11">4581</Counter> - <Counter worker="12">4582</Counter> - <Counter worker="13">4581</Counter> - <Counter worker="14">4581</Counter> - <Counter worker="15">4582</Counter> - <Counter worker="16">4582</Counter> - <Counter worker="17">4582</Counter> - <Counter worker="18">4582</Counter> - <Counter worker="19">4582</Counter> - <Counter worker="20">4582</Counter> - <Counter worker="21">4582</Counter> - <Counter worker="22">4581</Counter> - </OneMutex> - <OneMutex activeWorker="24"> - <Counter worker="0">2433</Counter> - <Counter worker="1">2433</Counter> - <Counter worker="2">2432</Counter> - <Counter worker="3">2433</Counter> - <Counter worker="4">2432</Counter> - <Counter worker="5">2432</Counter> - <Counter worker="6">2433</Counter> - <Counter worker="7">2433</Counter> - <Counter worker="8">2433</Counter> - <Counter worker="9">2432</Counter> - <Counter worker="10">2433</Counter> - <Counter worker="11">2433</Counter> - <Counter worker="12">2433</Counter> - <Counter worker="13">2433</Counter> - <Counter worker="14">2433</Counter> - <Counter worker="15">2432</Counter> - <Counter worker="16">2433</Counter> - <Counter worker="17">2432</Counter> - <Counter worker="18">2433</Counter> - <Counter worker="19">2432</Counter> - <Counter worker="20">2433</Counter> - <Counter worker="21">2433</Counter> - <Counter worker="22">2434</Counter> - <Counter worker="23">2432</Counter> - </OneMutex> - <ManyMutex activeWorker="1"> - <Counter worker="0">5001647</Counter> - </ManyMutex> - <ManyMutex activeWorker="2"> - <Counter worker="0">4932033</Counter> - <Counter worker="1">4932309</Counter> - </ManyMutex> - <ManyMutex activeWorker="3"> - <Counter worker="0">4355923</Counter> - <Counter worker="1">4925539</Counter> - <Counter worker="2">4356158</Counter> - </ManyMutex> - <ManyMutex activeWorker="4"> - <Counter worker="0">4276198</Counter> - <Counter worker="1">4793125</Counter> - <Counter worker="2">4792773</Counter> - <Counter worker="3">4276295</Counter> - </ManyMutex> - <ManyMutex activeWorker="5"> - <Counter worker="0">4735869</Counter> - <Counter worker="1">4177346</Counter> - <Counter worker="2">4736094</Counter> - <Counter worker="3">4235871</Counter> - <Counter worker="4">4731095</Counter> - </ManyMutex> - <ManyMutex activeWorker="6"> - <Counter worker="0">4716270</Counter> - <Counter worker="1">4258387</Counter> - <Counter worker="2">4268838</Counter> - <Counter worker="3">4698974</Counter> - <Counter worker="4">4172075</Counter> - <Counter worker="5">4719026</Counter> - </ManyMutex> - <ManyMutex activeWorker="7"> - <Counter worker="0">4205327</Counter> - <Counter worker="1">4202415</Counter> - <Counter worker="2">4728528</Counter> - <Counter worker="3">4741751</Counter> - <Counter worker="4">4661144</Counter> - <Counter worker="5">4728823</Counter> - <Counter worker="6">4741645</Counter> - </ManyMutex> - <ManyMutex activeWorker="8"> - <Counter worker="0">4700906</Counter> - <Counter worker="1">4085992</Counter> - <Counter worker="2">4700875</Counter> - <Counter worker="3">4672269</Counter> - <Counter worker="4">4641742</Counter> - <Counter worker="5">4113941</Counter> - <Counter worker="6">4634133</Counter> - <Counter worker="7">4069049</Counter> - </ManyMutex> - <ManyMutex activeWorker="9"> - <Counter worker="0">4706705</Counter> - <Counter worker="1">2830546</Counter> - <Counter worker="2">3640848</Counter> - <Counter worker="3">4638947</Counter> - <Counter worker="4">4106355</Counter> - <Counter worker="5">4634726</Counter> - <Counter worker="6">4199317</Counter> - <Counter worker="7">4215455</Counter> - <Counter worker="8">4706736</Counter> - </ManyMutex> - <ManyMutex activeWorker="10"> - <Counter worker="0">4591261</Counter> - <Counter worker="1">4967739</Counter> - <Counter worker="2">4618369</Counter> - <Counter worker="3">4063482</Counter> - <Counter worker="4">4967727</Counter> - <Counter worker="5">4162082</Counter> - <Counter worker="6">4048161</Counter> - <Counter worker="7">4649148</Counter> - <Counter worker="8">4649140</Counter> - <Counter worker="9">4631859</Counter> - </ManyMutex> - <ManyMutex activeWorker="11"> - <Counter worker="0">4370677</Counter> - <Counter worker="1">3026309</Counter> - <Counter worker="2">2913790</Counter> - <Counter worker="3">4677581</Counter> - <Counter worker="4">4692968</Counter> - <Counter worker="5">4780273</Counter> - <Counter worker="6">4693509</Counter> - <Counter worker="7">4495802</Counter> - <Counter worker="8">4704240</Counter> - <Counter worker="9">4703550</Counter> - <Counter worker="10">4677478</Counter> - </ManyMutex> - <ManyMutex activeWorker="12"> - <Counter worker="0">4107344</Counter> - <Counter worker="1">4649662</Counter> - <Counter worker="2">4676522</Counter> - <Counter worker="3">3156738</Counter> - <Counter worker="4">4671133</Counter> - <Counter worker="5">4154985</Counter> - <Counter worker="6">4785186</Counter> - <Counter worker="7">4670956</Counter> - <Counter worker="8">4126203</Counter> - <Counter worker="9">4785157</Counter> - <Counter worker="10">2842002</Counter> - <Counter worker="11">4704576</Counter> - </ManyMutex> - <ManyMutex activeWorker="13"> - <Counter worker="0">4658248</Counter> - <Counter worker="1">3050246</Counter> - <Counter worker="2">4822861</Counter> - <Counter worker="3">2829258</Counter> - <Counter worker="4">4804042</Counter> - <Counter worker="5">4658270</Counter> - <Counter worker="6">4651897</Counter> - <Counter worker="7">4803978</Counter> - <Counter worker="8">4618739</Counter> - <Counter worker="9">4080735</Counter> - <Counter worker="10">4641078</Counter> - <Counter worker="11">4104333</Counter> - <Counter worker="12">4085914</Counter> - </ManyMutex> - <ManyMutex activeWorker="14"> - <Counter worker="0">2833004</Counter> - <Counter worker="1">4774206</Counter> - <Counter worker="2">4681710</Counter> - <Counter worker="3">4191970</Counter> - <Counter worker="4">2835639</Counter> - <Counter worker="5">2832535</Counter> - <Counter worker="6">4208974</Counter> - <Counter worker="7">4500175</Counter> - <Counter worker="8">4634735</Counter> - <Counter worker="9">4534048</Counter> - <Counter worker="10">4774225</Counter> - <Counter worker="11">4367224</Counter> - <Counter worker="12">2119256</Counter> - <Counter worker="13">3685038</Counter> - </ManyMutex> - <ManyMutex activeWorker="15"> - <Counter worker="0">4679948</Counter> - <Counter worker="1">4679956</Counter> - <Counter worker="2">4689624</Counter> - <Counter worker="3">4095475</Counter> - <Counter worker="4">4633249</Counter> - <Counter worker="5">4694233</Counter> - <Counter worker="6">4691234</Counter> - <Counter worker="7">4633249</Counter> - <Counter worker="8">4689597</Counter> - <Counter worker="9">4689904</Counter> - <Counter worker="10">4636792</Counter> - <Counter worker="11">2890683</Counter> - <Counter worker="12">4334695</Counter> - <Counter worker="13">2890353</Counter> - <Counter worker="14">4691398</Counter> - </ManyMutex> - <ManyMutex activeWorker="16"> - <Counter worker="0">4721449</Counter> - <Counter worker="1">4641755</Counter> - <Counter worker="2">3147235</Counter> - <Counter worker="3">4677026</Counter> - <Counter worker="4">2858837</Counter> - <Counter worker="5">4699482</Counter> - <Counter worker="6">4721331</Counter> - <Counter worker="7">3994802</Counter> - <Counter worker="8">4699317</Counter> - <Counter worker="9">4696404</Counter> - <Counter worker="10">4589085</Counter> - <Counter worker="11">4108168</Counter> - <Counter worker="12">4720500</Counter> - <Counter worker="13">4676953</Counter> - <Counter worker="14">4643243</Counter> - <Counter worker="15">4720497</Counter> - </ManyMutex> - <ManyMutex activeWorker="17"> - <Counter worker="0">4645420</Counter> - <Counter worker="1">4680196</Counter> - <Counter worker="2">4686848</Counter> - <Counter worker="3">4647270</Counter> - <Counter worker="4">4681748</Counter> - <Counter worker="5">4634369</Counter> - <Counter worker="6">4682734</Counter> - <Counter worker="7">2856905</Counter> - <Counter worker="8">3516034</Counter> - <Counter worker="9">4636223</Counter> - <Counter worker="10">4684119</Counter> - <Counter worker="11">4684619</Counter> - <Counter worker="12">4633361</Counter> - <Counter worker="13">4633572</Counter> - <Counter worker="14">4644454</Counter> - <Counter worker="15">4642238</Counter> - <Counter worker="16">4680224</Counter> - </ManyMutex> - <ManyMutex activeWorker="18"> - <Counter worker="0">3968745</Counter> - <Counter worker="1">4692720</Counter> - <Counter worker="2">4691924</Counter> - <Counter worker="3">4927117</Counter> - <Counter worker="4">4684103</Counter> - <Counter worker="5">4686784</Counter> - <Counter worker="6">4552054</Counter> - <Counter worker="7">4687372</Counter> - <Counter worker="8">2814828</Counter> - <Counter worker="9">4678196</Counter> - <Counter worker="10">3019413</Counter> - <Counter worker="11">4702658</Counter> - <Counter worker="12">2799802</Counter> - <Counter worker="13">3006627</Counter> - <Counter worker="14">4683463</Counter> - <Counter worker="15">4677772</Counter> - <Counter worker="16">4645772</Counter> - <Counter worker="17">4927146</Counter> - </ManyMutex> - <ManyMutex activeWorker="19"> - <Counter worker="0">4601592</Counter> - <Counter worker="1">4714461</Counter> - <Counter worker="2">4883685</Counter> - <Counter worker="3">3028508</Counter> - <Counter worker="4">4654222</Counter> - <Counter worker="5">2933007</Counter> - <Counter worker="6">4724241</Counter> - <Counter worker="7">4718472</Counter> - <Counter worker="8">4570831</Counter> - <Counter worker="9">4718483</Counter> - <Counter worker="10">4724097</Counter> - <Counter worker="11">4713870</Counter> - <Counter worker="12">4703195</Counter> - <Counter worker="13">4165705</Counter> - <Counter worker="14">4711178</Counter> - <Counter worker="15">4883702</Counter> - <Counter worker="16">4711294</Counter> - <Counter worker="17">4703238</Counter> - <Counter worker="18">4654312</Counter> - </ManyMutex> - <ManyMutex activeWorker="20"> - <Counter worker="0">4651301</Counter> - <Counter worker="1">3690905</Counter> - <Counter worker="2">3105263</Counter> - <Counter worker="3">4697287</Counter> - <Counter worker="4">4638522</Counter> - <Counter worker="5">4650722</Counter> - <Counter worker="6">2962962</Counter> - <Counter worker="7">4112623</Counter> - <Counter worker="8">4638656</Counter> - <Counter worker="9">2033536</Counter> - <Counter worker="10">4675666</Counter> - <Counter worker="11">4467698</Counter> - <Counter worker="12">4389797</Counter> - <Counter worker="13">4468602</Counter> - <Counter worker="14">2818900</Counter> - <Counter worker="15">4536994</Counter> - <Counter worker="16">3093343</Counter> - <Counter worker="17">2819049</Counter> - <Counter worker="18">3060340</Counter> - <Counter worker="19">2902497</Counter> - </ManyMutex> - <ManyMutex activeWorker="21"> - <Counter worker="0">2812125</Counter> - <Counter worker="1">2976769</Counter> - <Counter worker="2">4554538</Counter> - <Counter worker="3">4606816</Counter> - <Counter worker="4">4479562</Counter> - <Counter worker="5">2992810</Counter> - <Counter worker="6">4661692</Counter> - <Counter worker="7">4709972</Counter> - <Counter worker="8">4597719</Counter> - <Counter worker="9">4608597</Counter> - <Counter worker="10">4609552</Counter> - <Counter worker="11">4709758</Counter> - <Counter worker="12">4661224</Counter> - <Counter worker="13">4519832</Counter> - <Counter worker="14">4746960</Counter> - <Counter worker="15">4609189</Counter> - <Counter worker="16">4752379</Counter> - <Counter worker="17">4596670</Counter> - <Counter worker="18">4810470</Counter> - <Counter worker="19">2858016</Counter> - <Counter worker="20">4752412</Counter> - </ManyMutex> - <ManyMutex activeWorker="22"> - <Counter worker="0">4702947</Counter> - <Counter worker="1">4443206</Counter> - <Counter worker="2">4727685</Counter> - <Counter worker="3">4540248</Counter> - <Counter worker="4">4658159</Counter> - <Counter worker="5">4126514</Counter> - <Counter worker="6">4791039</Counter> - <Counter worker="7">2894757</Counter> - <Counter worker="8">1955087</Counter> - <Counter worker="9">4702969</Counter> - <Counter worker="10">2817541</Counter> - <Counter worker="11">4420635</Counter> - <Counter worker="12">2921923</Counter> - <Counter worker="13">2650900</Counter> - <Counter worker="14">2862766</Counter> - <Counter worker="15">3687545</Counter> - <Counter worker="16">2874883</Counter> - <Counter worker="17">2940336</Counter> - <Counter worker="18">2776021</Counter> - <Counter worker="19">3127586</Counter> - <Counter worker="20">4090728</Counter> - <Counter worker="21">2337871</Counter> - </ManyMutex> - <ManyMutex activeWorker="23"> - <Counter worker="0">4529255</Counter> - <Counter worker="1">4718656</Counter> - <Counter worker="2">1922439</Counter> - <Counter worker="3">4693004</Counter> - <Counter worker="4">4684958</Counter> - <Counter worker="5">2886050</Counter> - <Counter worker="6">3066101</Counter> - <Counter worker="7">3610129</Counter> - <Counter worker="8">2810938</Counter> - <Counter worker="9">4633095</Counter> - <Counter worker="10">2900751</Counter> - <Counter worker="11">4632884</Counter> - <Counter worker="12">4692840</Counter> - <Counter worker="13">4420163</Counter> - <Counter worker="14">1996345</Counter> - <Counter worker="15">3643801</Counter> - <Counter worker="16">2826674</Counter> - <Counter worker="17">2883468</Counter> - <Counter worker="18">4558270</Counter> - <Counter worker="19">4416614</Counter> - <Counter worker="20">2860484</Counter> - <Counter worker="21">2892545</Counter> - <Counter worker="22">4488266</Counter> - </ManyMutex> - <ManyMutex activeWorker="24"> - <Counter worker="0">4578849</Counter> - <Counter worker="1">4636230</Counter> - <Counter worker="2">3022974</Counter> - <Counter worker="3">2822574</Counter> - <Counter worker="4">4731087</Counter> - <Counter worker="5">4731131</Counter> - <Counter worker="6">4689840</Counter> - <Counter worker="7">4070922</Counter> - <Counter worker="8">4689653</Counter> - <Counter worker="9">4477380</Counter> - <Counter worker="10">4642053</Counter> - <Counter worker="11">4731990</Counter> - <Counter worker="12">2819820</Counter> - <Counter worker="13">4097315</Counter> - <Counter worker="14">2839488</Counter> - <Counter worker="15">2107643</Counter> - <Counter worker="16">4682013</Counter> - <Counter worker="17">4682337</Counter> - <Counter worker="18">4583332</Counter> - <Counter worker="19">3013463</Counter> - <Counter worker="20">4532706</Counter> - <Counter worker="21">4653764</Counter> - <Counter worker="22">3720162</Counter> - <Counter worker="23">4120464</Counter> - </ManyMutex> - <SelfMsg activeWorker="1"> - <Counter worker="0">3484359</Counter> - </SelfMsg> - <SelfMsg activeWorker="2"> - <Counter worker="0">3291417</Counter> - <Counter worker="1">3291652</Counter> - </SelfMsg> - <SelfMsg activeWorker="3"> - <Counter worker="0">3243274</Counter> - <Counter worker="1">2918376</Counter> - <Counter worker="2">2983608</Counter> - </SelfMsg> - <SelfMsg activeWorker="4"> - <Counter worker="0">3203853</Counter> - <Counter worker="1">2895866</Counter> - <Counter worker="2">2917648</Counter> - <Counter worker="3">3306218</Counter> - </SelfMsg> - <SelfMsg activeWorker="5"> - <Counter worker="0">3172566</Counter> - <Counter worker="1">2850649</Counter> - <Counter worker="2">2876474</Counter> - <Counter worker="3">2993084</Counter> - <Counter worker="4">3037697</Counter> - </SelfMsg> - <SelfMsg activeWorker="6"> - <Counter worker="0">3176969</Counter> - <Counter worker="1">2852043</Counter> - <Counter worker="2">2878751</Counter> - <Counter worker="3">2996638</Counter> - <Counter worker="4">2798362</Counter> - <Counter worker="5">3098269</Counter> - </SelfMsg> - <SelfMsg activeWorker="7"> - <Counter worker="0">3143837</Counter> - <Counter worker="1">2820072</Counter> - <Counter worker="2">2849545</Counter> - <Counter worker="3">2965415</Counter> - <Counter worker="4">2791805</Counter> - <Counter worker="5">2995583</Counter> - <Counter worker="6">3223833</Counter> - </SelfMsg> - <SelfMsg activeWorker="8"> - <Counter worker="0">3106671</Counter> - <Counter worker="1">2774975</Counter> - <Counter worker="2">2810843</Counter> - <Counter worker="3">2934576</Counter> - <Counter worker="4">2743550</Counter> - <Counter worker="5">2961241</Counter> - <Counter worker="6">2801048</Counter> - <Counter worker="7">2981597</Counter> - </SelfMsg> - <SelfMsg activeWorker="9"> - <Counter worker="0">3126404</Counter> - <Counter worker="1">2792565</Counter> - <Counter worker="2">2828797</Counter> - <Counter worker="3">2953257</Counter> - <Counter worker="4">2761418</Counter> - <Counter worker="5">2980177</Counter> - <Counter worker="6">2818788</Counter> - <Counter worker="7">3000161</Counter> - <Counter worker="8">3522606</Counter> - </SelfMsg> - <SelfMsg activeWorker="10"> - <Counter worker="0">3114675</Counter> - <Counter worker="1">2782305</Counter> - <Counter worker="2">2818067</Counter> - <Counter worker="3">2942325</Counter> - <Counter worker="4">2750895</Counter> - <Counter worker="5">2969190</Counter> - <Counter worker="6">2808330</Counter> - <Counter worker="7">2988513</Counter> - <Counter worker="8">3277977</Counter> - <Counter worker="9">3277992</Counter> - </SelfMsg> - <SelfMsg activeWorker="11"> - <Counter worker="0">3134167</Counter> - <Counter worker="1">2799405</Counter> - <Counter worker="2">2835531</Counter> - <Counter worker="3">2960559</Counter> - <Counter worker="4">2768383</Counter> - <Counter worker="5">2987172</Counter> - <Counter worker="6">2825869</Counter> - <Counter worker="7">3008169</Counter> - <Counter worker="8">3229937</Counter> - <Counter worker="9">2865157</Counter> - <Counter worker="10">2924109</Counter> - </SelfMsg> - <SelfMsg activeWorker="12"> - <Counter worker="0">3122298</Counter> - <Counter worker="1">2788834</Counter> - <Counter worker="2">2824886</Counter> - <Counter worker="3">2949367</Counter> - <Counter worker="4">2757481</Counter> - <Counter worker="5">2976034</Counter> - <Counter worker="6">2814952</Counter> - <Counter worker="7">2996594</Counter> - <Counter worker="8">3196270</Counter> - <Counter worker="9">2832912</Counter> - <Counter worker="10">2868202</Counter> - <Counter worker="11">3287941</Counter> - </SelfMsg> - <SelfMsg activeWorker="13"> - <Counter worker="0">3110296</Counter> - <Counter worker="1">2778328</Counter> - <Counter worker="2">2814097</Counter> - <Counter worker="3">2938082</Counter> - <Counter worker="4">2747046</Counter> - <Counter worker="5">2964597</Counter> - <Counter worker="6">2804214</Counter> - <Counter worker="7">2985167</Counter> - <Counter worker="8">3162003</Counter> - <Counter worker="9">2798958</Counter> - <Counter worker="10">2828824</Counter> - <Counter worker="11">2981162</Counter> - <Counter worker="12">3033576</Counter> - </SelfMsg> - <SelfMsg activeWorker="14"> - <Counter worker="0">3129719</Counter> - <Counter worker="1">2795774</Counter> - <Counter worker="2">2831742</Counter> - <Counter worker="3">2956427</Counter> - <Counter worker="4">2764251</Counter> - <Counter worker="5">2983507</Counter> - <Counter worker="6">2821804</Counter> - <Counter worker="7">3003302</Counter> - <Counter worker="8">3168182</Counter> - <Counter worker="9">2795213</Counter> - <Counter worker="10">2824824</Counter> - <Counter worker="11">2985326</Counter> - <Counter worker="12">2788203</Counter> - <Counter worker="13">3060880</Counter> - </SelfMsg> - <SelfMsg activeWorker="15"> - <Counter worker="0">3117749</Counter> - <Counter worker="1">2785075</Counter> - <Counter worker="2">2821028</Counter> - <Counter worker="3">2945205</Counter> - <Counter worker="4">2753587</Counter> - <Counter worker="5">2971692</Counter> - <Counter worker="6">2811184</Counter> - <Counter worker="7">2991870</Counter> - <Counter worker="8">3136894</Counter> - <Counter worker="9">2769370</Counter> - <Counter worker="10">2799325</Counter> - <Counter worker="11">2955115</Counter> - <Counter worker="12">2791275</Counter> - <Counter worker="13">2965355</Counter> - <Counter worker="14">3235028</Counter> - </SelfMsg> - <SelfMsg activeWorker="16"> - <Counter worker="0">3105837</Counter> - <Counter worker="1">2774385</Counter> - <Counter worker="2">2809948</Counter> - <Counter worker="3">2933935</Counter> - <Counter worker="4">2743165</Counter> - <Counter worker="5">2960594</Counter> - <Counter worker="6">2800417</Counter> - <Counter worker="7">2980234</Counter> - <Counter worker="8">3107685</Counter> - <Counter worker="9">2740597</Counter> - <Counter worker="10">2772059</Counter> - <Counter worker="11">2927128</Counter> - <Counter worker="12">2757027</Counter> - <Counter worker="13">2938382</Counter> - <Counter worker="14">2823137</Counter> - <Counter worker="15">2965765</Counter> - </SelfMsg> - <SelfMsg activeWorker="17"> - <Counter worker="0">3125383</Counter> - <Counter worker="1">2791802</Counter> - <Counter worker="2">2827715</Counter> - <Counter worker="3">2952217</Counter> - <Counter worker="4">2760266</Counter> - <Counter worker="5">2978746</Counter> - <Counter worker="6">2817802</Counter> - <Counter worker="7">2999395</Counter> - <Counter worker="8">3127170</Counter> - <Counter worker="9">2757456</Counter> - <Counter worker="10">2789249</Counter> - <Counter worker="11">2945471</Counter> - <Counter worker="12">2774281</Counter> - <Counter worker="13">2956715</Counter> - <Counter worker="14">2840683</Counter> - <Counter worker="15">2984166</Counter> - <Counter worker="16">3488200</Counter> - </SelfMsg> - <SelfMsg activeWorker="18"> - <Counter worker="0">3113425</Counter> - <Counter worker="1">2781071</Counter> - <Counter worker="2">2816875</Counter> - <Counter worker="3">2940987</Counter> - <Counter worker="4">2749614</Counter> - <Counter worker="5">2967301</Counter> - <Counter worker="6">2806975</Counter> - <Counter worker="7">2987963</Counter> - <Counter worker="8">3115249</Counter> - <Counter worker="9">2746969</Counter> - <Counter worker="10">2778738</Counter> - <Counter worker="11">2934226</Counter> - <Counter worker="12">2763956</Counter> - <Counter worker="13">2945765</Counter> - <Counter worker="14">2829840</Counter> - <Counter worker="15">2973224</Counter> - <Counter worker="16">3271018</Counter> - <Counter worker="17">3271054</Counter> - </SelfMsg> - <SelfMsg activeWorker="19"> - <Counter worker="0">3132890</Counter> - <Counter worker="1">2798349</Counter> - <Counter worker="2">2834203</Counter> - <Counter worker="3">2959395</Counter> - <Counter worker="4">2766985</Counter> - <Counter worker="5">2986288</Counter> - <Counter worker="6">2824544</Counter> - <Counter worker="7">3006439</Counter> - <Counter worker="8">3134700</Counter> - <Counter worker="9">2764127</Counter> - <Counter worker="10">2795782</Counter> - <Counter worker="11">2952538</Counter> - <Counter worker="12">2780908</Counter> - <Counter worker="13">2963890</Counter> - <Counter worker="14">2847586</Counter> - <Counter worker="15">2991552</Counter> - <Counter worker="16">3245981</Counter> - <Counter worker="17">2954280</Counter> - <Counter worker="18">2960399</Counter> - </SelfMsg> - <SelfMsg activeWorker="20"> - <Counter worker="0">3120930</Counter> - <Counter worker="1">2787696</Counter> - <Counter worker="2">2823649</Counter> - <Counter worker="3">2948070</Counter> - <Counter worker="4">2756563</Counter> - <Counter worker="5">2974809</Counter> - <Counter worker="6">2813905</Counter> - <Counter worker="7">2995333</Counter> - <Counter worker="8">3122781</Counter> - <Counter worker="9">2753746</Counter> - <Counter worker="10">2785385</Counter> - <Counter worker="11">2941360</Counter> - <Counter worker="12">2770370</Counter> - <Counter worker="13">2952557</Counter> - <Counter worker="14">2836606</Counter> - <Counter worker="15">2981020</Counter> - <Counter worker="16">3210075</Counter> - <Counter worker="17">2900766</Counter> - <Counter worker="18">2922137</Counter> - <Counter worker="19">3306794</Counter> - </SelfMsg> - <SelfMsg activeWorker="21"> - <Counter worker="0">3108909</Counter> - <Counter worker="1">2777145</Counter> - <Counter worker="2">2812866</Counter> - <Counter worker="3">2936889</Counter> - <Counter worker="4">2745714</Counter> - <Counter worker="5">2963451</Counter> - <Counter worker="6">2803246</Counter> - <Counter worker="7">2983352</Counter> - <Counter worker="8">3110869</Counter> - <Counter worker="9">2743126</Counter> - <Counter worker="10">2774923</Counter> - <Counter worker="11">2930071</Counter> - <Counter worker="12">2759954</Counter> - <Counter worker="13">2941606</Counter> - <Counter worker="14">2825771</Counter> - <Counter worker="15">2969489</Counter> - <Counter worker="16">3177890</Counter> - <Counter worker="17">2868416</Counter> - <Counter worker="18">2886398</Counter> - <Counter worker="19">3000295</Counter> - <Counter worker="20">3041648</Counter> - </SelfMsg> - <SelfMsg activeWorker="22"> - <Counter worker="0">3128424</Counter> - <Counter worker="1">2794396</Counter> - <Counter worker="2">2830500</Counter> - <Counter worker="3">2955267</Counter> - <Counter worker="4">2763218</Counter> - <Counter worker="5">2982154</Counter> - <Counter worker="6">2820802</Counter> - <Counter worker="7">3001915</Counter> - <Counter worker="8">3130343</Counter> - <Counter worker="9">2760287</Counter> - <Counter worker="10">2792228</Counter> - <Counter worker="11">2948428</Counter> - <Counter worker="12">2777381</Counter> - <Counter worker="13">2960097</Counter> - <Counter worker="14">2843445</Counter> - <Counter worker="15">2987356</Counter> - <Counter worker="16">3179030</Counter> - <Counter worker="17">2869858</Counter> - <Counter worker="18">2888921</Counter> - <Counter worker="19">3003560</Counter> - <Counter worker="20">2800382</Counter> - <Counter worker="21">3080561</Counter> - </SelfMsg> - <SelfMsg activeWorker="23"> - <Counter worker="0">3116426</Counter> - <Counter worker="1">2783664</Counter> - <Counter worker="2">2819691</Counter> - <Counter worker="3">2943818</Counter> - <Counter worker="4">2752563</Counter> - <Counter worker="5">2970563</Counter> - <Counter worker="6">2810085</Counter> - <Counter worker="7">2990572</Counter> - <Counter worker="8">3118382</Counter> - <Counter worker="9">2749721</Counter> - <Counter worker="10">2781546</Counter> - <Counter worker="11">2937163</Counter> - <Counter worker="12">2766431</Counter> - <Counter worker="13">2948572</Counter> - <Counter worker="14">2832634</Counter> - <Counter worker="15">2975988</Counter> - <Counter worker="16">3149076</Counter> - <Counter worker="17">2832666</Counter> - <Counter worker="18">2854858</Counter> - <Counter worker="19">2972102</Counter> - <Counter worker="20">2793073</Counter> - <Counter worker="21">2986039</Counter> - <Counter worker="22">3225121</Counter> - </SelfMsg> - <SelfMsg activeWorker="24"> - <Counter worker="0">3135941</Counter> - <Counter worker="1">2801108</Counter> - <Counter worker="2">2837415</Counter> - <Counter worker="3">2962374</Counter> - <Counter worker="4">2769627</Counter> - <Counter worker="5">2989102</Counter> - <Counter worker="6">2827394</Counter> - <Counter worker="7">3009512</Counter> - <Counter worker="8">3137796</Counter> - <Counter worker="9">2766961</Counter> - <Counter worker="10">2798946</Counter> - <Counter worker="11">2955433</Counter> - <Counter worker="12">2783657</Counter> - <Counter worker="13">2966727</Counter> - <Counter worker="14">2850374</Counter> - <Counter worker="15">2995580</Counter> - <Counter worker="16">3148697</Counter> - <Counter worker="17">2826014</Counter> - <Counter worker="18">2851067</Counter> - <Counter worker="19">2971518</Counter> - <Counter worker="20">2793285</Counter> - <Counter worker="21">2985399</Counter> - <Counter worker="22">2839863</Counter> - <Counter worker="23">3046065</Counter> - </SelfMsg> - <ManyToOneMsg activeWorker="1"> - <Counter worker="0">3513959</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="2"> - <Counter worker="0">2148757</Counter> - <Counter worker="1">4297993</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="3"> - <Counter worker="0">1452258</Counter> - <Counter worker="1">2904799</Counter> - <Counter worker="2">2905020</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="4"> - <Counter worker="0">1251019</Counter> - <Counter worker="1">2502307</Counter> - <Counter worker="2">2502360</Counter> - <Counter worker="3">2502336</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="5"> - <Counter worker="0">969243</Counter> - <Counter worker="1">1938692</Counter> - <Counter worker="2">1938759</Counter> - <Counter worker="3">1938750</Counter> - <Counter worker="4">1938748</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="6"> - <Counter worker="0">888969</Counter> - <Counter worker="1">1778150</Counter> - <Counter worker="2">1778176</Counter> - <Counter worker="3">1778186</Counter> - <Counter worker="4">1778185</Counter> - <Counter worker="5">1778201</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="7"> - <Counter worker="0">736930</Counter> - <Counter worker="1">1474061</Counter> - <Counter worker="2">1474091</Counter> - <Counter worker="3">1474088</Counter> - <Counter worker="4">1474098</Counter> - <Counter worker="5">1474102</Counter> - <Counter worker="6">1474091</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="8"> - <Counter worker="0">690772</Counter> - <Counter worker="1">1381767</Counter> - <Counter worker="2">1381778</Counter> - <Counter worker="3">1381787</Counter> - <Counter worker="4">1381767</Counter> - <Counter worker="5">1381780</Counter> - <Counter worker="6">1381774</Counter> - <Counter worker="7">1381762</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="9"> - <Counter worker="0">220518</Counter> - <Counter worker="1">441123</Counter> - <Counter worker="2">441112</Counter> - <Counter worker="3">441154</Counter> - <Counter worker="4">441164</Counter> - <Counter worker="5">441164</Counter> - <Counter worker="6">441156</Counter> - <Counter worker="7">441176</Counter> - <Counter worker="8">441129</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="10"> - <Counter worker="0">195773</Counter> - <Counter worker="1">391623</Counter> - <Counter worker="2">391629</Counter> - <Counter worker="3">391634</Counter> - <Counter worker="4">391637</Counter> - <Counter worker="5">391622</Counter> - <Counter worker="6">391626</Counter> - <Counter worker="7">391634</Counter> - <Counter worker="8">391666</Counter> - <Counter worker="9">391680</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="11"> - <Counter worker="0">176797</Counter> - <Counter worker="1">353626</Counter> - <Counter worker="2">353641</Counter> - <Counter worker="3">353633</Counter> - <Counter worker="4">353640</Counter> - <Counter worker="5">353639</Counter> - <Counter worker="6">353633</Counter> - <Counter worker="7">353638</Counter> - <Counter worker="8">353682</Counter> - <Counter worker="9">353691</Counter> - <Counter worker="10">353692</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="12"> - <Counter worker="0">162870</Counter> - <Counter worker="1">325764</Counter> - <Counter worker="2">325774</Counter> - <Counter worker="3">325776</Counter> - <Counter worker="4">325780</Counter> - <Counter worker="5">325777</Counter> - <Counter worker="6">325782</Counter> - <Counter worker="7">325773</Counter> - <Counter worker="8">325785</Counter> - <Counter worker="9">325795</Counter> - <Counter worker="10">325790</Counter> - <Counter worker="11">325791</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="13"> - <Counter worker="0">148531</Counter> - <Counter worker="1">297092</Counter> - <Counter worker="2">297094</Counter> - <Counter worker="3">297096</Counter> - <Counter worker="4">297090</Counter> - <Counter worker="5">297097</Counter> - <Counter worker="6">297088</Counter> - <Counter worker="7">297094</Counter> - <Counter worker="8">297102</Counter> - <Counter worker="9">297104</Counter> - <Counter worker="10">297105</Counter> - <Counter worker="11">297101</Counter> - <Counter worker="12">297106</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="14"> - <Counter worker="0">139216</Counter> - <Counter worker="1">278451</Counter> - <Counter worker="2">278457</Counter> - <Counter worker="3">278454</Counter> - <Counter worker="4">278460</Counter> - <Counter worker="5">278454</Counter> - <Counter worker="6">278456</Counter> - <Counter worker="7">278455</Counter> - <Counter worker="8">278462</Counter> - <Counter worker="9">278466</Counter> - <Counter worker="10">278460</Counter> - <Counter worker="11">278465</Counter> - <Counter worker="12">278461</Counter> - <Counter worker="13">278461</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="15"> - <Counter worker="0">128494</Counter> - <Counter worker="1">257011</Counter> - <Counter worker="2">257013</Counter> - <Counter worker="3">257014</Counter> - <Counter worker="4">257011</Counter> - <Counter worker="5">257014</Counter> - <Counter worker="6">257010</Counter> - <Counter worker="7">257007</Counter> - <Counter worker="8">257012</Counter> - <Counter worker="9">257015</Counter> - <Counter worker="10">257014</Counter> - <Counter worker="11">257011</Counter> - <Counter worker="12">257014</Counter> - <Counter worker="13">257014</Counter> - <Counter worker="14">257018</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="16"> - <Counter worker="0">118432</Counter> - <Counter worker="1">236882</Counter> - <Counter worker="2">236885</Counter> - <Counter worker="3">236883</Counter> - <Counter worker="4">236886</Counter> - <Counter worker="5">236886</Counter> - <Counter worker="6">236886</Counter> - <Counter worker="7">236887</Counter> - <Counter worker="8">236890</Counter> - <Counter worker="9">236885</Counter> - <Counter worker="10">236888</Counter> - <Counter worker="11">236886</Counter> - <Counter worker="12">236888</Counter> - <Counter worker="13">236889</Counter> - <Counter worker="14">236881</Counter> - <Counter worker="15">236882</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="17"> - <Counter worker="0">112260</Counter> - <Counter worker="1">224532</Counter> - <Counter worker="2">224536</Counter> - <Counter worker="3">224536</Counter> - <Counter worker="4">224535</Counter> - <Counter worker="5">224536</Counter> - <Counter worker="6">224535</Counter> - <Counter worker="7">224535</Counter> - <Counter worker="8">224534</Counter> - <Counter worker="9">224536</Counter> - <Counter worker="10">224534</Counter> - <Counter worker="11">224532</Counter> - <Counter worker="12">224535</Counter> - <Counter worker="13">224537</Counter> - <Counter worker="14">224533</Counter> - <Counter worker="15">224536</Counter> - <Counter worker="16">224539</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="18"> - <Counter worker="0">104670</Counter> - <Counter worker="1">209354</Counter> - <Counter worker="2">209355</Counter> - <Counter worker="3">209354</Counter> - <Counter worker="4">209359</Counter> - <Counter worker="5">209361</Counter> - <Counter worker="6">209356</Counter> - <Counter worker="7">209358</Counter> - <Counter worker="8">209356</Counter> - <Counter worker="9">209354</Counter> - <Counter worker="10">209353</Counter> - <Counter worker="11">209354</Counter> - <Counter worker="12">209357</Counter> - <Counter worker="13">209356</Counter> - <Counter worker="14">209355</Counter> - <Counter worker="15">209353</Counter> - <Counter worker="16">209360</Counter> - <Counter worker="17">209362</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="19"> - <Counter worker="0">98829</Counter> - <Counter worker="1">197675</Counter> - <Counter worker="2">197673</Counter> - <Counter worker="3">197672</Counter> - <Counter worker="4">197674</Counter> - <Counter worker="5">197674</Counter> - <Counter worker="6">197672</Counter> - <Counter worker="7">197672</Counter> - <Counter worker="8">197672</Counter> - <Counter worker="9">197671</Counter> - <Counter worker="10">197671</Counter> - <Counter worker="11">197669</Counter> - <Counter worker="12">197672</Counter> - <Counter worker="13">197674</Counter> - <Counter worker="14">197675</Counter> - <Counter worker="15">197669</Counter> - <Counter worker="16">197676</Counter> - <Counter worker="17">197678</Counter> - <Counter worker="18">197676</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="20"> - <Counter worker="0">92505</Counter> - <Counter worker="1">185021</Counter> - <Counter worker="2">185021</Counter> - <Counter worker="3">185025</Counter> - <Counter worker="4">185025</Counter> - <Counter worker="5">185021</Counter> - <Counter worker="6">185022</Counter> - <Counter worker="7">185022</Counter> - <Counter worker="8">185023</Counter> - <Counter worker="9">185023</Counter> - <Counter worker="10">185020</Counter> - <Counter worker="11">185021</Counter> - <Counter worker="12">185022</Counter> - <Counter worker="13">185025</Counter> - <Counter worker="14">185022</Counter> - <Counter worker="15">185024</Counter> - <Counter worker="16">185027</Counter> - <Counter worker="17">185029</Counter> - <Counter worker="18">185025</Counter> - <Counter worker="19">185027</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="21"> - <Counter worker="0">88095</Counter> - <Counter worker="1">176199</Counter> - <Counter worker="2">176202</Counter> - <Counter worker="3">176199</Counter> - <Counter worker="4">176201</Counter> - <Counter worker="5">176201</Counter> - <Counter worker="6">176201</Counter> - <Counter worker="7">176202</Counter> - <Counter worker="8">176198</Counter> - <Counter worker="9">176200</Counter> - <Counter worker="10">176197</Counter> - <Counter worker="11">176199</Counter> - <Counter worker="12">176197</Counter> - <Counter worker="13">176202</Counter> - <Counter worker="14">176198</Counter> - <Counter worker="15">176199</Counter> - <Counter worker="16">176204</Counter> - <Counter worker="17">176203</Counter> - <Counter worker="18">176203</Counter> - <Counter worker="19">176206</Counter> - <Counter worker="20">176204</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="22"> - <Counter worker="0">84520</Counter> - <Counter worker="1">169052</Counter> - <Counter worker="2">169051</Counter> - <Counter worker="3">169053</Counter> - <Counter worker="4">169051</Counter> - <Counter worker="5">169056</Counter> - <Counter worker="6">169050</Counter> - <Counter worker="7">169052</Counter> - <Counter worker="8">169052</Counter> - <Counter worker="9">169053</Counter> - <Counter worker="10">169050</Counter> - <Counter worker="11">169051</Counter> - <Counter worker="12">169052</Counter> - <Counter worker="13">169053</Counter> - <Counter worker="14">169051</Counter> - <Counter worker="15">169051</Counter> - <Counter worker="16">169054</Counter> - <Counter worker="17">169056</Counter> - <Counter worker="18">169053</Counter> - <Counter worker="19">169055</Counter> - <Counter worker="20">169055</Counter> - <Counter worker="21">169054</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="23"> - <Counter worker="0">79421</Counter> - <Counter worker="1">158852</Counter> - <Counter worker="2">158852</Counter> - <Counter worker="3">158854</Counter> - <Counter worker="4">158852</Counter> - <Counter worker="5">158853</Counter> - <Counter worker="6">158853</Counter> - <Counter worker="7">158853</Counter> - <Counter worker="8">158852</Counter> - <Counter worker="9">158854</Counter> - <Counter worker="10">158852</Counter> - <Counter worker="11">158851</Counter> - <Counter worker="12">158853</Counter> - <Counter worker="13">158854</Counter> - <Counter worker="14">158850</Counter> - <Counter worker="15">158852</Counter> - <Counter worker="16">158855</Counter> - <Counter worker="17">158855</Counter> - <Counter worker="18">158851</Counter> - <Counter worker="19">158854</Counter> - <Counter worker="20">158853</Counter> - <Counter worker="21">158854</Counter> - <Counter worker="22">158854</Counter> - </ManyToOneMsg> - <ManyToOneMsg activeWorker="24"> - <Counter worker="0">75524</Counter> - <Counter worker="1">151058</Counter> - <Counter worker="2">151058</Counter> - <Counter worker="3">151057</Counter> - <Counter worker="4">151060</Counter> - <Counter worker="5">151057</Counter> - <Counter worker="6">151056</Counter> - <Counter worker="7">151056</Counter> - <Counter worker="8">151057</Counter> - <Counter worker="9">151057</Counter> - <Counter worker="10">151058</Counter> - <Counter worker="11">151058</Counter> - <Counter worker="12">151056</Counter> - <Counter worker="13">151057</Counter> - <Counter worker="14">151055</Counter> - <Counter worker="15">151056</Counter> - <Counter worker="16">151057</Counter> - <Counter worker="17">151056</Counter> - <Counter worker="18">151055</Counter> - <Counter worker="19">151057</Counter> - <Counter worker="20">151057</Counter> - <Counter worker="21">151057</Counter> - <Counter worker="22">151056</Counter> - <Counter worker="23">151056</Counter> - </ManyToOneMsg> - <ManySysLockMutex activeWorker="1"> - <Counter worker="0">7748082</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="2"> - <Counter worker="0">7647592</Counter> - <Counter worker="1">7648024</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="3"> - <Counter worker="0">7462713</Counter> - <Counter worker="1">7463150</Counter> - <Counter worker="2">7463302</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="4"> - <Counter worker="0">7227558</Counter> - <Counter worker="1">7228059</Counter> - <Counter worker="2">7228161</Counter> - <Counter worker="3">7228157</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="5"> - <Counter worker="0">7271144</Counter> - <Counter worker="1">7271595</Counter> - <Counter worker="2">7271690</Counter> - <Counter worker="3">7271685</Counter> - <Counter worker="4">7278972</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="6"> - <Counter worker="0">7115560</Counter> - <Counter worker="1">7115973</Counter> - <Counter worker="2">7116081</Counter> - <Counter worker="3">7116116</Counter> - <Counter worker="4">7116156</Counter> - <Counter worker="5">7116139</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="7"> - <Counter worker="0">7032158</Counter> - <Counter worker="1">7032584</Counter> - <Counter worker="2">7032605</Counter> - <Counter worker="3">7032700</Counter> - <Counter worker="4">7032840</Counter> - <Counter worker="5">7032751</Counter> - <Counter worker="6">7033457</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="8"> - <Counter worker="0">6943403</Counter> - <Counter worker="1">6943907</Counter> - <Counter worker="2">6944388</Counter> - <Counter worker="3">6944535</Counter> - <Counter worker="4">6945558</Counter> - <Counter worker="5">6945385</Counter> - <Counter worker="6">6944965</Counter> - <Counter worker="7">6945056</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="9"> - <Counter worker="0">6904189</Counter> - <Counter worker="1">6904648</Counter> - <Counter worker="2">6904665</Counter> - <Counter worker="3">6904794</Counter> - <Counter worker="4">6906704</Counter> - <Counter worker="5">6906596</Counter> - <Counter worker="6">6905038</Counter> - <Counter worker="7">6905171</Counter> - <Counter worker="8">7732157</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="10"> - <Counter worker="0">6890600</Counter> - <Counter worker="1">6891096</Counter> - <Counter worker="2">6889623</Counter> - <Counter worker="3">6889754</Counter> - <Counter worker="4">6895076</Counter> - <Counter worker="5">6895009</Counter> - <Counter worker="6">6891303</Counter> - <Counter worker="7">6891441</Counter> - <Counter worker="8">7561832</Counter> - <Counter worker="9">7561812</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="11"> - <Counter worker="0">6936032</Counter> - <Counter worker="1">6936473</Counter> - <Counter worker="2">6936855</Counter> - <Counter worker="3">6936996</Counter> - <Counter worker="4">6937867</Counter> - <Counter worker="5">6937801</Counter> - <Counter worker="6">6937155</Counter> - <Counter worker="7">6937284</Counter> - <Counter worker="8">7426273</Counter> - <Counter worker="9">7426282</Counter> - <Counter worker="10">7426249</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="12"> - <Counter worker="0">6886873</Counter> - <Counter worker="1">6888027</Counter> - <Counter worker="2">6888211</Counter> - <Counter worker="3">6888343</Counter> - <Counter worker="4">6892413</Counter> - <Counter worker="5">6892299</Counter> - <Counter worker="6">6888993</Counter> - <Counter worker="7">6889126</Counter> - <Counter worker="8">7246586</Counter> - <Counter worker="9">7246631</Counter> - <Counter worker="10">7246645</Counter> - <Counter worker="11">7246622</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="13"> - <Counter worker="0">6959061</Counter> - <Counter worker="1">6959491</Counter> - <Counter worker="2">6959651</Counter> - <Counter worker="3">6959746</Counter> - <Counter worker="4">6960533</Counter> - <Counter worker="5">6960423</Counter> - <Counter worker="6">6960346</Counter> - <Counter worker="7">6960483</Counter> - <Counter worker="8">7275133</Counter> - <Counter worker="9">7275113</Counter> - <Counter worker="10">7275196</Counter> - <Counter worker="11">7275136</Counter> - <Counter worker="12">7279912</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="14"> - <Counter worker="0">6923135</Counter> - <Counter worker="1">6923561</Counter> - <Counter worker="2">6923846</Counter> - <Counter worker="3">6923929</Counter> - <Counter worker="4">6926308</Counter> - <Counter worker="5">6926220</Counter> - <Counter worker="6">6924046</Counter> - <Counter worker="7">6924171</Counter> - <Counter worker="8">7098844</Counter> - <Counter worker="9">7098788</Counter> - <Counter worker="10">7098814</Counter> - <Counter worker="11">7098753</Counter> - <Counter worker="12">7098782</Counter> - <Counter worker="13">7098724</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="15"> - <Counter worker="0">6897278</Counter> - <Counter worker="1">6897722</Counter> - <Counter worker="2">6897985</Counter> - <Counter worker="3">6898091</Counter> - <Counter worker="4">6900152</Counter> - <Counter worker="5">6900044</Counter> - <Counter worker="6">6899295</Counter> - <Counter worker="7">6899389</Counter> - <Counter worker="8">7029806</Counter> - <Counter worker="9">7029783</Counter> - <Counter worker="10">7029530</Counter> - <Counter worker="11">7029484</Counter> - <Counter worker="12">7029691</Counter> - <Counter worker="13">7029614</Counter> - <Counter worker="14">7036890</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="16"> - <Counter worker="0">6937172</Counter> - <Counter worker="1">6937594</Counter> - <Counter worker="2">6937636</Counter> - <Counter worker="3">6937737</Counter> - <Counter worker="4">6938639</Counter> - <Counter worker="5">6938539</Counter> - <Counter worker="6">6938146</Counter> - <Counter worker="7">6938285</Counter> - <Counter worker="8">6845765</Counter> - <Counter worker="9">6845811</Counter> - <Counter worker="10">6844591</Counter> - <Counter worker="11">6844579</Counter> - <Counter worker="12">6847898</Counter> - <Counter worker="13">6847925</Counter> - <Counter worker="14">6854383</Counter> - <Counter worker="15">6854413</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="17"> - <Counter worker="0">6899164</Counter> - <Counter worker="1">6899621</Counter> - <Counter worker="2">6899868</Counter> - <Counter worker="3">6899979</Counter> - <Counter worker="4">6903162</Counter> - <Counter worker="5">6903081</Counter> - <Counter worker="6">6901182</Counter> - <Counter worker="7">6901304</Counter> - <Counter worker="8">6786503</Counter> - <Counter worker="9">6786566</Counter> - <Counter worker="10">6785567</Counter> - <Counter worker="11">6785489</Counter> - <Counter worker="12">6786492</Counter> - <Counter worker="13">6786497</Counter> - <Counter worker="14">6788266</Counter> - <Counter worker="15">6788323</Counter> - <Counter worker="16">7729409</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="18"> - <Counter worker="0">6879345</Counter> - <Counter worker="1">6879777</Counter> - <Counter worker="2">6879643</Counter> - <Counter worker="3">6879775</Counter> - <Counter worker="4">6882068</Counter> - <Counter worker="5">6881973</Counter> - <Counter worker="6">6880439</Counter> - <Counter worker="7">6880578</Counter> - <Counter worker="8">6777968</Counter> - <Counter worker="9">6778044</Counter> - <Counter worker="10">6777204</Counter> - <Counter worker="11">6777188</Counter> - <Counter worker="12">6777851</Counter> - <Counter worker="13">6777905</Counter> - <Counter worker="14">6779627</Counter> - <Counter worker="15">6779691</Counter> - <Counter worker="16">7557727</Counter> - <Counter worker="17">7557705</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="19"> - <Counter worker="0">6937193</Counter> - <Counter worker="1">6937631</Counter> - <Counter worker="2">6937312</Counter> - <Counter worker="3">6937409</Counter> - <Counter worker="4">6940007</Counter> - <Counter worker="5">6939931</Counter> - <Counter worker="6">6938301</Counter> - <Counter worker="7">6938409</Counter> - <Counter worker="8">6827232</Counter> - <Counter worker="9">6827251</Counter> - <Counter worker="10">6826171</Counter> - <Counter worker="11">6826057</Counter> - <Counter worker="12">6827889</Counter> - <Counter worker="13">6827896</Counter> - <Counter worker="14">6830967</Counter> - <Counter worker="15">6830958</Counter> - <Counter worker="16">7441511</Counter> - <Counter worker="17">7441523</Counter> - <Counter worker="18">7441610</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="20"> - <Counter worker="0">6900511</Counter> - <Counter worker="1">6900940</Counter> - <Counter worker="2">6901585</Counter> - <Counter worker="3">6901715</Counter> - <Counter worker="4">6902897</Counter> - <Counter worker="5">6902770</Counter> - <Counter worker="6">6902123</Counter> - <Counter worker="7">6902302</Counter> - <Counter worker="8">6781385</Counter> - <Counter worker="9">6781384</Counter> - <Counter worker="10">6779534</Counter> - <Counter worker="11">6779472</Counter> - <Counter worker="12">6781940</Counter> - <Counter worker="13">6781974</Counter> - <Counter worker="14">6784544</Counter> - <Counter worker="15">6784535</Counter> - <Counter worker="16">7224882</Counter> - <Counter worker="17">7224913</Counter> - <Counter worker="18">7224905</Counter> - <Counter worker="19">7224953</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="21"> - <Counter worker="0">6943617</Counter> - <Counter worker="1">6944082</Counter> - <Counter worker="2">6943750</Counter> - <Counter worker="3">6943857</Counter> - <Counter worker="4">6945186</Counter> - <Counter worker="5">6945096</Counter> - <Counter worker="6">6944668</Counter> - <Counter worker="7">6944790</Counter> - <Counter worker="8">6781824</Counter> - <Counter worker="9">6781819</Counter> - <Counter worker="10">6780449</Counter> - <Counter worker="11">6780372</Counter> - <Counter worker="12">6782024</Counter> - <Counter worker="13">6782050</Counter> - <Counter worker="14">6784510</Counter> - <Counter worker="15">6784514</Counter> - <Counter worker="16">7257452</Counter> - <Counter worker="17">7257495</Counter> - <Counter worker="18">7257487</Counter> - <Counter worker="19">7257508</Counter> - <Counter worker="20">7257524</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="22"> - <Counter worker="0">6917953</Counter> - <Counter worker="1">6918400</Counter> - <Counter worker="2">6919356</Counter> - <Counter worker="3">6919471</Counter> - <Counter worker="4">6920305</Counter> - <Counter worker="5">6920183</Counter> - <Counter worker="6">6919649</Counter> - <Counter worker="7">6919751</Counter> - <Counter worker="8">6791371</Counter> - <Counter worker="9">6791413</Counter> - <Counter worker="10">6788420</Counter> - <Counter worker="11">6788340</Counter> - <Counter worker="12">6792848</Counter> - <Counter worker="13">6792844</Counter> - <Counter worker="14">6797629</Counter> - <Counter worker="15">6797728</Counter> - <Counter worker="16">7113691</Counter> - <Counter worker="17">7113715</Counter> - <Counter worker="18">7112292</Counter> - <Counter worker="19">7112305</Counter> - <Counter worker="20">7113609</Counter> - <Counter worker="21">7113680</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="23"> - <Counter worker="0">6891252</Counter> - <Counter worker="1">6891663</Counter> - <Counter worker="2">6891546</Counter> - <Counter worker="3">6891706</Counter> - <Counter worker="4">6893277</Counter> - <Counter worker="5">6893152</Counter> - <Counter worker="6">6892566</Counter> - <Counter worker="7">6892657</Counter> - <Counter worker="8">6759690</Counter> - <Counter worker="9">6759744</Counter> - <Counter worker="10">6757928</Counter> - <Counter worker="11">6757837</Counter> - <Counter worker="12">6760968</Counter> - <Counter worker="13">6760984</Counter> - <Counter worker="14">6764597</Counter> - <Counter worker="15">6764671</Counter> - <Counter worker="16">7031553</Counter> - <Counter worker="17">7031562</Counter> - <Counter worker="18">7031468</Counter> - <Counter worker="19">7031438</Counter> - <Counter worker="20">7031584</Counter> - <Counter worker="21">7031649</Counter> - <Counter worker="22">7034463</Counter> - </ManySysLockMutex> - <ManySysLockMutex activeWorker="24"> - <Counter worker="0">6936624</Counter> - <Counter worker="1">6937095</Counter> - <Counter worker="2">6937990</Counter> - <Counter worker="3">6938116</Counter> - <Counter worker="4">6938974</Counter> - <Counter worker="5">6938848</Counter> - <Counter worker="6">6938729</Counter> - <Counter worker="7">6938855</Counter> - <Counter worker="8">6802487</Counter> - <Counter worker="9">6802507</Counter> - <Counter worker="10">6802119</Counter> - <Counter worker="11">6802052</Counter> - <Counter worker="12">6804132</Counter> - <Counter worker="13">6804142</Counter> - <Counter worker="14">6807402</Counter> - <Counter worker="15">6807440</Counter> - <Counter worker="16">6895101</Counter> - <Counter worker="17">6895091</Counter> - <Counter worker="18">6896248</Counter> - <Counter worker="19">6896161</Counter> - <Counter worker="20">6894890</Counter> - <Counter worker="21">6894820</Counter> - <Counter worker="22">6893800</Counter> - <Counter worker="23">6893757</Counter> - </ManySysLockMutex> - <ManyClassicCeilingMutex activeWorker="1"> - <Counter worker="0">783933</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="2"> - <Counter worker="0">715842</Counter> - <Counter worker="1">715877</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="3"> - <Counter worker="0">673594</Counter> - <Counter worker="1">673548</Counter> - <Counter worker="2">673597</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="4"> - <Counter worker="0">507004</Counter> - <Counter worker="1">506998</Counter> - <Counter worker="2">506958</Counter> - <Counter worker="3">507007</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="5"> - <Counter worker="0">399544</Counter> - <Counter worker="1">399546</Counter> - <Counter worker="2">399537</Counter> - <Counter worker="3">399496</Counter> - <Counter worker="4">399551</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="6"> - <Counter worker="0">326511</Counter> - <Counter worker="1">326516</Counter> - <Counter worker="2">326514</Counter> - <Counter worker="3">326477</Counter> - <Counter worker="4">326516</Counter> - <Counter worker="5">326515</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="7"> - <Counter worker="0">262720</Counter> - <Counter worker="1">262759</Counter> - <Counter worker="2">262752</Counter> - <Counter worker="3">262761</Counter> - <Counter worker="4">262765</Counter> - <Counter worker="5">262760</Counter> - <Counter worker="6">262754</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="8"> - <Counter worker="0">234094</Counter> - <Counter worker="1">234134</Counter> - <Counter worker="2">234129</Counter> - <Counter worker="3">234127</Counter> - <Counter worker="4">234131</Counter> - <Counter worker="5">234121</Counter> - <Counter worker="6">234124</Counter> - <Counter worker="7">234127</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="9"> - <Counter worker="0">108770</Counter> - <Counter worker="1">108767</Counter> - <Counter worker="2">108774</Counter> - <Counter worker="3">108774</Counter> - <Counter worker="4">108762</Counter> - <Counter worker="5">108772</Counter> - <Counter worker="6">108769</Counter> - <Counter worker="7">108772</Counter> - <Counter worker="8">108769</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="10"> - <Counter worker="0">88888</Counter> - <Counter worker="1">88883</Counter> - <Counter worker="2">88889</Counter> - <Counter worker="3">88885</Counter> - <Counter worker="4">88885</Counter> - <Counter worker="5">88885</Counter> - <Counter worker="6">88883</Counter> - <Counter worker="7">88882</Counter> - <Counter worker="8">88877</Counter> - <Counter worker="9">88883</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="11"> - <Counter worker="0">77874</Counter> - <Counter worker="1">77873</Counter> - <Counter worker="2">77879</Counter> - <Counter worker="3">77872</Counter> - <Counter worker="4">77873</Counter> - <Counter worker="5">77877</Counter> - <Counter worker="6">77880</Counter> - <Counter worker="7">77876</Counter> - <Counter worker="8">77874</Counter> - <Counter worker="9">77870</Counter> - <Counter worker="10">77872</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="12"> - <Counter worker="0">70256</Counter> - <Counter worker="1">70259</Counter> - <Counter worker="2">70264</Counter> - <Counter worker="3">70258</Counter> - <Counter worker="4">70262</Counter> - <Counter worker="5">70266</Counter> - <Counter worker="6">70260</Counter> - <Counter worker="7">70256</Counter> - <Counter worker="8">70257</Counter> - <Counter worker="9">70258</Counter> - <Counter worker="10">70259</Counter> - <Counter worker="11">70258</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="13"> - <Counter worker="0">62735</Counter> - <Counter worker="1">62740</Counter> - <Counter worker="2">62741</Counter> - <Counter worker="3">62737</Counter> - <Counter worker="4">62733</Counter> - <Counter worker="5">62735</Counter> - <Counter worker="6">62736</Counter> - <Counter worker="7">62734</Counter> - <Counter worker="8">62732</Counter> - <Counter worker="9">62731</Counter> - <Counter worker="10">62731</Counter> - <Counter worker="11">62730</Counter> - <Counter worker="12">62730</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="14"> - <Counter worker="0">59093</Counter> - <Counter worker="1">59091</Counter> - <Counter worker="2">59093</Counter> - <Counter worker="3">59094</Counter> - <Counter worker="4">59088</Counter> - <Counter worker="5">59092</Counter> - <Counter worker="6">59099</Counter> - <Counter worker="7">59097</Counter> - <Counter worker="8">59091</Counter> - <Counter worker="9">59089</Counter> - <Counter worker="10">59088</Counter> - <Counter worker="11">59102</Counter> - <Counter worker="12">59088</Counter> - <Counter worker="13">59087</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="15"> - <Counter worker="0">51130</Counter> - <Counter worker="1">51127</Counter> - <Counter worker="2">51121</Counter> - <Counter worker="3">51131</Counter> - <Counter worker="4">51123</Counter> - <Counter worker="5">51125</Counter> - <Counter worker="6">51129</Counter> - <Counter worker="7">51121</Counter> - <Counter worker="8">51125</Counter> - <Counter worker="9">51120</Counter> - <Counter worker="10">51126</Counter> - <Counter worker="11">51122</Counter> - <Counter worker="12">51124</Counter> - <Counter worker="13">51122</Counter> - <Counter worker="14">51124</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="16"> - <Counter worker="0">48586</Counter> - <Counter worker="1">48591</Counter> - <Counter worker="2">48592</Counter> - <Counter worker="3">48586</Counter> - <Counter worker="4">48586</Counter> - <Counter worker="5">48590</Counter> - <Counter worker="6">48588</Counter> - <Counter worker="7">48587</Counter> - <Counter worker="8">48594</Counter> - <Counter worker="9">48596</Counter> - <Counter worker="10">48588</Counter> - <Counter worker="11">48589</Counter> - <Counter worker="12">48596</Counter> - <Counter worker="13">48593</Counter> - <Counter worker="14">48591</Counter> - <Counter worker="15">48589</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="17"> - <Counter worker="0">43007</Counter> - <Counter worker="1">42998</Counter> - <Counter worker="2">43002</Counter> - <Counter worker="3">43006</Counter> - <Counter worker="4">43008</Counter> - <Counter worker="5">43010</Counter> - <Counter worker="6">43000</Counter> - <Counter worker="7">43002</Counter> - <Counter worker="8">42999</Counter> - <Counter worker="9">43000</Counter> - <Counter worker="10">43003</Counter> - <Counter worker="11">42999</Counter> - <Counter worker="12">42998</Counter> - <Counter worker="13">43001</Counter> - <Counter worker="14">43004</Counter> - <Counter worker="15">43005</Counter> - <Counter worker="16">43005</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="18"> - <Counter worker="0">38958</Counter> - <Counter worker="1">38953</Counter> - <Counter worker="2">38958</Counter> - <Counter worker="3">38951</Counter> - <Counter worker="4">38950</Counter> - <Counter worker="5">38972</Counter> - <Counter worker="6">38950</Counter> - <Counter worker="7">38953</Counter> - <Counter worker="8">38957</Counter> - <Counter worker="9">38956</Counter> - <Counter worker="10">38955</Counter> - <Counter worker="11">38967</Counter> - <Counter worker="12">38952</Counter> - <Counter worker="13">38952</Counter> - <Counter worker="14">38963</Counter> - <Counter worker="15">38951</Counter> - <Counter worker="16">38960</Counter> - <Counter worker="17">38954</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="19"> - <Counter worker="0">37040</Counter> - <Counter worker="1">37042</Counter> - <Counter worker="2">37050</Counter> - <Counter worker="3">37051</Counter> - <Counter worker="4">37049</Counter> - <Counter worker="5">37047</Counter> - <Counter worker="6">37044</Counter> - <Counter worker="7">37042</Counter> - <Counter worker="8">37048</Counter> - <Counter worker="9">37039</Counter> - <Counter worker="10">37045</Counter> - <Counter worker="11">37041</Counter> - <Counter worker="12">37041</Counter> - <Counter worker="13">37038</Counter> - <Counter worker="14">37038</Counter> - <Counter worker="15">37040</Counter> - <Counter worker="16">37043</Counter> - <Counter worker="17">37044</Counter> - <Counter worker="18">37045</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="20"> - <Counter worker="0">33977</Counter> - <Counter worker="1">33977</Counter> - <Counter worker="2">33969</Counter> - <Counter worker="3">33975</Counter> - <Counter worker="4">33965</Counter> - <Counter worker="5">33968</Counter> - <Counter worker="6">33967</Counter> - <Counter worker="7">33974</Counter> - <Counter worker="8">33968</Counter> - <Counter worker="9">33972</Counter> - <Counter worker="10">33964</Counter> - <Counter worker="11">33973</Counter> - <Counter worker="12">33970</Counter> - <Counter worker="13">33967</Counter> - <Counter worker="14">33965</Counter> - <Counter worker="15">33966</Counter> - <Counter worker="16">33966</Counter> - <Counter worker="17">33972</Counter> - <Counter worker="18">33971</Counter> - <Counter worker="19">33970</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="21"> - <Counter worker="0">34845</Counter> - <Counter worker="1">34846</Counter> - <Counter worker="2">34849</Counter> - <Counter worker="3">34851</Counter> - <Counter worker="4">34850</Counter> - <Counter worker="5">34842</Counter> - <Counter worker="6">34845</Counter> - <Counter worker="7">34856</Counter> - <Counter worker="8">34842</Counter> - <Counter worker="9">34842</Counter> - <Counter worker="10">34844</Counter> - <Counter worker="11">34848</Counter> - <Counter worker="12">34856</Counter> - <Counter worker="13">34857</Counter> - <Counter worker="14">34843</Counter> - <Counter worker="15">34856</Counter> - <Counter worker="16">34849</Counter> - <Counter worker="17">34847</Counter> - <Counter worker="18">34847</Counter> - <Counter worker="19">34843</Counter> - <Counter worker="20">34844</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="22"> - <Counter worker="0">29938</Counter> - <Counter worker="1">29946</Counter> - <Counter worker="2">29949</Counter> - <Counter worker="3">29944</Counter> - <Counter worker="4">29940</Counter> - <Counter worker="5">29945</Counter> - <Counter worker="6">29938</Counter> - <Counter worker="7">29943</Counter> - <Counter worker="8">29942</Counter> - <Counter worker="9">29945</Counter> - <Counter worker="10">29940</Counter> - <Counter worker="11">29946</Counter> - <Counter worker="12">29939</Counter> - <Counter worker="13">29938</Counter> - <Counter worker="14">29948</Counter> - <Counter worker="15">29939</Counter> - <Counter worker="16">29941</Counter> - <Counter worker="17">29948</Counter> - <Counter worker="18">29943</Counter> - <Counter worker="19">29941</Counter> - <Counter worker="20">29951</Counter> - <Counter worker="21">29952</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="23"> - <Counter worker="0">29210</Counter> - <Counter worker="1">29214</Counter> - <Counter worker="2">29224</Counter> - <Counter worker="3">29225</Counter> - <Counter worker="4">29212</Counter> - <Counter worker="5">29218</Counter> - <Counter worker="6">29218</Counter> - <Counter worker="7">29210</Counter> - <Counter worker="8">29219</Counter> - <Counter worker="9">29220</Counter> - <Counter worker="10">29222</Counter> - <Counter worker="11">29217</Counter> - <Counter worker="12">29215</Counter> - <Counter worker="13">29212</Counter> - <Counter worker="14">29210</Counter> - <Counter worker="15">29214</Counter> - <Counter worker="16">29213</Counter> - <Counter worker="17">29216</Counter> - <Counter worker="18">29217</Counter> - <Counter worker="19">29221</Counter> - <Counter worker="20">29211</Counter> - <Counter worker="21">29213</Counter> - <Counter worker="22">29216</Counter> - </ManyClassicCeilingMutex> - <ManyClassicCeilingMutex activeWorker="24"> - <Counter worker="0">25904</Counter> - <Counter worker="1">25912</Counter> - <Counter worker="2">25906</Counter> - <Counter worker="3">25914</Counter> - <Counter worker="4">25909</Counter> - <Counter worker="5">25909</Counter> - <Counter worker="6">25911</Counter> - <Counter worker="7">25907</Counter> - <Counter worker="8">25906</Counter> - <Counter worker="9">25903</Counter> - <Counter worker="10">25905</Counter> - <Counter worker="11">25905</Counter> - <Counter worker="12">25913</Counter> - <Counter worker="13">25910</Counter> - <Counter worker="14">25913</Counter> - <Counter worker="15">25915</Counter> - <Counter worker="16">25911</Counter> - <Counter worker="17">25903</Counter> - <Counter worker="18">25908</Counter> - <Counter worker="19">25916</Counter> - <Counter worker="20">25918</Counter> - <Counter worker="21">25919</Counter> - <Counter worker="22">25904</Counter> - <Counter worker="23">25907</Counter> - </ManyClassicCeilingMutex> - <ManyClassicMrsPMutex activeWorker="1"> - <Counter worker="0">784201</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="2"> - <Counter worker="0">712340</Counter> - <Counter worker="1">712386</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="3"> - <Counter worker="0">674000</Counter> - <Counter worker="1">674051</Counter> - <Counter worker="2">674040</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="4"> - <Counter worker="0">508157</Counter> - <Counter worker="1">508153</Counter> - <Counter worker="2">508159</Counter> - <Counter worker="3">508110</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="5"> - <Counter worker="0">404003</Counter> - <Counter worker="1">403999</Counter> - <Counter worker="2">404000</Counter> - <Counter worker="3">403956</Counter> - <Counter worker="4">404001</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="6"> - <Counter worker="0">327904</Counter> - <Counter worker="1">327939</Counter> - <Counter worker="2">327942</Counter> - <Counter worker="3">327939</Counter> - <Counter worker="4">327939</Counter> - <Counter worker="5">327943</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="7"> - <Counter worker="0">272616</Counter> - <Counter worker="1">272614</Counter> - <Counter worker="2">272610</Counter> - <Counter worker="3">272613</Counter> - <Counter worker="4">272618</Counter> - <Counter worker="5">272620</Counter> - <Counter worker="6">272575</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="8"> - <Counter worker="0">234547</Counter> - <Counter worker="1">234543</Counter> - <Counter worker="2">234550</Counter> - <Counter worker="3">234547</Counter> - <Counter worker="4">234513</Counter> - <Counter worker="5">234546</Counter> - <Counter worker="6">234543</Counter> - <Counter worker="7">234543</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="9"> - <Counter worker="0">107383</Counter> - <Counter worker="1">107392</Counter> - <Counter worker="2">107386</Counter> - <Counter worker="3">107386</Counter> - <Counter worker="4">107389</Counter> - <Counter worker="5">107392</Counter> - <Counter worker="6">107385</Counter> - <Counter worker="7">107394</Counter> - <Counter worker="8">107377</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="10"> - <Counter worker="0">89997</Counter> - <Counter worker="1">89997</Counter> - <Counter worker="2">89997</Counter> - <Counter worker="3">90000</Counter> - <Counter worker="4">90001</Counter> - <Counter worker="5">89993</Counter> - <Counter worker="6">89995</Counter> - <Counter worker="7">89995</Counter> - <Counter worker="8">90001</Counter> - <Counter worker="9">90001</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="11"> - <Counter worker="0">76542</Counter> - <Counter worker="1">76545</Counter> - <Counter worker="2">76542</Counter> - <Counter worker="3">76541</Counter> - <Counter worker="4">76540</Counter> - <Counter worker="5">76549</Counter> - <Counter worker="6">76548</Counter> - <Counter worker="7">76545</Counter> - <Counter worker="8">76540</Counter> - <Counter worker="9">76540</Counter> - <Counter worker="10">76545</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="12"> - <Counter worker="0">65159</Counter> - <Counter worker="1">65161</Counter> - <Counter worker="2">65155</Counter> - <Counter worker="3">65158</Counter> - <Counter worker="4">65156</Counter> - <Counter worker="5">65154</Counter> - <Counter worker="6">65157</Counter> - <Counter worker="7">65156</Counter> - <Counter worker="8">65150</Counter> - <Counter worker="9">65153</Counter> - <Counter worker="10">65154</Counter> - <Counter worker="11">65152</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="13"> - <Counter worker="0">61089</Counter> - <Counter worker="1">61093</Counter> - <Counter worker="2">61092</Counter> - <Counter worker="3">61093</Counter> - <Counter worker="4">61094</Counter> - <Counter worker="5">61089</Counter> - <Counter worker="6">61090</Counter> - <Counter worker="7">61092</Counter> - <Counter worker="8">61098</Counter> - <Counter worker="9">61098</Counter> - <Counter worker="10">61091</Counter> - <Counter worker="11">61090</Counter> - <Counter worker="12">61095</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="14"> - <Counter worker="0">58163</Counter> - <Counter worker="1">58164</Counter> - <Counter worker="2">58160</Counter> - <Counter worker="3">58158</Counter> - <Counter worker="4">58156</Counter> - <Counter worker="5">58159</Counter> - <Counter worker="6">58157</Counter> - <Counter worker="7">58156</Counter> - <Counter worker="8">58153</Counter> - <Counter worker="9">58155</Counter> - <Counter worker="10">58154</Counter> - <Counter worker="11">58150</Counter> - <Counter worker="12">58153</Counter> - <Counter worker="13">58152</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="15"> - <Counter worker="0">49108</Counter> - <Counter worker="1">49110</Counter> - <Counter worker="2">49107</Counter> - <Counter worker="3">49106</Counter> - <Counter worker="4">49114</Counter> - <Counter worker="5">49112</Counter> - <Counter worker="6">49113</Counter> - <Counter worker="7">49107</Counter> - <Counter worker="8">49109</Counter> - <Counter worker="9">49110</Counter> - <Counter worker="10">49112</Counter> - <Counter worker="11">49117</Counter> - <Counter worker="12">49115</Counter> - <Counter worker="13">49111</Counter> - <Counter worker="14">49106</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="16"> - <Counter worker="0">45403</Counter> - <Counter worker="1">45406</Counter> - <Counter worker="2">45405</Counter> - <Counter worker="3">45404</Counter> - <Counter worker="4">45407</Counter> - <Counter worker="5">45402</Counter> - <Counter worker="6">45401</Counter> - <Counter worker="7">45403</Counter> - <Counter worker="8">45407</Counter> - <Counter worker="9">45410</Counter> - <Counter worker="10">45411</Counter> - <Counter worker="11">45404</Counter> - <Counter worker="12">45413</Counter> - <Counter worker="13">45410</Counter> - <Counter worker="14">45401</Counter> - <Counter worker="15">45401</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="17"> - <Counter worker="0">40546</Counter> - <Counter worker="1">40547</Counter> - <Counter worker="2">40552</Counter> - <Counter worker="3">40546</Counter> - <Counter worker="4">40554</Counter> - <Counter worker="5">40553</Counter> - <Counter worker="6">40550</Counter> - <Counter worker="7">40552</Counter> - <Counter worker="8">40559</Counter> - <Counter worker="9">40559</Counter> - <Counter worker="10">40555</Counter> - <Counter worker="11">40556</Counter> - <Counter worker="12">40550</Counter> - <Counter worker="13">40548</Counter> - <Counter worker="14">40548</Counter> - <Counter worker="15">40549</Counter> - <Counter worker="16">40551</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="18"> - <Counter worker="0">39609</Counter> - <Counter worker="1">39614</Counter> - <Counter worker="2">39610</Counter> - <Counter worker="3">39616</Counter> - <Counter worker="4">39618</Counter> - <Counter worker="5">39615</Counter> - <Counter worker="6">39613</Counter> - <Counter worker="7">39613</Counter> - <Counter worker="8">39615</Counter> - <Counter worker="9">39617</Counter> - <Counter worker="10">39610</Counter> - <Counter worker="11">39618</Counter> - <Counter worker="12">39615</Counter> - <Counter worker="13">39611</Counter> - <Counter worker="14">39612</Counter> - <Counter worker="15">39611</Counter> - <Counter worker="16">39621</Counter> - <Counter worker="17">39620</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="19"> - <Counter worker="0">35744</Counter> - <Counter worker="1">35742</Counter> - <Counter worker="2">35744</Counter> - <Counter worker="3">35747</Counter> - <Counter worker="4">35752</Counter> - <Counter worker="5">35755</Counter> - <Counter worker="6">35745</Counter> - <Counter worker="7">35753</Counter> - <Counter worker="8">35745</Counter> - <Counter worker="9">35747</Counter> - <Counter worker="10">35742</Counter> - <Counter worker="11">35751</Counter> - <Counter worker="12">35749</Counter> - <Counter worker="13">35746</Counter> - <Counter worker="14">35743</Counter> - <Counter worker="15">35746</Counter> - <Counter worker="16">35749</Counter> - <Counter worker="17">35743</Counter> - <Counter worker="18">35748</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="20"> - <Counter worker="0">33654</Counter> - <Counter worker="1">33664</Counter> - <Counter worker="2">33659</Counter> - <Counter worker="3">33661</Counter> - <Counter worker="4">33654</Counter> - <Counter worker="5">33658</Counter> - <Counter worker="6">33663</Counter> - <Counter worker="7">33654</Counter> - <Counter worker="8">33668</Counter> - <Counter worker="9">33660</Counter> - <Counter worker="10">33660</Counter> - <Counter worker="11">33655</Counter> - <Counter worker="12">33667</Counter> - <Counter worker="13">33657</Counter> - <Counter worker="14">33655</Counter> - <Counter worker="15">33664</Counter> - <Counter worker="16">33657</Counter> - <Counter worker="17">33656</Counter> - <Counter worker="18">33662</Counter> - <Counter worker="19">33659</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="21"> - <Counter worker="0">32410</Counter> - <Counter worker="1">32414</Counter> - <Counter worker="2">32407</Counter> - <Counter worker="3">32409</Counter> - <Counter worker="4">32420</Counter> - <Counter worker="5">32413</Counter> - <Counter worker="6">32422</Counter> - <Counter worker="7">32421</Counter> - <Counter worker="8">32408</Counter> - <Counter worker="9">32414</Counter> - <Counter worker="10">32407</Counter> - <Counter worker="11">32411</Counter> - <Counter worker="12">32413</Counter> - <Counter worker="13">32416</Counter> - <Counter worker="14">32408</Counter> - <Counter worker="15">32418</Counter> - <Counter worker="16">32412</Counter> - <Counter worker="17">32416</Counter> - <Counter worker="18">32411</Counter> - <Counter worker="19">32410</Counter> - <Counter worker="20">32417</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="22"> - <Counter worker="0">29188</Counter> - <Counter worker="1">29192</Counter> - <Counter worker="2">29201</Counter> - <Counter worker="3">29198</Counter> - <Counter worker="4">29187</Counter> - <Counter worker="5">29195</Counter> - <Counter worker="6">29192</Counter> - <Counter worker="7">29195</Counter> - <Counter worker="8">29200</Counter> - <Counter worker="9">29193</Counter> - <Counter worker="10">29197</Counter> - <Counter worker="11">29189</Counter> - <Counter worker="12">29189</Counter> - <Counter worker="13">29190</Counter> - <Counter worker="14">29188</Counter> - <Counter worker="15">29196</Counter> - <Counter worker="16">29194</Counter> - <Counter worker="17">29191</Counter> - <Counter worker="18">29199</Counter> - <Counter worker="19">29194</Counter> - <Counter worker="20">29191</Counter> - <Counter worker="21">29190</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="23"> - <Counter worker="0">27206</Counter> - <Counter worker="1">27216</Counter> - <Counter worker="2">27222</Counter> - <Counter worker="3">27211</Counter> - <Counter worker="4">27211</Counter> - <Counter worker="5">27210</Counter> - <Counter worker="6">27212</Counter> - <Counter worker="7">27208</Counter> - <Counter worker="8">27214</Counter> - <Counter worker="9">27207</Counter> - <Counter worker="10">27208</Counter> - <Counter worker="11">27214</Counter> - <Counter worker="12">27210</Counter> - <Counter worker="13">27209</Counter> - <Counter worker="14">27218</Counter> - <Counter worker="15">27217</Counter> - <Counter worker="16">27219</Counter> - <Counter worker="17">27206</Counter> - <Counter worker="18">27215</Counter> - <Counter worker="19">27213</Counter> - <Counter worker="20">27207</Counter> - <Counter worker="21">27212</Counter> - <Counter worker="22">27232</Counter> - </ManyClassicMrsPMutex> - <ManyClassicMrsPMutex activeWorker="24"> - <Counter worker="0">24666</Counter> - <Counter worker="1">24670</Counter> - <Counter worker="2">24664</Counter> - <Counter worker="3">24672</Counter> - <Counter worker="4">24671</Counter> - <Counter worker="5">24668</Counter> - <Counter worker="6">24668</Counter> - <Counter worker="7">24667</Counter> - <Counter worker="8">24671</Counter> - <Counter worker="9">24664</Counter> - <Counter worker="10">24667</Counter> - <Counter worker="11">24666</Counter> - <Counter worker="12">24675</Counter> - <Counter worker="13">24670</Counter> - <Counter worker="14">24664</Counter> - <Counter worker="15">24673</Counter> - <Counter worker="16">24673</Counter> - <Counter worker="17">24669</Counter> - <Counter worker="18">24665</Counter> - <Counter worker="19">24675</Counter> - <Counter worker="20">24681</Counter> - <Counter worker="21">24674</Counter> - <Counter worker="22">24677</Counter> - <Counter worker="23">24681</Counter> - </ManyClassicMrsPMutex> - <ManyPthreadSpinlock activeWorker="1"> - <Counter worker="0">14718834</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="2"> - <Counter worker="0">14545804</Counter> - <Counter worker="1">14546744</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="3"> - <Counter worker="0">14202896</Counter> - <Counter worker="1">14203740</Counter> - <Counter worker="2">14204031</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="4"> - <Counter worker="0">13936060</Counter> - <Counter worker="1">13936903</Counter> - <Counter worker="2">13937157</Counter> - <Counter worker="3">13937175</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="5"> - <Counter worker="0">13882002</Counter> - <Counter worker="1">13882875</Counter> - <Counter worker="2">13883036</Counter> - <Counter worker="3">13883032</Counter> - <Counter worker="4">13883129</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="6"> - <Counter worker="0">13678756</Counter> - <Counter worker="1">13679620</Counter> - <Counter worker="2">13679743</Counter> - <Counter worker="3">13679940</Counter> - <Counter worker="4">13679849</Counter> - <Counter worker="5">13679778</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="7"> - <Counter worker="0">13536294</Counter> - <Counter worker="1">13537073</Counter> - <Counter worker="2">13537313</Counter> - <Counter worker="3">13537271</Counter> - <Counter worker="4">13537347</Counter> - <Counter worker="5">13537331</Counter> - <Counter worker="6">13537366</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="8"> - <Counter worker="0">13416795</Counter> - <Counter worker="1">13417680</Counter> - <Counter worker="2">13417750</Counter> - <Counter worker="3">13417879</Counter> - <Counter worker="4">13417890</Counter> - <Counter worker="5">13417884</Counter> - <Counter worker="6">13417887</Counter> - <Counter worker="7">13417860</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="9"> - <Counter worker="0">13344563</Counter> - <Counter worker="1">13345425</Counter> - <Counter worker="2">13345471</Counter> - <Counter worker="3">13345553</Counter> - <Counter worker="4">13345686</Counter> - <Counter worker="5">13345685</Counter> - <Counter worker="6">13345620</Counter> - <Counter worker="7">13345553</Counter> - <Counter worker="8">14664124</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="10"> - <Counter worker="0">13345484</Counter> - <Counter worker="1">13346290</Counter> - <Counter worker="2">13346571</Counter> - <Counter worker="3">13346539</Counter> - <Counter worker="4">13346562</Counter> - <Counter worker="5">13346553</Counter> - <Counter worker="6">13346462</Counter> - <Counter worker="7">13346482</Counter> - <Counter worker="8">14489005</Counter> - <Counter worker="9">14489074</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="11"> - <Counter worker="0">13387106</Counter> - <Counter worker="1">13387968</Counter> - <Counter worker="2">13388136</Counter> - <Counter worker="3">13388157</Counter> - <Counter worker="4">13388188</Counter> - <Counter worker="5">13388196</Counter> - <Counter worker="6">13388173</Counter> - <Counter worker="7">13388181</Counter> - <Counter worker="8">14106966</Counter> - <Counter worker="9">14106972</Counter> - <Counter worker="10">14106794</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="12"> - <Counter worker="0">13339713</Counter> - <Counter worker="1">13340579</Counter> - <Counter worker="2">13340745</Counter> - <Counter worker="3">13340783</Counter> - <Counter worker="4">13340828</Counter> - <Counter worker="5">13340858</Counter> - <Counter worker="6">13340715</Counter> - <Counter worker="7">13340770</Counter> - <Counter worker="8">13878859</Counter> - <Counter worker="9">13878923</Counter> - <Counter worker="10">13878707</Counter> - <Counter worker="11">13878654</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="13"> - <Counter worker="0">13423332</Counter> - <Counter worker="1">13424154</Counter> - <Counter worker="2">13424352</Counter> - <Counter worker="3">13424415</Counter> - <Counter worker="4">13424314</Counter> - <Counter worker="5">13424308</Counter> - <Counter worker="6">13424314</Counter> - <Counter worker="7">13424303</Counter> - <Counter worker="8">13894368</Counter> - <Counter worker="9">13894493</Counter> - <Counter worker="10">13894289</Counter> - <Counter worker="11">13894305</Counter> - <Counter worker="12">13894313</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="14"> - <Counter worker="0">13374209</Counter> - <Counter worker="1">13375090</Counter> - <Counter worker="2">13375258</Counter> - <Counter worker="3">13375185</Counter> - <Counter worker="4">13375228</Counter> - <Counter worker="5">13375289</Counter> - <Counter worker="6">13375221</Counter> - <Counter worker="7">13375272</Counter> - <Counter worker="8">13638146</Counter> - <Counter worker="9">13638099</Counter> - <Counter worker="10">13638011</Counter> - <Counter worker="11">13637921</Counter> - <Counter worker="12">13638082</Counter> - <Counter worker="13">13638078</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="15"> - <Counter worker="0">13324122</Counter> - <Counter worker="1">13324923</Counter> - <Counter worker="2">13322227</Counter> - <Counter worker="3">13322310</Counter> - <Counter worker="4">13325255</Counter> - <Counter worker="5">13325158</Counter> - <Counter worker="6">13325121</Counter> - <Counter worker="7">13325137</Counter> - <Counter worker="8">13526376</Counter> - <Counter worker="9">13526358</Counter> - <Counter worker="10">13526223</Counter> - <Counter worker="11">13526248</Counter> - <Counter worker="12">13526360</Counter> - <Counter worker="13">13526365</Counter> - <Counter worker="14">13526370</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="16"> - <Counter worker="0">13409904</Counter> - <Counter worker="1">13410740</Counter> - <Counter worker="2">13410903</Counter> - <Counter worker="3">13410988</Counter> - <Counter worker="4">13411030</Counter> - <Counter worker="5">13410987</Counter> - <Counter worker="6">13410838</Counter> - <Counter worker="7">13410949</Counter> - <Counter worker="8">13425120</Counter> - <Counter worker="9">13425212</Counter> - <Counter worker="10">13425033</Counter> - <Counter worker="11">13425047</Counter> - <Counter worker="12">13425054</Counter> - <Counter worker="13">13425101</Counter> - <Counter worker="14">13425139</Counter> - <Counter worker="15">13425072</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="17"> - <Counter worker="0">13358197</Counter> - <Counter worker="1">13359084</Counter> - <Counter worker="2">13359207</Counter> - <Counter worker="3">13359276</Counter> - <Counter worker="4">13359271</Counter> - <Counter worker="5">13359332</Counter> - <Counter worker="6">13359272</Counter> - <Counter worker="7">13359197</Counter> - <Counter worker="8">13377371</Counter> - <Counter worker="9">13377387</Counter> - <Counter worker="10">13377385</Counter> - <Counter worker="11">13377388</Counter> - <Counter worker="12">13377413</Counter> - <Counter worker="13">13377416</Counter> - <Counter worker="14">13377379</Counter> - <Counter worker="15">13377457</Counter> - <Counter worker="16">14648127</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="18"> - <Counter worker="0">13450072</Counter> - <Counter worker="1">13450903</Counter> - <Counter worker="2">13451130</Counter> - <Counter worker="3">13451147</Counter> - <Counter worker="4">13451124</Counter> - <Counter worker="5">13451254</Counter> - <Counter worker="6">13451111</Counter> - <Counter worker="7">13451124</Counter> - <Counter worker="8">13476959</Counter> - <Counter worker="9">13476898</Counter> - <Counter worker="10">13476818</Counter> - <Counter worker="11">13476757</Counter> - <Counter worker="12">13476779</Counter> - <Counter worker="13">13476826</Counter> - <Counter worker="14">13476887</Counter> - <Counter worker="15">13476812</Counter> - <Counter worker="16">14753607</Counter> - <Counter worker="17">14753628</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="19"> - <Counter worker="0">13391588</Counter> - <Counter worker="1">13392430</Counter> - <Counter worker="2">13392562</Counter> - <Counter worker="3">13392593</Counter> - <Counter worker="4">13392668</Counter> - <Counter worker="5">13392691</Counter> - <Counter worker="6">13392561</Counter> - <Counter worker="7">13392599</Counter> - <Counter worker="8">13399126</Counter> - <Counter worker="9">13399129</Counter> - <Counter worker="10">13399029</Counter> - <Counter worker="11">13398973</Counter> - <Counter worker="12">13399022</Counter> - <Counter worker="13">13399026</Counter> - <Counter worker="14">13398920</Counter> - <Counter worker="15">13398974</Counter> - <Counter worker="16">14175315</Counter> - <Counter worker="17">14175222</Counter> - <Counter worker="18">14175311</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="20"> - <Counter worker="0">13355745</Counter> - <Counter worker="1">13356643</Counter> - <Counter worker="2">13356778</Counter> - <Counter worker="3">13356845</Counter> - <Counter worker="4">13356826</Counter> - <Counter worker="5">13356881</Counter> - <Counter worker="6">13356673</Counter> - <Counter worker="7">13356756</Counter> - <Counter worker="8">13361313</Counter> - <Counter worker="9">13361244</Counter> - <Counter worker="10">13357068</Counter> - <Counter worker="11">13356983</Counter> - <Counter worker="12">13356966</Counter> - <Counter worker="13">13356990</Counter> - <Counter worker="14">13361213</Counter> - <Counter worker="15">13361185</Counter> - <Counter worker="16">13989600</Counter> - <Counter worker="17">13989623</Counter> - <Counter worker="18">13989693</Counter> - <Counter worker="19">13989659</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="21"> - <Counter worker="0">13407936</Counter> - <Counter worker="1">13408763</Counter> - <Counter worker="2">13408903</Counter> - <Counter worker="3">13408988</Counter> - <Counter worker="4">13409085</Counter> - <Counter worker="5">13409045</Counter> - <Counter worker="6">13408998</Counter> - <Counter worker="7">13408901</Counter> - <Counter worker="8">13434650</Counter> - <Counter worker="9">13434644</Counter> - <Counter worker="10">13434596</Counter> - <Counter worker="11">13434581</Counter> - <Counter worker="12">13434577</Counter> - <Counter worker="13">13434621</Counter> - <Counter worker="14">13434678</Counter> - <Counter worker="15">13434611</Counter> - <Counter worker="16">13925505</Counter> - <Counter worker="17">13925519</Counter> - <Counter worker="18">13925574</Counter> - <Counter worker="19">13925534</Counter> - <Counter worker="20">13925556</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="22"> - <Counter worker="0">13357133</Counter> - <Counter worker="1">13357991</Counter> - <Counter worker="2">13358199</Counter> - <Counter worker="3">13358166</Counter> - <Counter worker="4">13358386</Counter> - <Counter worker="5">13358347</Counter> - <Counter worker="6">13358183</Counter> - <Counter worker="7">13358191</Counter> - <Counter worker="8">13409498</Counter> - <Counter worker="9">13409534</Counter> - <Counter worker="10">13409355</Counter> - <Counter worker="11">13409356</Counter> - <Counter worker="12">13409477</Counter> - <Counter worker="13">13409398</Counter> - <Counter worker="14">13409398</Counter> - <Counter worker="15">13409452</Counter> - <Counter worker="16">13725035</Counter> - <Counter worker="17">13725102</Counter> - <Counter worker="18">13725140</Counter> - <Counter worker="19">13724990</Counter> - <Counter worker="20">13725108</Counter> - <Counter worker="21">13725040</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="23"> - <Counter worker="0">13448281</Counter> - <Counter worker="1">13449150</Counter> - <Counter worker="2">13449235</Counter> - <Counter worker="3">13449263</Counter> - <Counter worker="4">13449358</Counter> - <Counter worker="5">13449247</Counter> - <Counter worker="6">13449327</Counter> - <Counter worker="7">13449312</Counter> - <Counter worker="8">13468811</Counter> - <Counter worker="9">13468839</Counter> - <Counter worker="10">13468751</Counter> - <Counter worker="11">13468726</Counter> - <Counter worker="12">13468738</Counter> - <Counter worker="13">13468711</Counter> - <Counter worker="14">13468861</Counter> - <Counter worker="15">13468835</Counter> - <Counter worker="16">13675503</Counter> - <Counter worker="17">13675619</Counter> - <Counter worker="18">13675523</Counter> - <Counter worker="19">13675472</Counter> - <Counter worker="20">13675556</Counter> - <Counter worker="21">13675544</Counter> - <Counter worker="22">13675532</Counter> - </ManyPthreadSpinlock> - <ManyPthreadSpinlock activeWorker="24"> - <Counter worker="0">13380340</Counter> - <Counter worker="1">13381193</Counter> - <Counter worker="2">13378127</Counter> - <Counter worker="3">13378172</Counter> - <Counter worker="4">13384719</Counter> - <Counter worker="5">13384699</Counter> - <Counter worker="6">13384584</Counter> - <Counter worker="7">13384610</Counter> - <Counter worker="8">13403447</Counter> - <Counter worker="9">13403370</Counter> - <Counter worker="10">13403295</Counter> - <Counter worker="11">13403431</Counter> - <Counter worker="12">13403242</Counter> - <Counter worker="13">13403348</Counter> - <Counter worker="14">13403394</Counter> - <Counter worker="15">13403378</Counter> - <Counter worker="16">13451683</Counter> - <Counter worker="17">13451643</Counter> - <Counter worker="18">13445578</Counter> - <Counter worker="19">13445455</Counter> - <Counter worker="20">13451633</Counter> - <Counter worker="21">13451656</Counter> - <Counter worker="22">13451565</Counter> - <Counter worker="23">13451541</Counter> - </ManyPthreadSpinlock> - <ManyPthreadMutexInherit activeWorker="1"> - <Counter worker="0">5685517</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="2"> - <Counter worker="0">5696601</Counter> - <Counter worker="1">5696949</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="3"> - <Counter worker="0">5543995</Counter> - <Counter worker="1">5544357</Counter> - <Counter worker="2">5544426</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="4"> - <Counter worker="0">5454438</Counter> - <Counter worker="1">5454782</Counter> - <Counter worker="2">5454882</Counter> - <Counter worker="3">5454926</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="5"> - <Counter worker="0">5471381</Counter> - <Counter worker="1">5471738</Counter> - <Counter worker="2">5471815</Counter> - <Counter worker="3">5471828</Counter> - <Counter worker="4">5471846</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="6"> - <Counter worker="0">5409420</Counter> - <Counter worker="1">5409778</Counter> - <Counter worker="2">5409870</Counter> - <Counter worker="3">5409863</Counter> - <Counter worker="4">5409834</Counter> - <Counter worker="5">5409840</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="7"> - <Counter worker="0">5382186</Counter> - <Counter worker="1">5382516</Counter> - <Counter worker="2">5382597</Counter> - <Counter worker="3">5382630</Counter> - <Counter worker="4">5382622</Counter> - <Counter worker="5">5382605</Counter> - <Counter worker="6">5385095</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="8"> - <Counter worker="0">5352212</Counter> - <Counter worker="1">5352555</Counter> - <Counter worker="2">5352630</Counter> - <Counter worker="3">5352640</Counter> - <Counter worker="4">5352660</Counter> - <Counter worker="5">5352675</Counter> - <Counter worker="6">5352627</Counter> - <Counter worker="7">5352647</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="9"> - <Counter worker="0">5330964</Counter> - <Counter worker="1">5331314</Counter> - <Counter worker="2">5331408</Counter> - <Counter worker="3">5331433</Counter> - <Counter worker="4">5331429</Counter> - <Counter worker="5">5331422</Counter> - <Counter worker="6">5331360</Counter> - <Counter worker="7">5331402</Counter> - <Counter worker="8">5696119</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="10"> - <Counter worker="0">5312790</Counter> - <Counter worker="1">5313108</Counter> - <Counter worker="2">5313193</Counter> - <Counter worker="3">5313221</Counter> - <Counter worker="4">5313253</Counter> - <Counter worker="5">5313255</Counter> - <Counter worker="6">5313216</Counter> - <Counter worker="7">5313229</Counter> - <Counter worker="8">5623042</Counter> - <Counter worker="9">5623031</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="11"> - <Counter worker="0">5347426</Counter> - <Counter worker="1">5347771</Counter> - <Counter worker="2">5347831</Counter> - <Counter worker="3">5347866</Counter> - <Counter worker="4">5347844</Counter> - <Counter worker="5">5347886</Counter> - <Counter worker="6">5347836</Counter> - <Counter worker="7">5347878</Counter> - <Counter worker="8">5544845</Counter> - <Counter worker="9">5544823</Counter> - <Counter worker="10">5544727</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="12"> - <Counter worker="0">5324241</Counter> - <Counter worker="1">5324589</Counter> - <Counter worker="2">5324636</Counter> - <Counter worker="3">5324686</Counter> - <Counter worker="4">5324681</Counter> - <Counter worker="5">5324678</Counter> - <Counter worker="6">5324639</Counter> - <Counter worker="7">5324665</Counter> - <Counter worker="8">5499255</Counter> - <Counter worker="9">5499245</Counter> - <Counter worker="10">5499200</Counter> - <Counter worker="11">5499220</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="13"> - <Counter worker="0">5361809</Counter> - <Counter worker="1">5362145</Counter> - <Counter worker="2">5362206</Counter> - <Counter worker="3">5362252</Counter> - <Counter worker="4">5362262</Counter> - <Counter worker="5">5362262</Counter> - <Counter worker="6">5362256</Counter> - <Counter worker="7">5362238</Counter> - <Counter worker="8">5485847</Counter> - <Counter worker="9">5485850</Counter> - <Counter worker="10">5485787</Counter> - <Counter worker="11">5485770</Counter> - <Counter worker="12">5485785</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="14"> - <Counter worker="0">5343125</Counter> - <Counter worker="1">5343437</Counter> - <Counter worker="2">5343528</Counter> - <Counter worker="3">5343550</Counter> - <Counter worker="4">5343575</Counter> - <Counter worker="5">5343550</Counter> - <Counter worker="6">5343537</Counter> - <Counter worker="7">5343558</Counter> - <Counter worker="8">5427404</Counter> - <Counter worker="9">5427398</Counter> - <Counter worker="10">5427402</Counter> - <Counter worker="11">5427400</Counter> - <Counter worker="12">5427379</Counter> - <Counter worker="13">5427366</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="15"> - <Counter worker="0">5316180</Counter> - <Counter worker="1">5316531</Counter> - <Counter worker="2">5316583</Counter> - <Counter worker="3">5316629</Counter> - <Counter worker="4">5316636</Counter> - <Counter worker="5">5316625</Counter> - <Counter worker="6">5316608</Counter> - <Counter worker="7">5316618</Counter> - <Counter worker="8">5383017</Counter> - <Counter worker="9">5383040</Counter> - <Counter worker="10">5382956</Counter> - <Counter worker="11">5382983</Counter> - <Counter worker="12">5382964</Counter> - <Counter worker="13">5382933</Counter> - <Counter worker="14">5382973</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="16"> - <Counter worker="0">5348312</Counter> - <Counter worker="1">5348636</Counter> - <Counter worker="2">5348734</Counter> - <Counter worker="3">5348745</Counter> - <Counter worker="4">5348767</Counter> - <Counter worker="5">5348747</Counter> - <Counter worker="6">5348742</Counter> - <Counter worker="7">5348758</Counter> - <Counter worker="8">5377756</Counter> - <Counter worker="9">5377760</Counter> - <Counter worker="10">5377743</Counter> - <Counter worker="11">5377735</Counter> - <Counter worker="12">5377720</Counter> - <Counter worker="13">5377705</Counter> - <Counter worker="14">5377766</Counter> - <Counter worker="15">5377744</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="17"> - <Counter worker="0">5328451</Counter> - <Counter worker="1">5328804</Counter> - <Counter worker="2">5328899</Counter> - <Counter worker="3">5328944</Counter> - <Counter worker="4">5328928</Counter> - <Counter worker="5">5328922</Counter> - <Counter worker="6">5328895</Counter> - <Counter worker="7">5328892</Counter> - <Counter worker="8">5352090</Counter> - <Counter worker="9">5352051</Counter> - <Counter worker="10">5352079</Counter> - <Counter worker="11">5352076</Counter> - <Counter worker="12">5352072</Counter> - <Counter worker="13">5352070</Counter> - <Counter worker="14">5352084</Counter> - <Counter worker="15">5352060</Counter> - <Counter worker="16">5780692</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="18"> - <Counter worker="0">5362263</Counter> - <Counter worker="1">5362611</Counter> - <Counter worker="2">5362670</Counter> - <Counter worker="3">5362711</Counter> - <Counter worker="4">5362685</Counter> - <Counter worker="5">5362679</Counter> - <Counter worker="6">5362698</Counter> - <Counter worker="7">5362722</Counter> - <Counter worker="8">5384935</Counter> - <Counter worker="9">5384948</Counter> - <Counter worker="10">5384849</Counter> - <Counter worker="11">5384902</Counter> - <Counter worker="12">5384887</Counter> - <Counter worker="13">5384869</Counter> - <Counter worker="14">5384912</Counter> - <Counter worker="15">5384902</Counter> - <Counter worker="16">5717423</Counter> - <Counter worker="17">5717419</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="19"> - <Counter worker="0">5339960</Counter> - <Counter worker="1">5340280</Counter> - <Counter worker="2">5340379</Counter> - <Counter worker="3">5340412</Counter> - <Counter worker="4">5340413</Counter> - <Counter worker="5">5340406</Counter> - <Counter worker="6">5340390</Counter> - <Counter worker="7">5340429</Counter> - <Counter worker="8">5366702</Counter> - <Counter worker="9">5366709</Counter> - <Counter worker="10">5366618</Counter> - <Counter worker="11">5366618</Counter> - <Counter worker="12">5366640</Counter> - <Counter worker="13">5366633</Counter> - <Counter worker="14">5366660</Counter> - <Counter worker="15">5366640</Counter> - <Counter worker="16">5562960</Counter> - <Counter worker="17">5562974</Counter> - <Counter worker="18">5562969</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="20"> - <Counter worker="0">5328365</Counter> - <Counter worker="1">5328690</Counter> - <Counter worker="2">5328769</Counter> - <Counter worker="3">5328750</Counter> - <Counter worker="4">5328811</Counter> - <Counter worker="5">5328819</Counter> - <Counter worker="6">5328761</Counter> - <Counter worker="7">5328804</Counter> - <Counter worker="8">5352530</Counter> - <Counter worker="9">5352507</Counter> - <Counter worker="10">5352517</Counter> - <Counter worker="11">5352526</Counter> - <Counter worker="12">5352478</Counter> - <Counter worker="13">5352481</Counter> - <Counter worker="14">5352540</Counter> - <Counter worker="15">5352508</Counter> - <Counter worker="16">5542382</Counter> - <Counter worker="17">5542457</Counter> - <Counter worker="18">5542429</Counter> - <Counter worker="19">5542397</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="21"> - <Counter worker="0">5355821</Counter> - <Counter worker="1">5356186</Counter> - <Counter worker="2">5356298</Counter> - <Counter worker="3">5356259</Counter> - <Counter worker="4">5356261</Counter> - <Counter worker="5">5356320</Counter> - <Counter worker="6">5356247</Counter> - <Counter worker="7">5356272</Counter> - <Counter worker="8">5376396</Counter> - <Counter worker="9">5376387</Counter> - <Counter worker="10">5376323</Counter> - <Counter worker="11">5376368</Counter> - <Counter worker="12">5376339</Counter> - <Counter worker="13">5376330</Counter> - <Counter worker="14">5376387</Counter> - <Counter worker="15">5376365</Counter> - <Counter worker="16">5547253</Counter> - <Counter worker="17">5547266</Counter> - <Counter worker="18">5547315</Counter> - <Counter worker="19">5547267</Counter> - <Counter worker="20">5547295</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="22"> - <Counter worker="0">5340616</Counter> - <Counter worker="1">5340986</Counter> - <Counter worker="2">5341028</Counter> - <Counter worker="3">5341065</Counter> - <Counter worker="4">5341078</Counter> - <Counter worker="5">5341079</Counter> - <Counter worker="6">5341007</Counter> - <Counter worker="7">5341038</Counter> - <Counter worker="8">5359566</Counter> - <Counter worker="9">5359570</Counter> - <Counter worker="10">5359478</Counter> - <Counter worker="11">5359502</Counter> - <Counter worker="12">5359496</Counter> - <Counter worker="13">5359527</Counter> - <Counter worker="14">5359536</Counter> - <Counter worker="15">5359526</Counter> - <Counter worker="16">5498507</Counter> - <Counter worker="17">5498494</Counter> - <Counter worker="18">5498532</Counter> - <Counter worker="19">5498493</Counter> - <Counter worker="20">5498503</Counter> - <Counter worker="21">5498516</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="23"> - <Counter worker="0">5305895</Counter> - <Counter worker="1">5306236</Counter> - <Counter worker="2">5306305</Counter> - <Counter worker="3">5306345</Counter> - <Counter worker="4">5306344</Counter> - <Counter worker="5">5306361</Counter> - <Counter worker="6">5306301</Counter> - <Counter worker="7">5306340</Counter> - <Counter worker="8">5339859</Counter> - <Counter worker="9">5339855</Counter> - <Counter worker="10">5339822</Counter> - <Counter worker="11">5339853</Counter> - <Counter worker="12">5339853</Counter> - <Counter worker="13">5339851</Counter> - <Counter worker="14">5339883</Counter> - <Counter worker="15">5339826</Counter> - <Counter worker="16">5444298</Counter> - <Counter worker="17">5444322</Counter> - <Counter worker="18">5444263</Counter> - <Counter worker="19">5444218</Counter> - <Counter worker="20">5444333</Counter> - <Counter worker="21">5444339</Counter> - <Counter worker="22">5444294</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexInherit activeWorker="24"> - <Counter worker="0">5344687</Counter> - <Counter worker="1">5345037</Counter> - <Counter worker="2">5345099</Counter> - <Counter worker="3">5345114</Counter> - <Counter worker="4">5345124</Counter> - <Counter worker="5">5345129</Counter> - <Counter worker="6">5345111</Counter> - <Counter worker="7">5345126</Counter> - <Counter worker="8">5366163</Counter> - <Counter worker="9">5366157</Counter> - <Counter worker="10">5366132</Counter> - <Counter worker="11">5366143</Counter> - <Counter worker="12">5366131</Counter> - <Counter worker="13">5366096</Counter> - <Counter worker="14">5366169</Counter> - <Counter worker="15">5366118</Counter> - <Counter worker="16">5420792</Counter> - <Counter worker="17">5420837</Counter> - <Counter worker="18">5420864</Counter> - <Counter worker="19">5420785</Counter> - <Counter worker="20">5420835</Counter> - <Counter worker="21">5420827</Counter> - <Counter worker="22">5420737</Counter> - <Counter worker="23">5420793</Counter> - </ManyPthreadMutexInherit> - <ManyPthreadMutexProtect activeWorker="1"> - <Counter worker="0">804850</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="2"> - <Counter worker="0">736889</Counter> - <Counter worker="1">736932</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="3"> - <Counter worker="0">677059</Counter> - <Counter worker="1">677102</Counter> - <Counter worker="2">677109</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="4"> - <Counter worker="0">511022</Counter> - <Counter worker="1">511064</Counter> - <Counter worker="2">511070</Counter> - <Counter worker="3">511071</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="5"> - <Counter worker="0">403704</Counter> - <Counter worker="1">403746</Counter> - <Counter worker="2">403747</Counter> - <Counter worker="3">403747</Counter> - <Counter worker="4">403752</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="6"> - <Counter worker="0">329360</Counter> - <Counter worker="1">329396</Counter> - <Counter worker="2">329402</Counter> - <Counter worker="3">329404</Counter> - <Counter worker="4">329401</Counter> - <Counter worker="5">329405</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="7"> - <Counter worker="0">271830</Counter> - <Counter worker="1">271865</Counter> - <Counter worker="2">271870</Counter> - <Counter worker="3">271871</Counter> - <Counter worker="4">271871</Counter> - <Counter worker="5">271874</Counter> - <Counter worker="6">271880</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="8"> - <Counter worker="0">234106</Counter> - <Counter worker="1">234135</Counter> - <Counter worker="2">234147</Counter> - <Counter worker="3">234143</Counter> - <Counter worker="4">234145</Counter> - <Counter worker="5">234144</Counter> - <Counter worker="6">234144</Counter> - <Counter worker="7">234145</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="9"> - <Counter worker="0">108890</Counter> - <Counter worker="1">108899</Counter> - <Counter worker="2">108898</Counter> - <Counter worker="3">108897</Counter> - <Counter worker="4">108898</Counter> - <Counter worker="5">108898</Counter> - <Counter worker="6">108898</Counter> - <Counter worker="7">108896</Counter> - <Counter worker="8">108892</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="10"> - <Counter worker="0">93131</Counter> - <Counter worker="1">93136</Counter> - <Counter worker="2">93135</Counter> - <Counter worker="3">93136</Counter> - <Counter worker="4">93136</Counter> - <Counter worker="5">93136</Counter> - <Counter worker="6">93136</Counter> - <Counter worker="7">93136</Counter> - <Counter worker="8">93134</Counter> - <Counter worker="9">93135</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="11"> - <Counter worker="0">79836</Counter> - <Counter worker="1">79839</Counter> - <Counter worker="2">79840</Counter> - <Counter worker="3">79840</Counter> - <Counter worker="4">79841</Counter> - <Counter worker="5">79840</Counter> - <Counter worker="6">79840</Counter> - <Counter worker="7">79840</Counter> - <Counter worker="8">79839</Counter> - <Counter worker="9">79839</Counter> - <Counter worker="10">79839</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="12"> - <Counter worker="0">70922</Counter> - <Counter worker="1">70924</Counter> - <Counter worker="2">70924</Counter> - <Counter worker="3">70924</Counter> - <Counter worker="4">70924</Counter> - <Counter worker="5">70924</Counter> - <Counter worker="6">70923</Counter> - <Counter worker="7">70924</Counter> - <Counter worker="8">70924</Counter> - <Counter worker="9">70924</Counter> - <Counter worker="10">70924</Counter> - <Counter worker="11">70924</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="13"> - <Counter worker="0">59848</Counter> - <Counter worker="1">59850</Counter> - <Counter worker="2">59850</Counter> - <Counter worker="3">59850</Counter> - <Counter worker="4">59850</Counter> - <Counter worker="5">59850</Counter> - <Counter worker="6">59850</Counter> - <Counter worker="7">59850</Counter> - <Counter worker="8">59850</Counter> - <Counter worker="9">59850</Counter> - <Counter worker="10">59850</Counter> - <Counter worker="11">59850</Counter> - <Counter worker="12">59850</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="14"> - <Counter worker="0">56173</Counter> - <Counter worker="1">56175</Counter> - <Counter worker="2">56175</Counter> - <Counter worker="3">56175</Counter> - <Counter worker="4">56175</Counter> - <Counter worker="5">56175</Counter> - <Counter worker="6">56175</Counter> - <Counter worker="7">56175</Counter> - <Counter worker="8">56175</Counter> - <Counter worker="9">56175</Counter> - <Counter worker="10">56175</Counter> - <Counter worker="11">56175</Counter> - <Counter worker="12">56175</Counter> - <Counter worker="13">56175</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="15"> - <Counter worker="0">51032</Counter> - <Counter worker="1">51034</Counter> - <Counter worker="2">51034</Counter> - <Counter worker="3">51034</Counter> - <Counter worker="4">51034</Counter> - <Counter worker="5">51034</Counter> - <Counter worker="6">51034</Counter> - <Counter worker="7">51034</Counter> - <Counter worker="8">51034</Counter> - <Counter worker="9">51034</Counter> - <Counter worker="10">51034</Counter> - <Counter worker="11">51034</Counter> - <Counter worker="12">51034</Counter> - <Counter worker="13">51034</Counter> - <Counter worker="14">51034</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="16"> - <Counter worker="0">48695</Counter> - <Counter worker="1">48696</Counter> - <Counter worker="2">48696</Counter> - <Counter worker="3">48696</Counter> - <Counter worker="4">48696</Counter> - <Counter worker="5">48696</Counter> - <Counter worker="6">48696</Counter> - <Counter worker="7">48696</Counter> - <Counter worker="8">48696</Counter> - <Counter worker="9">48696</Counter> - <Counter worker="10">48696</Counter> - <Counter worker="11">48696</Counter> - <Counter worker="12">48695</Counter> - <Counter worker="13">48696</Counter> - <Counter worker="14">48696</Counter> - <Counter worker="15">48695</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="17"> - <Counter worker="0">43536</Counter> - <Counter worker="1">43537</Counter> - <Counter worker="2">43537</Counter> - <Counter worker="3">43537</Counter> - <Counter worker="4">43537</Counter> - <Counter worker="5">43537</Counter> - <Counter worker="6">43537</Counter> - <Counter worker="7">43537</Counter> - <Counter worker="8">43537</Counter> - <Counter worker="9">43537</Counter> - <Counter worker="10">43537</Counter> - <Counter worker="11">43537</Counter> - <Counter worker="12">43537</Counter> - <Counter worker="13">43537</Counter> - <Counter worker="14">43537</Counter> - <Counter worker="15">43537</Counter> - <Counter worker="16">43536</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="18"> - <Counter worker="0">38780</Counter> - <Counter worker="1">38781</Counter> - <Counter worker="2">38781</Counter> - <Counter worker="3">38781</Counter> - <Counter worker="4">38781</Counter> - <Counter worker="5">38781</Counter> - <Counter worker="6">38781</Counter> - <Counter worker="7">38781</Counter> - <Counter worker="8">38781</Counter> - <Counter worker="9">38781</Counter> - <Counter worker="10">38781</Counter> - <Counter worker="11">38781</Counter> - <Counter worker="12">38781</Counter> - <Counter worker="13">38781</Counter> - <Counter worker="14">38780</Counter> - <Counter worker="15">38781</Counter> - <Counter worker="16">38781</Counter> - <Counter worker="17">38781</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="19"> - <Counter worker="0">35997</Counter> - <Counter worker="1">35997</Counter> - <Counter worker="2">35997</Counter> - <Counter worker="3">35997</Counter> - <Counter worker="4">35997</Counter> - <Counter worker="5">35997</Counter> - <Counter worker="6">35998</Counter> - <Counter worker="7">35997</Counter> - <Counter worker="8">35997</Counter> - <Counter worker="9">35997</Counter> - <Counter worker="10">35997</Counter> - <Counter worker="11">35997</Counter> - <Counter worker="12">35997</Counter> - <Counter worker="13">35997</Counter> - <Counter worker="14">35997</Counter> - <Counter worker="15">35997</Counter> - <Counter worker="16">35997</Counter> - <Counter worker="17">35998</Counter> - <Counter worker="18">35997</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="20"> - <Counter worker="0">36332</Counter> - <Counter worker="1">36333</Counter> - <Counter worker="2">36333</Counter> - <Counter worker="3">36332</Counter> - <Counter worker="4">36333</Counter> - <Counter worker="5">36332</Counter> - <Counter worker="6">36333</Counter> - <Counter worker="7">36332</Counter> - <Counter worker="8">36332</Counter> - <Counter worker="9">36333</Counter> - <Counter worker="10">36332</Counter> - <Counter worker="11">36332</Counter> - <Counter worker="12">36332</Counter> - <Counter worker="13">36333</Counter> - <Counter worker="14">36332</Counter> - <Counter worker="15">36332</Counter> - <Counter worker="16">36332</Counter> - <Counter worker="17">36333</Counter> - <Counter worker="18">36332</Counter> - <Counter worker="19">36332</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="21"> - <Counter worker="0">33208</Counter> - <Counter worker="1">33209</Counter> - <Counter worker="2">33209</Counter> - <Counter worker="3">33209</Counter> - <Counter worker="4">33208</Counter> - <Counter worker="5">33208</Counter> - <Counter worker="6">33209</Counter> - <Counter worker="7">33208</Counter> - <Counter worker="8">33208</Counter> - <Counter worker="9">33208</Counter> - <Counter worker="10">33208</Counter> - <Counter worker="11">33208</Counter> - <Counter worker="12">33209</Counter> - <Counter worker="13">33209</Counter> - <Counter worker="14">33208</Counter> - <Counter worker="15">33208</Counter> - <Counter worker="16">33208</Counter> - <Counter worker="17">33208</Counter> - <Counter worker="18">33209</Counter> - <Counter worker="19">33208</Counter> - <Counter worker="20">33208</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="22"> - <Counter worker="0">31798</Counter> - <Counter worker="1">31798</Counter> - <Counter worker="2">31799</Counter> - <Counter worker="3">31799</Counter> - <Counter worker="4">31798</Counter> - <Counter worker="5">31799</Counter> - <Counter worker="6">31798</Counter> - <Counter worker="7">31799</Counter> - <Counter worker="8">31799</Counter> - <Counter worker="9">31799</Counter> - <Counter worker="10">31798</Counter> - <Counter worker="11">31799</Counter> - <Counter worker="12">31799</Counter> - <Counter worker="13">31798</Counter> - <Counter worker="14">31799</Counter> - <Counter worker="15">31799</Counter> - <Counter worker="16">31799</Counter> - <Counter worker="17">31799</Counter> - <Counter worker="18">31799</Counter> - <Counter worker="19">31799</Counter> - <Counter worker="20">31799</Counter> - <Counter worker="21">31799</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="23"> - <Counter worker="0">29626</Counter> - <Counter worker="1">29627</Counter> - <Counter worker="2">29627</Counter> - <Counter worker="3">29627</Counter> - <Counter worker="4">29627</Counter> - <Counter worker="5">29627</Counter> - <Counter worker="6">29627</Counter> - <Counter worker="7">29627</Counter> - <Counter worker="8">29627</Counter> - <Counter worker="9">29627</Counter> - <Counter worker="10">29627</Counter> - <Counter worker="11">29627</Counter> - <Counter worker="12">29627</Counter> - <Counter worker="13">29627</Counter> - <Counter worker="14">29627</Counter> - <Counter worker="15">29627</Counter> - <Counter worker="16">29627</Counter> - <Counter worker="17">29627</Counter> - <Counter worker="18">29627</Counter> - <Counter worker="19">29627</Counter> - <Counter worker="20">29627</Counter> - <Counter worker="21">29627</Counter> - <Counter worker="22">29627</Counter> - </ManyPthreadMutexProtect> - <ManyPthreadMutexProtect activeWorker="24"> - <Counter worker="0">28079</Counter> - <Counter worker="1">28079</Counter> - <Counter worker="2">28079</Counter> - <Counter worker="3">28079</Counter> - <Counter worker="4">28079</Counter> - <Counter worker="5">28079</Counter> - <Counter worker="6">28079</Counter> - <Counter worker="7">28079</Counter> - <Counter worker="8">28079</Counter> - <Counter worker="9">28079</Counter> - <Counter worker="10">28079</Counter> - <Counter worker="11">28079</Counter> - <Counter worker="12">28079</Counter> - <Counter worker="13">28079</Counter> - <Counter worker="14">28079</Counter> - <Counter worker="15">28079</Counter> - <Counter worker="16">28079</Counter> - <Counter worker="17">28079</Counter> - <Counter worker="18">28079</Counter> - <Counter worker="19">28080</Counter> - <Counter worker="20">28080</Counter> - <Counter worker="21">28080</Counter> - <Counter worker="22">28079</Counter> - <Counter worker="23">28079</Counter> - </ManyPthreadMutexProtect> -</TestTimeFine01> +*** TEST VERSION: 6.0.0.4bca4100fc4f184b6638165675095808f109546a +*** TEST STATE: EXPECTED_PASS +*** TEST BUILD: RTEMS_SMP +*** TEST TOOLS: 13.2.0 20230727 (RTEMS 6, RSB d3d738c35a71ca05f675b188539225099401ac79, Newlib a021448) +*** BEGIN OF JSON DATA *** +[ + { + "type": "event", + "description": "Send Event to Self", + "counter": [ + [172991], + [173266, 168815], + [173282, 168785, 168831], + [173276, 168779, 168779, 172240] + ] + }, { + "type": "event", + "description": "Send Event to One", + "counter": [ + [172666], + [172666, 320222], + [172682, 304636, 304639], + [172676, 304626, 320241, 312574] + ] + }, { + "type": "contested-mutex", + "description": "Obtain/Release Contested Classic Inheritance Mutex", + "counter": [ + [159961], + [12149, 12148], + [7529, 7529, 7528], + [5671, 5671, 5671, 5670] + ] + }, { + "type": "message", + "description": "Send Message to Self", + "counter": [ + [94498], + [94506, 94612], + [94516, 94622, 94622], + [94513, 94620, 94619, 94615] + ] + }, { + "type": "message", + "description": "Send Message to One Receiver", + "counter": [ + [94155], + [105077, 210425], + [91113, 182522, 182535], + [74015, 148307, 148308, 148292] + ] + }, { + "type": "private-mutex", + "description": "Obtain/Release Private Pthread Spinlock", + "counter": [ + [648144], + [648120, 648744], + [648207, 648831, 648831], + [648183, 648808, 648808, 648779] + ] + }, { + "type": "private-mutex", + "description": "Obtain/Release Private <sys/lock.h> Mutex", + "counter": [ + [317884], + [317869, 318174], + [317912, 318217, 318217], + [317901, 318206, 318206, 318193] + ] + }, { + "type": "private-mutex", + "description": "Obtain/Release Private Pthread Inheritance Mutex", + "counter": [ + [219857], + [219843, 220056], + [219877, 220089, 220089], + [219868, 220080, 220081, 220066] + ] + }, { + "type": "private-mutex", + "description": "Obtain/Release Private Classic Inheritance Mutex", + "counter": [ + [159957], + [159867, 160095], + [159923, 160107, 160107], + [159941, 160133, 160078, 160075] + ] + }, { + "type": "private-mutex", + "description": "Obtain/Release Private Pthread Ceiling Mutex", + "counter": [ + [28740], + [27948, 27993], + [26941, 26973, 26973], + [21414, 21439, 21439, 21439] + ] + }, { + "type": "private-mutex", + "description": "Obtain/Release Private Classic Ceiling Mutex", + "counter": [ + [27399], + [26819, 26841], + [26253, 26282, 26282], + [21187, 21215, 21214, 21214] + ] + }, { + "type": "private-mutex", + "description": "Obtain/Release Private Classic MrsP Mutex", + "counter": [ + [26696], + [26074, 26074], + [24738, 24770, 24769], + [18947, 18970, 18970, 18968] + ] + } +] +*** END OF JSON DATA *** + *** END OF TEST TMFINE 1 *** + +cpu 1 in error mode (tt = 0x80) + 2400642150 0000d760: 91d02000 ta 0x0 diff --git a/testsuites/tmtests/tmtimer01/init.c b/testsuites/tmtests/tmtimer01/init.c index b905bb7ab4..1a37b5192c 100644 --- a/testsuites/tmtests/tmtimer01/init.c +++ b/testsuites/tmtests/tmtimer01/init.c @@ -1,7 +1,7 @@ /* SPDX-License-Identifier: BSD-2-Clause */ /* - * Copyright (c) 2016 embedded brains GmbH & Co. KG + * Copyright (C) 2016, 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 @@ -108,13 +108,14 @@ static void test_fire_and_cancel( rtems_test_assert(sc2 == RTEMS_SUCCESSFUL); printf( - "<%s unit=\"ns\">%" PRIu64 "</%s>", + ",\n \"%s\": %" PRIu64, name, - rtems_counter_ticks_to_nanoseconds(d), - name + rtems_counter_ticks_to_nanoseconds(d) ); } +static const char *sep = "\n "; + static void test_case(test_context *ctx, size_t j, size_t k) { rtems_status_code sc; @@ -130,13 +131,17 @@ static void test_case(test_context *ctx, size_t j, size_t k) rtems_test_assert(sc == RTEMS_SUCCESSFUL); } - printf(" <Sample>\n <ActiveTimers>%zu</ActiveTimers>", j); - - test_fire_and_cancel(ctx, j, 0, "First"); - test_fire_and_cancel(ctx, j, j / 2, "Middle"); - test_fire_and_cancel(ctx, j, j + 1, "Last"); + printf( + "%s{\n" + " \"active-timers\": %zu", + sep, + j + ); + sep = "\n }, "; - printf("\n </Sample>\n"); + test_fire_and_cancel(ctx, j, 0, "first"); + test_fire_and_cancel(ctx, j, j / 2, "middle"); + test_fire_and_cancel(ctx, j, j + 1, "last"); } static void test(void) @@ -181,7 +186,13 @@ static void test(void) timer_count = n; } - printf("<TMTimer01 timerCount=\"%zu\">\n", timer_count); + printf( + "*** BEGIN OF JSON DATA ***\n" + "{\n" + " \"timer-count\": %zu,\n" + " \"samples\": [", + timer_count + ); k = 0; j = 0; @@ -194,7 +205,7 @@ static void test(void) test_case(ctx, n - 2, k); - printf("</TMTimer01>\n"); + printf("\n }\n ]\n}\n*** END OF JSON DATA ***\n"); } static void Init(rtems_task_argument arg) diff --git a/testsuites/tmtests/tmtimer01/plot.py b/testsuites/tmtests/tmtimer01/plot.py index 0328062314..73654c5b9d 100644 --- a/testsuites/tmtests/tmtimer01/plot.py +++ b/testsuites/tmtests/tmtimer01/plot.py @@ -1,7 +1,6 @@ # SPDX-License-Identifier: BSD-2-Clause -# -# Copyright (c) 2016 embedded brains GmbH & Co. KG +# Copyright (C) 2016, 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 @@ -23,22 +22,35 @@ # 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. -# -import libxml2 -from libxml2 import xmlNode -import matplotlib.pyplot as plt -doc = libxml2.parseFile('tmtimer01.scn') -ctx = doc.xpathNewContext() - -plt.title('timer test') -plt.xscale('log') -plt.xlabel('active timers') -plt.ylabel('timer fire and cancel [ns]') - -x = map(xmlNode.getContent, ctx.xpathEval('/TMTimer01/Sample/ActiveTimers')) -for i in ['First', 'Middle', 'Last']: - y = map(xmlNode.getContent, ctx.xpathEval('/TMTimer01/Sample/' + i)) - plt.plot(x, y, label = i) -plt.legend(loc = 'best') -plt.show() +import json +import re +import matplotlib.pyplot as plt # type: ignore +from matplotlib import ticker # type: ignore + + +def _plot(data: dict) -> None: + _, axes = plt.subplots() + axes.set_title("Timer Fire and Cancel Timing Test") + axes.set_xlabel("Active Timers") + axes.set_xscale("log") + axes.set_ylabel("Timer Fire and Cancel Duration [μs]") + x = [sample["active-timers"] for sample in data["samples"]] + for key in ["first", "middle", "last"]: + y = [sample[key] / 1000.0 for sample in data["samples"]] + axes.plot(x, y, label=f"operate on {key} timer", marker='o') + axes.legend(loc='best') + plt.savefig("tmtimer01.png") + plt.savefig("tmtimer01.pdf") + plt.close() + + +_JSON_DATA = re.compile( + r"\*\*\* BEGIN OF JSON DATA \*\*\*(.*)" + r"\*\*\* END OF JSON DATA \*\*\*", re.DOTALL) + +with open("tmtimer01.scn", "r", encoding="utf-8") as src: + match = _JSON_DATA.search(src.read()) + data = json.loads(match.group(1)) + +_plot(data) diff --git a/testsuites/tmtests/tmtimer01/tmtimer01.scn b/testsuites/tmtests/tmtimer01/tmtimer01.scn index db3ca01d27..b278c75177 100644 --- a/testsuites/tmtests/tmtimer01/tmtimer01.scn +++ b/testsuites/tmtests/tmtimer01/tmtimer01.scn @@ -1,137 +1,252 @@ -<TMTimer01 timerCount="65504"> - <Sample> - <ActiveTimers>0</ActiveTimers><First unit="ns">8812</First><Middle unit="ns">1412</Middle><Last unit="ns">917</Last> - </Sample> - <Sample> - <ActiveTimers>2</ActiveTimers><First unit="ns">1602</First><Middle unit="ns">1010</Middle><Last unit="ns">1367</Last> - </Sample> - <Sample> - <ActiveTimers>4</ActiveTimers><First unit="ns">1524</First><Middle unit="ns">1089</Middle><Last unit="ns">1086</Last> - </Sample> - <Sample> - <ActiveTimers>7</ActiveTimers><First unit="ns">1791</First><Middle unit="ns">1121</Middle><Last unit="ns">1838</Last> - </Sample> - <Sample> - <ActiveTimers>10</ActiveTimers><First unit="ns">1488</First><Middle unit="ns">1016</Middle><Last unit="ns">2134</Last> - </Sample> - <Sample> - <ActiveTimers>14</ActiveTimers><First unit="ns">1527</First><Middle unit="ns">1698</Middle><Last unit="ns">3186</Last> - </Sample> - <Sample> - <ActiveTimers>19</ActiveTimers><First unit="ns">2078</First><Middle unit="ns">1665</Middle><Last unit="ns">3397</Last> - </Sample> - <Sample> - <ActiveTimers>25</ActiveTimers><First unit="ns">1519</First><Middle unit="ns">2368</Middle><Last unit="ns">4464</Last> - </Sample> - <Sample> - <ActiveTimers>32</ActiveTimers><First unit="ns">1243</First><Middle unit="ns">2623</Middle><Last unit="ns">3549</Last> - </Sample> - <Sample> - <ActiveTimers>41</ActiveTimers><First unit="ns">2368</First><Middle unit="ns">2578</Middle><Last unit="ns">4105</Last> - </Sample> - <Sample> - <ActiveTimers>52</ActiveTimers><First unit="ns">2322</First><Middle unit="ns">2563</Middle><Last unit="ns">4126</Last> - </Sample> - <Sample> - <ActiveTimers>66</ActiveTimers><First unit="ns">2499</First><Middle unit="ns">1855</Middle><Last unit="ns">4919</Last> - </Sample> - <Sample> - <ActiveTimers>83</ActiveTimers><First unit="ns">1689</First><Middle unit="ns">3128</Middle><Last unit="ns">5894</Last> - </Sample> - <Sample> - <ActiveTimers>104</ActiveTimers><First unit="ns">2301</First><Middle unit="ns">2647</Middle><Last unit="ns">4595</Last> - </Sample> - <Sample> - <ActiveTimers>130</ActiveTimers><First unit="ns">2880</First><Middle unit="ns">3183</Middle><Last unit="ns">6222</Last> - </Sample> - <Sample> - <ActiveTimers>162</ActiveTimers><First unit="ns">2597</First><Middle unit="ns">2376</Middle><Last unit="ns">7118</Last> - </Sample> - <Sample> - <ActiveTimers>201</ActiveTimers><First unit="ns">3519</First><Middle unit="ns">3466</Middle><Last unit="ns">6673</Last> - </Sample> - <Sample> - <ActiveTimers>249</ActiveTimers><First unit="ns">2829</First><Middle unit="ns">3177</Middle><Last unit="ns">7784</Last> - </Sample> - <Sample> - <ActiveTimers>308</ActiveTimers><First unit="ns">2614</First><Middle unit="ns">3396</Middle><Last unit="ns">7338</Last> - </Sample> - <Sample> - <ActiveTimers>381</ActiveTimers><First unit="ns">3454</First><Middle unit="ns">4888</Middle><Last unit="ns">9114</Last> - </Sample> - <Sample> - <ActiveTimers>470</ActiveTimers><First unit="ns">3397</First><Middle unit="ns">2443</Middle><Last unit="ns">7689</Last> - </Sample> - <Sample> - <ActiveTimers>580</ActiveTimers><First unit="ns">2233</First><Middle unit="ns">4410</Middle><Last unit="ns">9355</Last> - </Sample> - <Sample> - <ActiveTimers>715</ActiveTimers><First unit="ns">3787</First><Middle unit="ns">5891</Middle><Last unit="ns">6833</Last> - </Sample> - <Sample> - <ActiveTimers>881</ActiveTimers><First unit="ns">3839</First><Middle unit="ns">5089</Middle><Last unit="ns">9232</Last> - </Sample> - <Sample> - <ActiveTimers>1085</ActiveTimers><First unit="ns">2838</First><Middle unit="ns">2739</Middle><Last unit="ns">11575</Last> - </Sample> - <Sample> - <ActiveTimers>1336</ActiveTimers><First unit="ns">3256</First><Middle unit="ns">5011</Middle><Last unit="ns">9684</Last> - </Sample> - <Sample> - <ActiveTimers>1645</ActiveTimers><First unit="ns">2293</First><Middle unit="ns">5262</Middle><Last unit="ns">10183</Last> - </Sample> - <Sample> - <ActiveTimers>2025</ActiveTimers><First unit="ns">4436</First><Middle unit="ns">5934</Middle><Last unit="ns">8804</Last> - </Sample> - <Sample> - <ActiveTimers>2492</ActiveTimers><First unit="ns">4506</First><Middle unit="ns">7284</Middle><Last unit="ns">10389</Last> - </Sample> - <Sample> - <ActiveTimers>3067</ActiveTimers><First unit="ns">3832</First><Middle unit="ns">4990</Middle><Last unit="ns">9536</Last> - </Sample> - <Sample> - <ActiveTimers>3774</ActiveTimers><First unit="ns">5088</First><Middle unit="ns">4888</Middle><Last unit="ns">9633</Last> - </Sample> - <Sample> - <ActiveTimers>4644</ActiveTimers><First unit="ns">5590</First><Middle unit="ns">5749</Middle><Last unit="ns">8975</Last> - </Sample> - <Sample> - <ActiveTimers>5714</ActiveTimers><First unit="ns">4854</First><Middle unit="ns">6813</Middle><Last unit="ns">11603</Last> - </Sample> - <Sample> - <ActiveTimers>7030</ActiveTimers><First unit="ns">6139</First><Middle unit="ns">6132</Middle><Last unit="ns">12630</Last> - </Sample> - <Sample> - <ActiveTimers>8649</ActiveTimers><First unit="ns">6877</First><Middle unit="ns">3852</Middle><Last unit="ns">10973</Last> - </Sample> - <Sample> - <ActiveTimers>10640</ActiveTimers><First unit="ns">6532</First><Middle unit="ns">6097</Middle><Last unit="ns">11725</Last> - </Sample> - <Sample> - <ActiveTimers>13089</ActiveTimers><First unit="ns">5284</First><Middle unit="ns">5392</Middle><Last unit="ns">13246</Last> - </Sample> - <Sample> - <ActiveTimers>16101</ActiveTimers><First unit="ns">7077</First><Middle unit="ns">7572</Middle><Last unit="ns">14820</Last> - </Sample> - <Sample> - <ActiveTimers>19806</ActiveTimers><First unit="ns">7132</First><Middle unit="ns">8335</Middle><Last unit="ns">11668</Last> - </Sample> - <Sample> - <ActiveTimers>24363</ActiveTimers><First unit="ns">8676</First><Middle unit="ns">7919</Middle><Last unit="ns">13937</Last> - </Sample> - <Sample> - <ActiveTimers>29968</ActiveTimers><First unit="ns">5970</First><Middle unit="ns">10978</Middle><Last unit="ns">16035</Last> - </Sample> - <Sample> - <ActiveTimers>36862</ActiveTimers><First unit="ns">8804</First><Middle unit="ns">8767</Middle><Last unit="ns">13089</Last> - </Sample> - <Sample> - <ActiveTimers>45342</ActiveTimers><First unit="ns">8608</First><Middle unit="ns">10305</Middle><Last unit="ns">15709</Last> - </Sample> - <Sample> - <ActiveTimers>55772</ActiveTimers><First unit="ns">8949</First><Middle unit="ns">10031</Middle><Last unit="ns">16262</Last> - </Sample> - <Sample> - <ActiveTimers>65503</ActiveTimers><First unit="ns">9199</First><Middle unit="ns">10309</Middle><Last unit="ns">19090</Last> - </Sample> -</TMTimer01> + + SIS - SPARC/RISCV instruction simulator 2.30, copyright Jiri Gaisler 2020 + Bug-reports to jiri@gaisler.se + + GR740/LEON4 emulation enabled, 4 cpus online, delta 50 clocks + + Loaded build/sparc/gr740/testsuites/tmtests/tmtimer01.exe, entry 0x00000000 + + +*** BEGIN OF TEST TMTIMER 1 *** +*** TEST VERSION: 6.0.0.76c91ee7793fc70b92e2f87e601c3fdc2d2b7f3f +*** TEST STATE: EXPECTED_PASS +*** TEST BUILD: RTEMS_SMP +*** TEST TOOLS: 13.2.0 20230727 (RTEMS 6, RSB d3d738c35a71ca05f675b188539225099401ac79, Newlib a021448) +*** BEGIN OF JSON DATA *** +{ + "timer-count": 61024, + "samples": [ + { + "active-timers": 0, + "first": 8560, + "middle": 8600, + "last": 8520 + }, { + "active-timers": 2, + "first": 9020, + "middle": 11680, + "last": 8860 + }, { + "active-timers": 4, + "first": 9480, + "middle": 9440, + "last": 11060 + }, { + "active-timers": 7, + "first": 9360, + "middle": 9820, + "last": 12300 + }, { + "active-timers": 10, + "first": 9860, + "middle": 9580, + "last": 11980 + }, { + "active-timers": 14, + "first": 9860, + "middle": 10040, + "last": 12280 + }, { + "active-timers": 19, + "first": 10360, + "middle": 10080, + "last": 13260 + }, { + "active-timers": 25, + "first": 10360, + "middle": 10500, + "last": 14460 + }, { + "active-timers": 32, + "first": 10240, + "middle": 10620, + "last": 13040 + }, { + "active-timers": 41, + "first": 10820, + "middle": 10540, + "last": 15000 + }, { + "active-timers": 52, + "first": 10740, + "middle": 10880, + "last": 13660 + }, { + "active-timers": 66, + "first": 10820, + "middle": 10880, + "last": 13960 + }, { + "active-timers": 83, + "first": 11160, + "middle": 11040, + "last": 14940 + }, { + "active-timers": 104, + "first": 11160, + "middle": 11420, + "last": 14340 + }, { + "active-timers": 130, + "first": 11160, + "middle": 11300, + "last": 14720 + }, { + "active-timers": 162, + "first": 11460, + "middle": 11380, + "last": 14880 + }, { + "active-timers": 201, + "first": 11500, + "middle": 11880, + "last": 17060 + }, { + "active-timers": 249, + "first": 11580, + "middle": 11800, + "last": 16900 + }, { + "active-timers": 308, + "first": 11380, + "middle": 12060, + "last": 15640 + }, { + "active-timers": 381, + "first": 11760, + "middle": 11840, + "last": 19800 + }, { + "active-timers": 470, + "first": 11880, + "middle": 12180, + "last": 16100 + }, { + "active-timers": 580, + "first": 11760, + "middle": 12600, + "last": 16560 + }, { + "active-timers": 715, + "first": 12140, + "middle": 12220, + "last": 17380 + }, { + "active-timers": 881, + "first": 12260, + "middle": 12640, + "last": 18740 + }, { + "active-timers": 1085, + "first": 12140, + "middle": 12560, + "last": 22320 + }, { + "active-timers": 1336, + "first": 12720, + "middle": 12600, + "last": 17240 + }, { + "active-timers": 1645, + "first": 12560, + "middle": 13020, + "last": 21140 + }, { + "active-timers": 2025, + "first": 12720, + "middle": 12980, + "last": 19500 + }, { + "active-timers": 2492, + "first": 12720, + "middle": 13400, + "last": 18160 + }, { + "active-timers": 3067, + "first": 13060, + "middle": 13060, + "last": 19220 + }, { + "active-timers": 3774, + "first": 12980, + "middle": 13560, + "last": 18620 + }, { + "active-timers": 4644, + "first": 13260, + "middle": 13860, + "last": 18920 + }, { + "active-timers": 5714, + "first": 13440, + "middle": 13520, + "last": 18920 + }, { + "active-timers": 7030, + "first": 13440, + "middle": 13900, + "last": 19380 + }, { + "active-timers": 8649, + "first": 13440, + "middle": 13820, + "last": 21640 + }, { + "active-timers": 10640, + "first": 14020, + "middle": 13940, + "last": 19760 + }, { + "active-timers": 13089, + "first": 13940, + "middle": 14160, + "last": 22100 + }, { + "active-timers": 16101, + "first": 13900, + "middle": 14320, + "last": 22680 + }, { + "active-timers": 19806, + "first": 13900, + "middle": 14700, + "last": 20840 + }, { + "active-timers": 24363, + "first": 14360, + "middle": 14320, + "last": 21660 + }, { + "active-timers": 29968, + "first": 14360, + "middle": 14540, + "last": 21300 + }, { + "active-timers": 36862, + "first": 14360, + "middle": 15320, + "last": 21440 + }, { + "active-timers": 45342, + "first": 14580, + "middle": 14700, + "last": 21600 + }, { + "active-timers": 55772, + "first": 14700, + "middle": 15040, + "last": 22060 + }, { + "active-timers": 61023, + "first": 14780, + "middle": 15080, + "last": 22960 + } + ] +} +*** END OF JSON DATA *** + +*** END OF TEST TMTIMER 1 *** + +cpu 0 in error mode (tt = 0x80) + 522750200 00009b40: 91d02000 ta 0x0 diff --git a/testsuites/unit/tc-base64-decode.c b/testsuites/unit/tc-base64-decode.c new file mode 100644 index 0000000000..4b0672d310 --- /dev/null +++ b/testsuites/unit/tc-base64-decode.c @@ -0,0 +1,186 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup TestsuitesUnitNoClock0 + */ + +/* + * Copyright (C) 2023 embedded brains GmbH & Co. KG + * + * 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. + */ + +#include <rtems/base64.h> + +#include <rtems/test.h> + +typedef struct { + Base64_Decode_control base; + uint8_t buf[64]; +} test_control; + +static int test_run(test_control* self, const char* payload) { + size_t len = strlen(payload); + + for (size_t i = 0; i < len; ++i) { + int rv = _Base64_Decode(&self->base, payload[i]); + + if (rv != 0) { + return rv; + } + } + + return 0; +} + +static int test_payload(test_control* self, const char* payload) { + memset(self->buf, 0xff, sizeof(self->buf)); + _Base64_Decode_initialize(&self->base, &self->buf[0], sizeof(self->buf)); + return test_run(self, payload); +} + +T_TEST_CASE(IOBase64Decode) { + int rv; + test_control instance; + test_control* self = &instance; + + rv = test_payload(self, "POOL"); + T_eq_int(rv, BASE64_DECODE_SUCCESS); + T_eq_int(self->base.state, BASE64_DECODE_STATE_0); + T_eq_ptr(self->base.target, &self->buf[3]); + const uint8_t expected1[] = {0x3c, 0xe3, 0x8b, 0xff}; + T_eq_mem(&self->buf[0], expected1, sizeof(expected1)); + + rv = test_payload(self, "ABCDEFGH"); + T_eq_int(rv, BASE64_DECODE_SUCCESS); + T_eq_int(self->base.state, BASE64_DECODE_STATE_0); + T_eq_ptr(self->base.target, &self->buf[6]); + const uint8_t expected2[] = {0x00, 0x10, 0x83, 0x10, 0x51, 0x87, 0xff}; + T_eq_mem(&self->buf[0], expected2, sizeof(expected2)); + + /* Non-base64 character results in an error */ + rv = test_payload(self, "PO*OL"); + T_eq_int(rv, BASE64_DECODE_INVALID_INPUT); + T_eq_int(self->base.state, BASE64_DECODE_STATE_2); + T_eq_ptr(self->base.target, &self->buf[1]); + const uint8_t expected3[] = {0x3c}; + T_eq_mem(&self->buf[0], expected3, sizeof(expected3)); + + /* Other non-base64 character results in an error */ + rv = test_payload(self, "PO\x80OL"); + T_eq_int(rv, BASE64_DECODE_INVALID_INPUT); + T_eq_int(self->base.state, BASE64_DECODE_STATE_2); + T_eq_ptr(self->base.target, &self->buf[1]); + T_eq_mem(&self->buf[0], expected3, sizeof(expected3)); + + /* Space characters should be ignored */ + rv = test_payload(self, "P OOL"); + T_eq_int(rv, BASE64_DECODE_SUCCESS); + T_eq_int(self->base.state, BASE64_DECODE_STATE_0); + T_eq_ptr(self->base.target, &self->buf[3]); + const uint8_t expected4[] = {0x3c, 0xe3, 0x8b, 0xff}; + T_eq_mem(&self->buf[0], expected4, sizeof(expected4)); + + /* Handle pad characters */ + rv = test_payload(self, "POOL=="); + T_eq_int(rv, BASE64_DECODE_SUCCESS); + T_eq_int(self->base.state, BASE64_DECODE_STATE_0); + T_eq_ptr(self->base.target, &self->buf[3]); + T_eq_ptr(self->base.target, self->base.target_end); + const uint8_t expected5[] = {0x3c, 0xe3, 0x8b, 0xff}; + T_eq_mem(&self->buf[0], expected5, sizeof(expected5)); + + /* If characters come after pad characters, an error results */ + rv = test_payload(self, "POOL==xy"); + T_eq_int(rv, BASE64_DECODE_OVERFLOW); + T_eq_int(self->base.state, BASE64_DECODE_SUCCESS); + T_eq_ptr(self->base.target, &self->buf[3]); + T_eq_ptr(self->base.target, self->base.target_end); + const uint8_t expected6[] = {0x3c, 0xe3, 0x8b, 0xff}; + T_eq_mem(&self->buf[0], expected6, sizeof(expected6)); + + rv = test_payload(self, "POOLPOOL"); + T_eq_int(rv, BASE64_DECODE_SUCCESS); + T_eq_int(self->base.state, BASE64_DECODE_STATE_0); + T_eq_ptr(self->base.target, &self->buf[6]); + const uint8_t expected7[] = {0x3c, 0xe3, 0x8b, 0x3c, 0xe3, 0x8b, 0xff}; + T_eq_mem(&self->buf[0], expected7, sizeof(expected7)); + + /* + * Test valid payload with series of target sizes. All target sizes + * less than three are invalid for the given payload and will result + * in an error. + */ + const uint8_t expected9[] = {0x3c, 0xe3, 0x8b, 0xff}; + + for (size_t i = 0; i < 4; ++i) { + memset(&self->buf[0], 0xff, sizeof(self->buf)); + _Base64_Decode_initialize(&self->base, &self->buf[0], i); + rv = test_run(self, "POOL"); + + if (i < 3) { + T_eq_int(rv, BASE64_DECODE_OVERFLOW); + T_eq_int(self->base.state, i); + T_ne_ptr(self->base.target, &self->buf[3]); + T_ne_mem(&self->buf[0], expected9, sizeof(expected9)); + } else { + T_eq_int(rv, BASE64_DECODE_SUCCESS); + T_eq_int(self->base.state, BASE64_DECODE_STATE_0); + T_eq_ptr(self->base.target, &self->buf[3]); + T_eq_mem(&self->buf[0], expected9, sizeof(expected9)); + } + } + + /* No overflow in state 1 */ + memset(&self->buf[0], 0xff, sizeof(self->buf)); + _Base64_Decode_initialize(&self->base, &self->buf[0], 1); + rv = test_run(self, "AA"); + T_eq_int(rv, BASE64_DECODE_SUCCESS); + T_eq_int(self->base.state, BASE64_DECODE_STATE_2); + T_eq_ptr(self->base.target, &self->buf[1]); + const uint8_t expected10[] = {0x00, 0xff}; + T_eq_mem(&self->buf[0], expected10, sizeof(expected10)); + + /* No overflow in state 2 */ + memset(&self->buf[0], 0xff, sizeof(self->buf)); + _Base64_Decode_initialize(&self->base, &self->buf[0], 2); + rv = test_run(self, "AAA"); + T_eq_int(rv, BASE64_DECODE_SUCCESS); + T_eq_int(self->base.state, BASE64_DECODE_STATE_3); + T_eq_ptr(self->base.target, &self->buf[2]); + const uint8_t expected11[] = {0x00, 0x00, 0xff}; + T_eq_mem(&self->buf[0], expected11, sizeof(expected11)); +} + +T_TEST_CASE(IOBase64DecodeInitialize) { + Base64_Decode_control instance; + Base64_Decode_control* self = &instance; + uint8_t buf[1]; + + memset(self, 0xff, sizeof(*self)); + _Base64_Decode_initialize(self, buf, sizeof(buf)); + T_eq_int(self->state, BASE64_DECODE_STATE_0); + T_eq_ptr(self->target, &buf[0]); + T_eq_ptr(self->target_end, &buf[1]); +} diff --git a/testsuites/unit/tc-compiler-builtins.c b/testsuites/unit/tc-compiler-builtins.c new file mode 100644 index 0000000000..7a470b6632 --- /dev/null +++ b/testsuites/unit/tc-compiler-builtins.c @@ -0,0 +1,1141 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup CompilerUnitBuiltins + */ + +/* + * Copyright (C) 2023 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <setjmp.h> +#include <stdint.h> + +#include "../validation/tx-support.h" + +#include <rtems/test.h> + +/** + * @defgroup CompilerUnitBuiltins spec:/compiler/unit/builtins + * + * @ingroup TestsuitesUnitNoClock0 + * + * @brief These unit tests check compiler builtins. + * + * Explicitly test the 64-bit integer division and modulo operations. They are + * essential for the timekeeping services. On most 32-bit targets, they need a + * software implementation. + * + * This test case performs the following actions: + * + * - Check the return value of __builtin_clz() for a sample set of inputs. + * + * - Check the return value of __builtin_clzll() for a sample set of inputs. + * + * - Check the return value of __builtin_ctz() for a sample set of inputs. + * + * - Check the return value of __builtin_ctzll() for a sample set of inputs. + * + * - Check the return value of __builtin_ffs() for a sample set of inputs. + * + * - Check the return value of __builtin_ffsll() for a sample set of inputs. + * + * - Check the return value of __builtin_parity() for a sample set of inputs. + * + * - Check the return value of __builtin_parityll() for a sample set of inputs. + * + * - Check the return value of __builtin_popcount() for a sample set of inputs. + * + * - Check the return value of __builtin_popcountll() for a sample set of + * inputs. + * + * - Check the return value of __builtin_bswap32() for a sample set of inputs. + * + * - Check the return value of __builtin_bswap64() for a sample set of inputs. + * + * - Check signed 64-bit comparisons for a sample set of values. + * + * - Check unsigned 64-bit comparisons for a sample set of values. + * + * - Check signed 64-bit arithmetic left shift for a sample set of values. + * + * - Check signed 64-bit arithmetic right shift for a sample set of values. + * + * - Check unsigned 64-bit logical right shift for a sample set of values. + * + * - Check signed 64-bit multiplication for a sample set of values. + * + * - Check signed 64-bit negation for a sample set of values. + * + * - Check signed 64-bit divisions for a sample set of values. + * + * - Check unsigned 64-bit divisions for a sample set of values. + * + * - Check signed 64-bit modulo operations for a sample set of values. + * + * - Check unsigned 64-bit modulo operations for a sample set of values. + * + * @{ + */ + +#if __LONG_MAX__ == 0x7fffffffL && !defined(__aarch64__) +#define TEST_UDIVMODDI4 +#endif + +#if defined(TEST_UDIVMODDI4) +uint64_t __udivmoddi4( uint64_t n, uint64_t d, uint64_t *r ); +#endif + +#if defined(TEST_UDIVMODDI4) && defined(__arm__) +/* + * Here __aeabi_uldivmod() may be used to carry out integer division + * operations even though the reminder is unused. This function is + * implemented by __udivmoddi4() which may never get called without a + * reminder for compiler generated code. + */ +#define TEST_UDIVMODDI4_WITHOUT_REMINDER +#endif + +static bool do_longjmp; + +static jmp_buf exception_return_context; + +static void Fatal( + rtems_fatal_source source, + rtems_fatal_code code, + void *arg +) +{ + (void) code; + + if ( source == RTEMS_FATAL_SOURCE_EXCEPTION && do_longjmp ) { + do_longjmp = false; + _ISR_Set_level( 0 ); + longjmp( arg, 1 ); + } +} + +static void CompilerUnitBuiltins_Setup( void *ctx ) +{ + SetFatalHandler( Fatal, exception_return_context ); +} + +static void CompilerUnitBuiltins_Teardown( void *ctx ) +{ + SetFatalHandler( NULL, NULL ); +} + +static T_fixture CompilerUnitBuiltins_Fixture = { + .setup = CompilerUnitBuiltins_Setup, + .stop = NULL, + .teardown = CompilerUnitBuiltins_Teardown, + .scope = NULL, + .initial_context = NULL +}; + +/** + * @brief Check the return value of __builtin_clz() for a sample set of inputs. + */ +static void CompilerUnitBuiltins_Action_0( void ) +{ + volatile unsigned int n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = 1U; + T_eq_int( __builtin_clz( n ), 31 ); + + n = 1U << 31; + T_eq_int( __builtin_clz( n ), 0 ); + + n = ~0U; + T_eq_int( __builtin_clz( n ), 0 ); +} + +/** + * @brief Check the return value of __builtin_clzll() for a sample set of + * inputs. + */ +static void CompilerUnitBuiltins_Action_1( void ) +{ + volatile unsigned long long n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = 1ULL; + T_eq_int( __builtin_clzll( n ), 63 ); + + n = 1ULL << 31; + T_eq_int( __builtin_clzll( n ), 32 ); + + n = 1ULL << 32; + T_eq_int( __builtin_clzll( n ), 31 ); + + n = 1ULL << 63; + T_eq_int( __builtin_clzll( n ), 0 ); + + n = ~0ULL; + T_eq_int( __builtin_clzll( n ), 0 ); +} + +/** + * @brief Check the return value of __builtin_ctz() for a sample set of inputs. + */ +static void CompilerUnitBuiltins_Action_2( void ) +{ + volatile unsigned int n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = 1U; + T_eq_int( __builtin_ctz( n ), 0 ); + + n = 1U << 31; + T_eq_int( __builtin_ctz( n ), 31 ); + + n = ~0U; + T_eq_int( __builtin_ctz( n ), 0 ); +} + +/** + * @brief Check the return value of __builtin_ctzll() for a sample set of + * inputs. + */ +static void CompilerUnitBuiltins_Action_3( void ) +{ + volatile unsigned long long n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = 1ULL; + T_eq_int( __builtin_ctzll( n ), 0 ); + + n = 1ULL << 31; + T_eq_int( __builtin_ctzll( n ), 31 ); + + n = 1ULL << 32; + T_eq_int( __builtin_ctzll( n ), 32 ); + + n = 1ULL << 63; + T_eq_int( __builtin_ctzll( n ), 63 ); + + n = ~0ULL; + T_eq_int( __builtin_ctzll( n ), 0 ); +} + +/** + * @brief Check the return value of __builtin_ffs() for a sample set of inputs. + */ +static void CompilerUnitBuiltins_Action_4( void ) +{ + volatile unsigned int n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = 1U; + T_eq_int( __builtin_ffs( n ), 1 ); + + n = 1U << 31; + T_eq_int( __builtin_ffs( n ), 32 ); + + n = 0U; + T_eq_int( __builtin_ffs( n ), 0 ); +} + +/** + * @brief Check the return value of __builtin_ffsll() for a sample set of + * inputs. + */ +static void CompilerUnitBuiltins_Action_5( void ) +{ + volatile unsigned long long n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = 1ULL; + T_eq_int( __builtin_ffsll( n ), 1 ); + + n = 1ULL << 31; + T_eq_int( __builtin_ffsll( n ), 32 ); + + n = 1ULL << 32; + T_eq_int( __builtin_ffsll( n ), 33 ); + + n = 1ULL << 63; + T_eq_int( __builtin_ffsll( n ), 64 ); + + n = 0ULL; + T_eq_int( __builtin_ffsll( n ), 0 ); +} + +/** + * @brief Check the return value of __builtin_parity() for a sample set of + * inputs. + */ +static void CompilerUnitBuiltins_Action_6( void ) +{ + volatile unsigned int n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = 1U; + T_eq_int( __builtin_parity( n ), 1 ); + + n = ~0U; + T_eq_int( __builtin_parity( n ), 0 ); +} + +/** + * @brief Check the return value of __builtin_parityll() for a sample set of + * inputs. + */ +static void CompilerUnitBuiltins_Action_7( void ) +{ + volatile unsigned long long n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = 1ULL; + T_eq_int( __builtin_parityll( n ), 1 ); + + n = ~0ULL; + T_eq_int( __builtin_parityll( n ), 0 ); +} + +/** + * @brief Check the return value of __builtin_popcount() for a sample set of + * inputs. + */ +static void CompilerUnitBuiltins_Action_8( void ) +{ + volatile unsigned int n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = 0U; + T_eq_int( __builtin_popcount( n ), 0 ); + + n = 1U; + T_eq_int( __builtin_popcount( n ), 1 ); + + n = ~0U; + T_eq_int( __builtin_popcount( n ), 32 ); +} + +/** + * @brief Check the return value of __builtin_popcountll() for a sample set of + * inputs. + */ +static void CompilerUnitBuiltins_Action_9( void ) +{ + volatile unsigned long long n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = 0ULL; + T_eq_int( __builtin_popcountll( n ), 0 ); + + n = 1ULL; + T_eq_int( __builtin_popcountll( n ), 1 ); + + n = ~0ULL; + T_eq_int( __builtin_popcountll( n ), 64 ); +} + +/** + * @brief Check the return value of __builtin_bswap32() for a sample set of + * inputs. + */ +static void CompilerUnitBuiltins_Action_10( void ) +{ + volatile uint32_t n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = UINT32_C( 0 ); + T_eq_u32( __builtin_bswap32( n ), n ); + + n = UINT32_C( 1 ); + T_eq_u32( __builtin_bswap32( n ), n << 24 ); + + n = UINT32_C( 0x12345678 ); + T_eq_u32( __builtin_bswap32( n ), UINT32_C( 0x78563412 ) ); + + n = ~UINT32_C( 0 ); + T_eq_u32( __builtin_bswap32( n ), n ); +} + +/** + * @brief Check the return value of __builtin_bswap64() for a sample set of + * inputs. + */ +static void CompilerUnitBuiltins_Action_11( void ) +{ + volatile uint64_t n; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + + n = UINT64_C( 0 ); + T_eq_u64( __builtin_bswap64( n ), n ); + + n = UINT64_C( 1 ); + T_eq_u64( __builtin_bswap64( n ), n << 56 ); + + n = UINT64_C( 0x123456789abcdef0 ); + T_eq_u64( __builtin_bswap64( n ), UINT64_C( 0xf0debc9a78563412 ) ); + + n = ~UINT64_C( 0 ); + T_eq_u64( __builtin_bswap64( n ), n ); +} + +/** + * @brief Check signed 64-bit comparisons for a sample set of values. + */ +static void CompilerUnitBuiltins_Action_12( void ) +{ + volatile int64_t a; + volatile int64_t b; + + a = 0; + RTEMS_OBFUSCATE_VARIABLE( a ); + b = 0; + RTEMS_OBFUSCATE_VARIABLE( b ); + + a = INT64_C( 0 ); + b = INT64_C( 0 ); + T_false( a < b ); + + a = INT64_C( 0 ); + b = INT64_C( 1 ); + T_true( a < b ); + + a = INT64_C( 0x123456789abcdef0 ); + b = INT64_C( 0xf0debc9a78563412 ); + T_false( a < b ); + + a = INT64_C( 0xf0debc9a78563412 ); + b = INT64_C( 0x123456789abcdef0 ); + T_true( a < b ); +} + +/** + * @brief Check unsigned 64-bit comparisons for a sample set of values. + */ +static void CompilerUnitBuiltins_Action_13( void ) +{ + volatile uint64_t a; + volatile uint64_t b; + + a = 0; + RTEMS_OBFUSCATE_VARIABLE( a ); + b = 0; + RTEMS_OBFUSCATE_VARIABLE( b ); + + a = UINT64_C( 0 ); + b = UINT64_C( 0 ); + T_false( a < b ); + + a = UINT64_C( 0 ); + b = UINT64_C( 1 ); + T_true( a < b ); + + a = UINT64_C( 0x123456789abcdef0 ); + b = UINT64_C( 0xf0debc9a78563412 ); + T_true( a < b ); + + a = UINT64_C( 0xf0debc9a78563412 ); + b = UINT64_C( 0x123456789abcdef0 ); + T_false( a < b ); +} + +/** + * @brief Check signed 64-bit arithmetic left shift for a sample set of values. + */ +static void CompilerUnitBuiltins_Action_14( void ) +{ + volatile int64_t i; + volatile int s; + + i = 0; + RTEMS_OBFUSCATE_VARIABLE( i ); + s = 0; + RTEMS_OBFUSCATE_VARIABLE( s ); + + i = INT64_C( 1 ); + s = 0; + T_eq_i64( i << s, INT64_C( 1 ) ); + + i = -INT64_C( 1 ); + s = 0; + T_eq_i64( i << s, -INT64_C( 1 ) ); + + i = INT64_C( 1 ); + s = 1; + T_eq_i64( i << s, INT64_C( 2 ) ); + + i = -INT64_C( 1 ); + s = 1; + T_eq_i64( i << s, -INT64_C( 2 ) ); +} + +/** + * @brief Check signed 64-bit arithmetic right shift for a sample set of + * values. + */ +static void CompilerUnitBuiltins_Action_15( void ) +{ + volatile int64_t i; + volatile int s; + + i = 0; + RTEMS_OBFUSCATE_VARIABLE( i ); + s = 0; + RTEMS_OBFUSCATE_VARIABLE( s ); + + i = INT64_C( 1 ); + s = 0; + T_eq_i64( i >> s, INT64_C( 1 ) ); + + i = -INT64_C( 1 ); + s = 0; + T_eq_i64( i >> s, -INT64_C( 1 ) ); + + i = INT64_C( 2 ); + s = 1; + T_eq_i64( i >> s, INT64_C( 1 ) ); + + i = -INT64_C( 2 ); + s = 1; + T_eq_i64( i >> s, -INT64_C( 1 ) ); +} + +/** + * @brief Check unsigned 64-bit logical right shift for a sample set of values. + */ +static void CompilerUnitBuiltins_Action_16( void ) +{ + volatile uint64_t i; + volatile int s; + + i = 0; + RTEMS_OBFUSCATE_VARIABLE( i ); + s = 0; + RTEMS_OBFUSCATE_VARIABLE( s ); + + i = UINT64_C( 1 ); + s = 0; + T_eq_u64( i >> s, UINT64_C( 1 ) ); + + i = -UINT64_C( 1 ); + s = 0; + T_eq_u64( i >> s, UINT64_C( 0xffffffffffffffff ) ); + + i = UINT64_C( 2 ); + s = 1; + T_eq_u64( i >> s, UINT64_C( 1 ) ); + + i = -UINT64_C( 2 ); + s = 1; + T_eq_u64( i >> s, UINT64_C( 0x7fffffffffffffff ) ); +} + +/** + * @brief Check signed 64-bit multiplication for a sample set of values. + */ +static void CompilerUnitBuiltins_Action_17( void ) +{ + volatile int64_t a; + volatile int64_t b; + + a = 0; + RTEMS_OBFUSCATE_VARIABLE( a ); + b = 0; + RTEMS_OBFUSCATE_VARIABLE( b ); + + a = INT64_C( 1 ); + b = INT64_C( 1 ); + T_eq_i64( a * b, INT64_C( 1 ) ); + + a = INT64_C( 1 ); + b = INT64_C( 0 ); + T_eq_i64( a * b, INT64_C( 0 ) ); + + a = INT64_C( 0 ); + b = INT64_C( 1 ); + T_eq_i64( a * b, INT64_C( 0 ) ); +} + +/** + * @brief Check signed 64-bit negation for a sample set of values. + */ +static void CompilerUnitBuiltins_Action_18( void ) +{ + volatile int64_t i; + + i = 0; + RTEMS_OBFUSCATE_VARIABLE( i ); + + i = INT64_C( 1 ); + T_eq_i64( -i, -INT64_C( 1 ) ); + + i = -INT64_C( 1 ); + T_eq_i64( -i, INT64_C( 1 ) ); +} + +/** + * @brief Check signed 64-bit divisions for a sample set of values. + */ +static void CompilerUnitBuiltins_Action_19( void ) +{ + volatile int64_t n; + volatile int64_t d; + volatile int64_t x; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + d = 0; + RTEMS_OBFUSCATE_VARIABLE( d ); + x = 0; + RTEMS_OBFUSCATE_VARIABLE( x ); + + n = INT64_C( 0 ); + d = INT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n / d; + } + + n = INT64_C( 1 ); + d = INT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n / d; + } + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n / d; + } + + n = INT64_C( 0x7fffffff00000000 ); + d = INT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n / d; + } + + n = INT64_C( 0 ); + d = INT64_C( 1 ); + T_eq_i64( n / d, INT64_C( 0 ) ); + + n = INT64_C( 1 ); + d = INT64_C( 1 ); + T_eq_i64( n / d, INT64_C( 1 ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 1 ); + T_eq_i64( n / d, INT64_C( 9223372036854775807 ) ); + + n = INT64_C( 2 ); + d = INT64_C( 1 ); + T_eq_i64( n / d, INT64_C( 2 ) ); + + n = INT64_C( 2 ); + d = INT64_C( 1 ); + T_eq_i64( n / d, INT64_C( 2 ) ); + + n = INT64_C( 1 ); + d = INT64_C( 0x7fffffffffffffff ); + T_eq_i64( n / d, INT64_C( 0 ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0x7fffffffffffffff ); + T_eq_i64( n / d, INT64_C( 1 ) ); + + n = INT64_C( 1 ); + d = INT64_C( 0x7fffffff00000000 ); + T_eq_i64( n / d, INT64_C( 0 ) ); + + n = INT64_C( 0x7fffffff00000000 ); + d = INT64_C( 0x7fffffff00000000 ); + T_eq_i64( n / d, INT64_C( 1 ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0x7fffffff00000000 ); + T_eq_i64( n / d, INT64_C( 1 ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0x8000000000000000 ); + T_eq_i64( n / d, INT64_C( 0 ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0x0000000080000000 ); + T_eq_i64( n / d, INT64_C( 0xffffffff ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0x00000000f0000000 ); + T_eq_i64( n / d, INT64_C( 2290649224 ) ); + + n = INT64_C( 0x00000001ffffffff ); + d = INT64_C( 0x00000000f0000000 ); + T_eq_i64( n / d, INT64_C( 2 ) ); + + n = INT64_C( 0x0000000fffffffff ); + d = INT64_C( 0x000000000000000f ); + T_eq_i64( n / d, INT64_C( 4581298449 ) ); + + n = INT64_C( 0x0000000100000001 ); + d = INT64_C( 0x0000000f00000000 ); + T_eq_i64( n / d, INT64_C( 0 ) ); + + n = INT64_C( 0x0000000f0000000f ); + d = INT64_C( 0x000000ff0000000f ); + T_eq_i64( n / d, INT64_C( 0 ) ); +} + +/** + * @brief Check unsigned 64-bit divisions for a sample set of values. + */ +static void CompilerUnitBuiltins_Action_20( void ) +{ + volatile uint64_t n; + volatile uint64_t d; + volatile uint64_t x; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + d = 0; + RTEMS_OBFUSCATE_VARIABLE( d ); + x = 0; + RTEMS_OBFUSCATE_VARIABLE( x ); + + n = UINT64_C( 0 ); + d = UINT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n / d; + } + + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + __udivmoddi4( n, d, NULL ); + } + #endif + + n = UINT64_C( 1 ); + d = UINT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n / d; + } + + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + __udivmoddi4( n, d, NULL ); + } + #endif + + n = UINT64_C( 0x7fffffffffffffff ); + d = UINT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n / d; + } + + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + __udivmoddi4( n, d, NULL ); + } + #endif + + n = UINT64_C( 0x7fffffff00000000 ); + d = UINT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n / d; + } + + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + __udivmoddi4( n, d, NULL ); + } + #endif + + n = UINT64_C( 0x7fffffff00000000 ); + d = UINT64_C( 0x7fffffff00000000 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n / d; + } + + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + __udivmoddi4( n, d, NULL ); + } + #endif + + n = UINT64_C( 0 ); + d = UINT64_C( 1 ); + T_eq_u64( n / d, UINT64_C( 0 ) ); + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 0 ) ); + #endif + + n = UINT64_C( 1 ); + d = UINT64_C( 1 ); + T_eq_u64( n / d, UINT64_C( 1 ) ); + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 1 ) ); + #endif + + n = UINT64_C( 0xffffffffffffffff ); + d = UINT64_C( 1 ); + T_eq_u64( n / d, UINT64_C( 0xffffffffffffffff ) ); + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 0xffffffffffffffff ) ); + #endif + + n = UINT64_C( 2 ); + d = UINT64_C( 1 ); + T_eq_u64( n / d, UINT64_C( 2 ) ); + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 2 ) ); + #endif + + n = UINT64_C( 1 ); + d = UINT64_C( 0xffffffffffffffff ); + T_eq_u64( n / d, UINT64_C( 0 ) ); + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 0 ) ); + #endif + + n = UINT64_C( 0xffffffffffffffff ); + d = UINT64_C( 0xffffffffffffffff ); + T_eq_u64( n / d, UINT64_C( 1 ) ); + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 1 ) ); + #endif + + n = UINT64_C( 0xffffffffffffffff ); + d = UINT64_C( 0x8000000000000000 ); + T_eq_u64( n / d, UINT64_C( 1 ) ); + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 1 ) ); + #endif + + n = UINT64_C( 0x0000000100000001 ); + d = UINT64_C( 0x0000000f00000000 ); + T_eq_u64( n / d, UINT64_C( 0 ) ); + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 0 ) ); + #endif + + n = UINT64_C( 0x0000000100000000 ); + d = UINT64_C( 0x0000000f00000001 ); + T_eq_u64( n / d, UINT64_C( 0 ) ); + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 0 ) ); + #endif + + n = UINT64_C( 0xffffffff0000000f ); + d = UINT64_C( 0x000000010000000f ); + T_eq_u64( n / d, UINT64_C( 4294967280 ) ); + #if defined(TEST_UDIVMODDI4_WITHOUT_REMINDER) + T_eq_u64( __udivmoddi4( n, d, NULL ), UINT64_C( 4294967280 ) ); + #endif +} + +/** + * @brief Check signed 64-bit modulo operations for a sample set of values. + */ +static void CompilerUnitBuiltins_Action_21( void ) +{ + volatile int64_t n; + volatile int64_t d; + volatile int64_t x; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + d = 0; + RTEMS_OBFUSCATE_VARIABLE( d ); + x = 0; + RTEMS_OBFUSCATE_VARIABLE( x ); + + n = INT64_C( 0 ); + d = INT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n % d; + } + + n = INT64_C( 1 ); + d = INT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n % d; + } + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n % d; + } + + n = INT64_C( 0x7fffffff00000000 ); + d = INT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n % d; + } + + n = INT64_C( 0 ); + d = INT64_C( 1 ); + T_eq_i64( n % d, INT64_C( 0 ) ); + + n = INT64_C( 1 ); + d = INT64_C( 1 ); + T_eq_i64( n % d, INT64_C( 0 ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 1 ); + T_eq_i64( n % d, INT64_C( 0 ) ); + + n = INT64_C( 2 ); + d = INT64_C( 1 ); + T_eq_i64( n % d, INT64_C( 0 ) ); + + n = INT64_C( 2 ); + d = INT64_C( 1 ); + T_eq_i64( n % d, INT64_C( 0 ) ); + + n = INT64_C( 1 ); + d = INT64_C( 0x7fffffffffffffff ); + T_eq_i64( n % d, INT64_C( 1 ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0x7fffffffffffffff ); + T_eq_i64( n % d, INT64_C( 0 ) ); + + n = INT64_C( 1 ); + d = INT64_C( 0x7fffffff00000000 ); + T_eq_i64( n % d, INT64_C( 1 ) ); + + n = INT64_C( 0x7fffffff00000000 ); + d = INT64_C( 0x7fffffff00000000 ); + T_eq_i64( n % d, INT64_C( 0 ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0x7fffffff00000000 ); + T_eq_i64( n % d, INT64_C( 0xffffffff ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0x8000000000000000 ); + T_eq_i64( n % d, INT64_C( 0x7fffffffffffffff ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0x0000000080000000 ); + T_eq_i64( n % d, INT64_C( 2147483647 ) ); + + n = INT64_C( 0x7fffffffffffffff ); + d = INT64_C( 0x00000000f0000000 ); + T_eq_i64( n % d, INT64_C( 2147483647 ) ); + + n = INT64_C( 0x00000001ffffffff ); + d = INT64_C( 0x00000000f0000000 ); + T_eq_i64( n % d, INT64_C( 536870911 ) ); + + n = INT64_C( 0x0000000fffffffff ); + d = INT64_C( 0x000000000000000f ); + T_eq_i64( n % d, INT64_C( 0 ) ); + + n = INT64_C( 0x0000000100000001 ); + d = INT64_C( 0x0000000f00000000 ); + T_eq_i64( n % d, INT64_C( 4294967297 ) ); + + n = INT64_C( 0x0000000f0000000f ); + d = INT64_C( 0x000000ff0000000f ); + T_eq_i64( n % d, INT64_C( 64424509455 ) ); + + #if defined(TEST_UDIVMODDI4) + /* + * The above test cases may use __udivmoddi4(). However, the below + * parameter values for __udivmoddi4() cannot be obtained through the + * signed modulo or division operations. On some targets, calls to + * __udivmoddi4() may result from complex optimizations. + */ + n = INT64_C( 0xffffffff0000000f ); + d = INT64_C( 0x000000010000000f ); + T_eq_u64( __udivmoddi4( n, d, NULL ), INT64_C( 4294967280 ) ); + #endif +} + +/** + * @brief Check unsigned 64-bit modulo operations for a sample set of values. + */ +static void CompilerUnitBuiltins_Action_22( void ) +{ + volatile uint64_t n; + volatile uint64_t d; + volatile uint64_t x; + + n = 0; + RTEMS_OBFUSCATE_VARIABLE( n ); + d = 0; + RTEMS_OBFUSCATE_VARIABLE( d ); + x = 0; + RTEMS_OBFUSCATE_VARIABLE( x ); + + n = UINT64_C( 0 ); + d = UINT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n % d; + } + + n = UINT64_C( 1 ); + d = UINT64_C( 0 ); + do_longjmp = true; + + if ( setjmp( exception_return_context ) == 0 ) { + x = n % d; + } + + n = UINT64_C( 0 ); + d = UINT64_C( 1 ); + T_eq_u64( n % d, UINT64_C( 0 ) ); + + n = UINT64_C( 1 ); + d = UINT64_C( 1 ); + T_eq_u64( n % d, UINT64_C( 0 ) ); + + n = UINT64_C( 0xffffffffffffffff ); + d = UINT64_C( 1 ); + T_eq_u64( n % d, UINT64_C( 0 ) ); + + n = UINT64_C( 2 ); + d = UINT64_C( 1 ); + T_eq_u64( n % d, UINT64_C( 0 ) ); + + n = UINT64_C( 1 ); + d = UINT64_C( 0xffffffffffffffff ); + T_eq_u64( n % d, UINT64_C( 1 ) ); + + n = UINT64_C( 0xffffffffffffffff ); + d = UINT64_C( 0xffffffffffffffff ); + T_eq_u64( n % d, UINT64_C( 0 ) ); +} + +/** + * @fn void T_case_body_CompilerUnitBuiltins( void ) + */ +T_TEST_CASE_FIXTURE( CompilerUnitBuiltins, &CompilerUnitBuiltins_Fixture ) +{ + CompilerUnitBuiltins_Action_0(); + CompilerUnitBuiltins_Action_1(); + CompilerUnitBuiltins_Action_2(); + CompilerUnitBuiltins_Action_3(); + CompilerUnitBuiltins_Action_4(); + CompilerUnitBuiltins_Action_5(); + CompilerUnitBuiltins_Action_6(); + CompilerUnitBuiltins_Action_7(); + CompilerUnitBuiltins_Action_8(); + CompilerUnitBuiltins_Action_9(); + CompilerUnitBuiltins_Action_10(); + CompilerUnitBuiltins_Action_11(); + CompilerUnitBuiltins_Action_12(); + CompilerUnitBuiltins_Action_13(); + CompilerUnitBuiltins_Action_14(); + CompilerUnitBuiltins_Action_15(); + CompilerUnitBuiltins_Action_16(); + CompilerUnitBuiltins_Action_17(); + CompilerUnitBuiltins_Action_18(); + CompilerUnitBuiltins_Action_19(); + CompilerUnitBuiltins_Action_20(); + CompilerUnitBuiltins_Action_21(); + CompilerUnitBuiltins_Action_22(); +} + +/** @} */ diff --git a/testsuites/unit/tc-config.c b/testsuites/unit/tc-config.c new file mode 100644 index 0000000000..415142e1b4 --- /dev/null +++ b/testsuites/unit/tc-config.c @@ -0,0 +1,171 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup RtemsConfigUnitConfig + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems.h> +#include <rtems/rtems/semdata.h> +#include <rtems/score/object.h> +#include <rtems/score/objectdata.h> + +#include <rtems/test.h> + +/** + * @defgroup RtemsConfigUnitConfig spec:/rtems/config/unit/config + * + * @ingroup TestsuitesUnitNoClock0 + * + * @brief Unit tests for the configuration manager. + * + * Parts of the file ``cpukit/sapi/src/getconfigmax.c`` are only executed when + * unlimited objects are configured. The space qualified code subset does not + * support this feature. This test exercises the code parts otherwise not + * reached in order to achieve full code coverage. + * + * This test case performs the following actions: + * + * - Call get_config_max() indirectly through + * rtems_configuration_get_maximum_semaphores() with a specially manipulated + * argument to enter an if-branch only accessed when unlimited objects are + * configured. + * + * - The value returned by the function call must be the one artificially + * injected by this test. + * + * @{ + */ + +#define SEMAPHORES_PER_BLOCK 32 + +/** + * @brief Test context for spec:/rtems/config/unit/config test case. + */ +typedef struct { + /** + * @brief This member contains the original value of + * ``_Semaphore_Information->objects_per_block``. + */ + Objects_Maximum objects_per_block_ori; +} RtemsConfigUnitConfig_Context; + +static RtemsConfigUnitConfig_Context + RtemsConfigUnitConfig_Instance; + +static void RtemsConfigUnitConfig_Setup( RtemsConfigUnitConfig_Context *ctx ) +{ + ctx->objects_per_block_ori = _Semaphore_Information.objects_per_block; + _Semaphore_Information.objects_per_block = SEMAPHORES_PER_BLOCK; +} + +static void RtemsConfigUnitConfig_Setup_Wrap( void *arg ) +{ + RtemsConfigUnitConfig_Context *ctx; + + ctx = arg; + RtemsConfigUnitConfig_Setup( ctx ); +} + +static void RtemsConfigUnitConfig_Teardown( + RtemsConfigUnitConfig_Context *ctx +) +{ + _Semaphore_Information.objects_per_block = ctx->objects_per_block_ori; +} + +static void RtemsConfigUnitConfig_Teardown_Wrap( void *arg ) +{ + RtemsConfigUnitConfig_Context *ctx; + + ctx = arg; + RtemsConfigUnitConfig_Teardown( ctx ); +} + +static T_fixture RtemsConfigUnitConfig_Fixture = { + .setup = RtemsConfigUnitConfig_Setup_Wrap, + .stop = NULL, + .teardown = RtemsConfigUnitConfig_Teardown_Wrap, + .scope = NULL, + .initial_context = &RtemsConfigUnitConfig_Instance +}; + +/** + * @brief Call get_config_max() indirectly through + * rtems_configuration_get_maximum_semaphores() with a specially manipulated + * argument to enter an if-branch only accessed when unlimited objects are + * configured. + */ +static void RtemsConfigUnitConfig_Action_0( + RtemsConfigUnitConfig_Context *ctx +) +{ + uint32_t max = rtems_configuration_get_maximum_semaphores(); + + /* + * The value returned by the function call must be the one artificially + * injected by this test. + */ + T_eq_u32( max, SEMAPHORES_PER_BLOCK | RTEMS_UNLIMITED_OBJECTS ); +} + +/** + * @fn void T_case_body_RtemsConfigUnitConfig( void ) + */ +T_TEST_CASE_FIXTURE( RtemsConfigUnitConfig, &RtemsConfigUnitConfig_Fixture ) +{ + RtemsConfigUnitConfig_Context *ctx; + + ctx = T_fixture_context(); + + RtemsConfigUnitConfig_Action_0( ctx ); +} + +/** @} */ diff --git a/testsuites/unit/tc-crc.c b/testsuites/unit/tc-crc.c new file mode 100644 index 0000000000..d33a837860 --- /dev/null +++ b/testsuites/unit/tc-crc.c @@ -0,0 +1,48 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup TestsuitesUnitNoClock0 + */ + +/* + * Copyright (C) 2023 embedded brains GmbH & Co. KG + * + * 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. + */ + +#include <rtems/crc.h> + +#include <rtems/test.h> + +T_TEST_CASE(CRC24Q) { + uint32_t state = _CRC24Q_Update(CRC24Q_SEED, 0); + T_eq_u32(state, 0); + state = _CRC24Q_Update(CRC24Q_SEED, '1'); + state = _CRC24Q_Update(state, '2'); + state = _CRC24Q_Update(state, '3'); + T_eq_u32(state & CRC24Q_MASK, 0x2c3045); + uint8_t bytes[] = {'1', '2', '3'}; + state = _CRC24Q_Sequence_update(CRC24Q_SEED, &bytes[0], sizeof(bytes)); + T_eq_u32(state & CRC24Q_MASK, 0x2c3045); +} diff --git a/testsuites/unit/tc-score-msgq.c b/testsuites/unit/tc-score-msgq.c new file mode 100644 index 0000000000..c4cb690c2f --- /dev/null +++ b/testsuites/unit/tc-score-msgq.c @@ -0,0 +1,452 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup ScoreMsgqUnitMsgq + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems.h> +#include <rtems/rtems/messageimpl.h> +#include <rtems/rtems/statusimpl.h> +#include <rtems/score/coremsgimpl.h> + +#include "../validation/tx-support.h" + +#include <rtems/test.h> + +/** + * @defgroup ScoreMsgqUnitMsgq spec:/score/msgq/unit/msgq + * + * @ingroup TestsuitesUnitNoClock0 + * + * @brief Unit tests for the Message Queue Handler. + * + * Parts of the files ``cpukit/score/src/coremsginsert.c``, + * ``cpukit/score/src/coremsgseize.c``, and + * ``cpukit/score/src/coremsgsubmit.c`` are only executed by the POSIX API. + * Currently, the pre-qualified subset of RTEMS does not contain the POSIX API. + * This test exercises the code parts otherwise only reached by the POSIX API + * to achieve full code coverage. + * + * This test case performs the following actions: + * + * - Use _CORE_message_queue_Insert_message() to insert two messages into a + * message queue and use the POSIX message priority to define their order in + * the queue. + * + * - Check that _CORE_message_queue_Submit() was executed successfully. + * + * - Check that the messages are in the right order in the message queue. + * + * - Submit three messages into a message queue which can only store two and + * have the third submit() blocked till a seize() occurs. + * + * - Check that the third _CORE_message_queue_Submit() did actually block + * till there was room for the message in the message queue. + * + * - Submit messages in the queue from within an ISR. + * + * - Check that the first two messages were successfully send. + * + * - Check that trying to send the third message from ISR when the message + * queue was full was rejected. + * + * @{ + */ + +#define MAXIMUM_PENDING_MESSAGES 2 +#define MAXIMUM_MESSAGE_SIZE 3 + +static void WorkerTask( rtems_task_argument argument ); + +/** + * @brief Test context for spec:/score/msgq/unit/msgq test case. + */ +typedef struct { + /** + * @brief This member contains a valid ID of a message queue. + */ + rtems_id message_queue_id; + + /** + * @brief This member is used as storage area for the message queue. + */ + RTEMS_MESSAGE_QUEUE_BUFFER( MAXIMUM_MESSAGE_SIZE ) + storage_area[ MAXIMUM_PENDING_MESSAGES]; + + /** + * @brief This member contains the task identifier of the worker task. + */ + rtems_id worker_id; + + /** + * @brief This member indicated whether the worker task is currently sending + * a message (``true``) or whether it is waiting to receive an event + * (``false``). + */ + bool is_worker_working; + + /** + * @brief This member contains the returned status code of the SendMessage() + * function. + */ + rtems_status_code send_status; +} ScoreMsgqUnitMsgq_Context; + +static ScoreMsgqUnitMsgq_Context + ScoreMsgqUnitMsgq_Instance; + +#define EVENT_SEND RTEMS_EVENT_17 +#define MESSAGE_CONTENT_LOW { 1, 2, 3 } +#define MESSAGE_CONTENT_HIGH { 4, 5 } +#define MESSAGE_PRIORITY_LOW 5 +#define MESSAGE_PRIORITY_HIGH 7 +#define DO_WAIT true + +typedef ScoreMsgqUnitMsgq_Context Context; + +/* + * This is a code fragment from rtems_message_queue_send() with the + * specialty that it uses a POSIX priority and the sender + * task will wait in case the queue is full. + */ +static rtems_status_code SubmitMessage( + rtems_id id, + uint8_t *message, + size_t message_size, + unsigned int posix_piority +) +{ + rtems_status_code status; + Thread_queue_Context queue_context; + Message_queue_Control *the_message_queue; + + T_assert_lt_uint( posix_piority, MQ_PRIO_MAX ); + + the_message_queue = _Message_queue_Get( + id, + &queue_context + ); + T_assert_not_null( the_message_queue ); + + /* The next two calls are from _POSIX_Message_queue_Send_support() */ + _Thread_queue_Context_set_enqueue_callout( + &queue_context, + _Thread_queue_Enqueue_do_nothing_extra + ); + _Thread_queue_Context_set_timeout_argument( &queue_context, NULL, true ); + + _CORE_message_queue_Acquire_critical( + &the_message_queue->message_queue, + &queue_context + ); + + status = _CORE_message_queue_Submit( + &the_message_queue->message_queue, + _Thread_Executing, + message, + message_size, + (CORE_message_queue_Submit_types) ( posix_piority * -1 ), + DO_WAIT, + &queue_context + ); + + return _Status_Get( status ); +} + +static rtems_status_code ReceiveMessage( + rtems_id id, + void *buffer, + size_t *size +) +{ + return rtems_message_queue_receive( + id, + buffer, + size, + RTEMS_LOCAL | RTEMS_NO_WAIT, + RTEMS_NO_TIMEOUT + ); +} + +static rtems_status_code ReceiveOneMessages( Context *ctx ) +{ + uint8_t message_buffer[ MAXIMUM_MESSAGE_SIZE ]; + size_t message_size; + + return ReceiveMessage( + ctx->message_queue_id, + &message_buffer, + &message_size + ); +} + +static void SendMessage( Context *ctx ) +{ + uint8_t message[] = { 100, 101, 102 }; + ctx->send_status = SubmitMessage( + ctx->message_queue_id, + message, + sizeof( message ), + MESSAGE_PRIORITY_LOW + ); +} + +static void WorkerTask( rtems_task_argument argument ) +{ + Context *ctx = (Context *) argument; + + while ( true ) { + ctx->is_worker_working = false; + ReceiveAnyEvents(); + ctx->is_worker_working = true; + SendMessage( ctx ); + T_assert_rsc_success( ctx->send_status ); + } +} + +static void WorkerSendMessage( Context *ctx ) +{ + SendEvents( ctx->worker_id, EVENT_SEND ); +} + +static void ScoreMsgqUnitMsgq_Setup( ScoreMsgqUnitMsgq_Context *ctx ) +{ + rtems_status_code status; + rtems_message_queue_config config = { + .name = rtems_build_name( 'M', 'S', 'G', 'Q' ), + .maximum_pending_messages = MAXIMUM_PENDING_MESSAGES, + .maximum_message_size = MAXIMUM_MESSAGE_SIZE, + .storage_area = ctx->storage_area, + .storage_size = sizeof( ctx->storage_area ), + .storage_free = NULL, + .attributes = RTEMS_DEFAULT_ATTRIBUTES + }; + + status = rtems_message_queue_construct( + &config, + &ctx->message_queue_id + ); + T_rsc_success( status ); + + SetSelfPriority( PRIO_NORMAL ); + + ctx->worker_id = CreateTask( "WORK", PRIO_HIGH ); + StartTask( ctx->worker_id, WorkerTask, ctx ); +} + +static void ScoreMsgqUnitMsgq_Setup_Wrap( void *arg ) +{ + ScoreMsgqUnitMsgq_Context *ctx; + + ctx = arg; + ScoreMsgqUnitMsgq_Setup( ctx ); +} + +static void ScoreMsgqUnitMsgq_Teardown( ScoreMsgqUnitMsgq_Context *ctx ) +{ + DeleteTask( ctx->worker_id ); + RestoreRunnerPriority(); + T_rsc_success( rtems_message_queue_delete( ctx->message_queue_id ) ); +} + +static void ScoreMsgqUnitMsgq_Teardown_Wrap( void *arg ) +{ + ScoreMsgqUnitMsgq_Context *ctx; + + ctx = arg; + ScoreMsgqUnitMsgq_Teardown( ctx ); +} + +static T_fixture ScoreMsgqUnitMsgq_Fixture = { + .setup = ScoreMsgqUnitMsgq_Setup_Wrap, + .stop = NULL, + .teardown = ScoreMsgqUnitMsgq_Teardown_Wrap, + .scope = NULL, + .initial_context = &ScoreMsgqUnitMsgq_Instance +}; + +/** + * @brief Use _CORE_message_queue_Insert_message() to insert two messages into + * a message queue and use the POSIX message priority to define their order + * in the queue. + */ +static void ScoreMsgqUnitMsgq_Action_0( ScoreMsgqUnitMsgq_Context *ctx ) +{ + rtems_status_code status_submit_low; + rtems_status_code status_submit_high; + rtems_status_code status_receive_low; + rtems_status_code status_receive_high; + uint8_t message_low[] = MESSAGE_CONTENT_LOW; + uint8_t message_high[] = MESSAGE_CONTENT_HIGH; + uint8_t message_buffer_low[ MAXIMUM_MESSAGE_SIZE ]; + uint8_t message_buffer_high[ MAXIMUM_MESSAGE_SIZE ]; + size_t message_size_low; + size_t message_size_high; + + status_submit_low = SubmitMessage( + ctx->message_queue_id, + message_low, + sizeof( message_low ), + MESSAGE_PRIORITY_LOW + ); + + status_submit_high = SubmitMessage( + ctx->message_queue_id, + message_high, + sizeof( message_high ), + MESSAGE_PRIORITY_HIGH + ); + + status_receive_high = ReceiveMessage( + ctx->message_queue_id, + &message_buffer_high, + &message_size_high + ); + + status_receive_low = ReceiveMessage( + ctx->message_queue_id, + &message_buffer_low, + &message_size_low + ); + + /* + * Check that _CORE_message_queue_Submit() was executed successfully. + */ + T_rsc_success( status_submit_low ); + T_rsc_success( status_submit_high ); + + /* + * Check that the messages are in the right order in the message queue. + */ + T_rsc_success( status_receive_high ); + T_eq_sz( message_size_high, sizeof( message_high ) ); + T_eq_mem( message_buffer_high, message_high, message_size_high ); + + T_rsc_success( status_receive_low ); + T_eq_sz( message_size_low, sizeof( message_low ) ); + T_eq_mem( message_buffer_low, message_low, message_size_low ); +} + +/** + * @brief Submit three messages into a message queue which can only store two + * and have the third submit() blocked till a seize() occurs. + */ +static void ScoreMsgqUnitMsgq_Action_1( ScoreMsgqUnitMsgq_Context *ctx ) +{ + bool is_worker_blocked_after_third_send; + bool is_worker_blocked_after_first_receive; + + WorkerSendMessage( ctx ); + WorkerSendMessage( ctx ); + WorkerSendMessage( ctx ); + is_worker_blocked_after_third_send = ctx->is_worker_working; + + T_rsc_success( ReceiveOneMessages( ctx ) ); + is_worker_blocked_after_first_receive = ctx->is_worker_working; + + T_rsc_success( ReceiveOneMessages( ctx ) ); + T_rsc_success( ReceiveOneMessages( ctx ) ); + + /* + * Check that the third _CORE_message_queue_Submit() did actually block till + * there was room for the message in the message queue. + */ + T_true( is_worker_blocked_after_third_send ); + T_true( !is_worker_blocked_after_first_receive ); +} + +/** + * @brief Submit messages in the queue from within an ISR. + */ +static void ScoreMsgqUnitMsgq_Action_2( ScoreMsgqUnitMsgq_Context *ctx ) +{ + rtems_status_code status_send_first_message; + rtems_status_code status_send_second_message; + rtems_status_code status_send_third_message; + + CallWithinISR( ( void (*)(void*) ) SendMessage, ctx ); + status_send_first_message = ctx->send_status; + CallWithinISR( ( void (*)(void*) ) SendMessage, ctx ); + status_send_second_message = ctx->send_status; + CallWithinISR( ( void (*)(void*) ) SendMessage, ctx ); + status_send_third_message = ctx->send_status; + + T_rsc_success( ReceiveOneMessages( ctx ) ); + T_rsc_success( ReceiveOneMessages( ctx ) ); + + /* + * Check that the first two messages were successfully send. + */ + T_assert_rsc_success( status_send_first_message ); + T_assert_rsc_success( status_send_second_message ); + + /* + * Check that trying to send the third message from ISR when the message + * queue was full was rejected. + */ + T_rsc( status_send_third_message, STATUS_CLASSIC_INTERNAL_ERROR ); +} + +/** + * @fn void T_case_body_ScoreMsgqUnitMsgq( void ) + */ +T_TEST_CASE_FIXTURE( ScoreMsgqUnitMsgq, &ScoreMsgqUnitMsgq_Fixture ) +{ + ScoreMsgqUnitMsgq_Context *ctx; + + ctx = T_fixture_context(); + + ScoreMsgqUnitMsgq_Action_0( ctx ); + ScoreMsgqUnitMsgq_Action_1( ctx ); + ScoreMsgqUnitMsgq_Action_2( ctx ); +} + +/** @} */ diff --git a/testsuites/validation/bsps/tc-fatal-sparc-leon3-shutdown-halt.c b/testsuites/validation/bsps/tc-fatal-sparc-leon3-shutdown-halt.c new file mode 100644 index 0000000000..0b0b5cf5b7 --- /dev/null +++ b/testsuites/validation/bsps/tc-fatal-sparc-leon3-shutdown-halt.c @@ -0,0 +1,142 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup BspSparcLeon3ValFatalShutdownHalt + */ + +/* + * Copyright (C) 2021, 2022 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems/sysinit.h> + +#include "tx-support.h" + +#include <rtems/test.h> + +/** + * @defgroup BspSparcLeon3ValFatalShutdownHalt \ + * spec:/bsp/sparc/leon3/val/fatal-shutdown-halt + * + * @ingroup TestsuitesBspsFatalSparcLeon3Shutdown + * + * @brief Tests the leon3 BSP family shutdown procedure. + * + * This test case performs the following actions: + * + * - Check the effects of the leon3 BSP family shutdown procedure. + * + * - Check that no dynamic fatal error extension was invoked. This shows + * that the leon3 BSP family shutdown procedure called the wrapped + * _CPU_Fatal_halt() function of the test suite. + * + * @{ + */ + +static Atomic_Uint dynamic_fatal_extension_counter; + +static rtems_status_code status; + +static unsigned int Add( Atomic_Uint *a, unsigned int b ) +{ + return _Atomic_Fetch_add_uint( a, b, ATOMIC_ORDER_RELAXED ); +} + +static void DynamicFatalHandler( + rtems_fatal_source source, + bool always_set_to_false, + rtems_fatal_code code +) +{ + (void) source; + (void) code; + (void) always_set_to_false; + (void) Add( &dynamic_fatal_extension_counter, 1 ); +} + +static void InitBspSparcLeon3ValFatalShutdownHalt( void ) +{ + rtems_extensions_table table = { .fatal = DynamicFatalHandler }; + rtems_id id; + + status = rtems_extension_create( OBJECT_NAME, &table, &id ); +} + +RTEMS_SYSINIT_ITEM( + InitBspSparcLeon3ValFatalShutdownHalt, + RTEMS_SYSINIT_DEVICE_DRIVERS, + RTEMS_SYSINIT_ORDER_MIDDLE +); + +/** + * @brief Check the effects of the leon3 BSP family shutdown procedure. + */ +static void BspSparcLeon3ValFatalShutdownHalt_Action_0( void ) +{ + uint32_t counter; + + /* + * Check that no dynamic fatal error extension was invoked. This shows that + * the leon3 BSP family shutdown procedure called the wrapped + * _CPU_Fatal_halt() function of the test suite. + */ + T_step_rsc_success( 0, status ); + counter = Add( &dynamic_fatal_extension_counter, 0 ); + T_step_eq_u32( 1, counter, 0 ); +} + +/** + * @fn void T_case_body_BspSparcLeon3ValFatalShutdownHalt( void ) + */ +T_TEST_CASE( BspSparcLeon3ValFatalShutdownHalt ) +{ + T_plan( 2 ); + + BspSparcLeon3ValFatalShutdownHalt_Action_0(); +} + +/** @} */ diff --git a/testsuites/validation/bsps/tc-fatal-sparc-leon3-shutdown-request.c b/testsuites/validation/bsps/tc-fatal-sparc-leon3-shutdown-request.c new file mode 100644 index 0000000000..46bc44e7cb --- /dev/null +++ b/testsuites/validation/bsps/tc-fatal-sparc-leon3-shutdown-request.c @@ -0,0 +1,179 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup BspSparcLeon3ValFatalShutdownRequest + */ + +/* + * Copyright (C) 2021, 2022 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <bsp/leon3.h> +#include <rtems/sysinit.h> +#include <rtems/score/smpimpl.h> + +#include "tx-support.h" + +#include <rtems/test.h> + +/** + * @defgroup BspSparcLeon3ValFatalShutdownRequest \ + * spec:/bsp/sparc/leon3/val/fatal-shutdown-request + * + * @ingroup TestsuitesBspsFatalSparcLeon3Shutdown + * + * @brief Tests the leon3 BSP family SMP-specific shutdown procedure. + * + * This test case performs the following actions: + * + * - Check the effects of the leon3 BSP family shutdown procedure. + * + * - Check that the second processor was not powered down during system + * initialization. + * + * - Wait until the second processor is powered down. + * + * - Check that the RTEMS_FATAL_SOURCE_SMP with SMP_FATAL_SHUTDOWN_RESPONSE + * fatal error occurred exactly once. + * + * - Check that the RTEMS_FATAL_SOURCE_SMP with SMP_FATAL_SHUTDOWN_RESPONSE + * fatal error occurred on the second processor. + * + * @{ + */ + +static uint32_t mpstat_during_sysinit; + +static Atomic_Uint shutdown_response_counter; + +static uint32_t shutdown_response_cpu_index = UINT32_MAX; + +static unsigned int Add( Atomic_Uint *a, unsigned int b ) +{ + return _Atomic_Fetch_add_uint( a, b, ATOMIC_ORDER_RELAXED ); +} + +static void ShutdownFatalHandler( + rtems_fatal_source source, + rtems_fatal_code code, + void *arg +) +{ + T_null( arg ); + + if ( + source == RTEMS_FATAL_SOURCE_SMP && + code == SMP_FATAL_SHUTDOWN_RESPONSE + ) { + (void) Add( &shutdown_response_counter, 1 ); + shutdown_response_cpu_index = rtems_scheduler_get_processor(); + } +} + +static void InitBspSparcLeon3ValFatalShutdownRequest( void ) +{ + irqamp *regs; + + regs = LEON3_IrqCtrl_Regs; + mpstat_during_sysinit = grlib_load_32( ®s->mpstat ); + SetFatalHandler( ShutdownFatalHandler, NULL ); +} + +RTEMS_SYSINIT_ITEM( + InitBspSparcLeon3ValFatalShutdownRequest, + RTEMS_SYSINIT_DEVICE_DRIVERS, + RTEMS_SYSINIT_ORDER_MIDDLE +); + +/** + * @brief Check the effects of the leon3 BSP family shutdown procedure. + */ +static void BspSparcLeon3ValFatalShutdownRequest_Action_0( void ) +{ + irqamp *regs; + uint32_t counter; + + regs = LEON3_IrqCtrl_Regs; + + /* + * Check that the second processor was not powered down during system + * initialization. + */ + T_step_eq_u32( 0, mpstat_during_sysinit & 0x2, 0 ); + + /* + * Wait until the second processor is powered down. + */ + while ( ( grlib_load_32( ®s->mpstat ) & 0x2 ) != 0x2U ) { + /* Wait */ + } + + /* + * Check that the RTEMS_FATAL_SOURCE_SMP with SMP_FATAL_SHUTDOWN_RESPONSE + * fatal error occurred exactly once. + */ + counter = Add( &shutdown_response_counter, 0 ); + T_step_eq_uint( 1, counter, 1 ); + + /* + * Check that the RTEMS_FATAL_SOURCE_SMP with SMP_FATAL_SHUTDOWN_RESPONSE + * fatal error occurred on the second processor. + */ + T_step_eq_u32( 2, shutdown_response_cpu_index, 1 ); +} + +/** + * @fn void T_case_body_BspSparcLeon3ValFatalShutdownRequest( void ) + */ +T_TEST_CASE( BspSparcLeon3ValFatalShutdownRequest ) +{ + T_plan( 3 ); + + BspSparcLeon3ValFatalShutdownRequest_Action_0(); +} + +/** @} */ diff --git a/testsuites/validation/bsps/tc-sparc-gr712rc.c b/testsuites/validation/bsps/tc-sparc-gr712rc.c new file mode 100644 index 0000000000..a16de3d6ed --- /dev/null +++ b/testsuites/validation/bsps/tc-sparc-gr712rc.c @@ -0,0 +1,124 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup BspSparcLeon3ValGr712rc + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <bsp.h> + +#include "tx-support.h" + +#include <rtems/test.h> + +/** + * @defgroup BspSparcLeon3ValGr712rc spec:/bsp/sparc/leon3/val/gr712rc + * + * @ingroup TestsuitesBspsValidationBsp0 + * + * @brief This test case collection provides validation test cases for the + * ``sparc/gr712rc`` BSP. + * + * This test case performs the following actions: + * + * - Validate the use of the ``-mfix-gr712rc`` compiler option. + * + * - Check that the compiler built-in define ``__FIX_LEON3FT_B2BST`` is + * defined. + * + * - Check that the compiler built-in define ``__FIX_LEON3FT_TN0018`` is + * defined. + * + * - Check that the ``SPARC_LEON3FT_B2BST_NOP`` define expands to a ``nop`` + * instruction. + * + * @{ + */ + +/** + * @brief Validate the use of the ``-mfix-gr712rc`` compiler option. + */ +static void BspSparcLeon3ValGr712rc_Action_0( void ) +{ + const char *s; + + /* + * Check that the compiler built-in define ``__FIX_LEON3FT_B2BST`` is + * defined. + */ + #if !defined(__FIX_LEON3FT_B2BST) + #error "__FIX_LEON3FT_B2BST is not defined" + #endif + + /* + * Check that the compiler built-in define ``__FIX_LEON3FT_TN0018`` is + * defined. + */ + #if !defined(__FIX_LEON3FT_TN0018) + #error "__FIX_LEON3FT_TN0018 is not defined" + #endif + + /* + * Check that the ``SPARC_LEON3FT_B2BST_NOP`` define expands to a ``nop`` + * instruction. + */ + s = RTEMS_XSTRING( SPARC_LEON3FT_B2BST_NOP ); + T_true( IsEqualIgnoreWhiteSpace( s, "nop" ) ); +} + +/** + * @fn void T_case_body_BspSparcLeon3ValGr712rc( void ) + */ +T_TEST_CASE( BspSparcLeon3ValGr712rc ) +{ + BspSparcLeon3ValGr712rc_Action_0(); +} + +/** @} */ diff --git a/testsuites/validation/bsps/tr-fatal-clock-xil-ttc-irq-install.c b/testsuites/validation/bsps/tr-fatal-clock-xil-ttc-irq-install.c new file mode 100644 index 0000000000..731b454ee4 --- /dev/null +++ b/testsuites/validation/bsps/tr-fatal-clock-xil-ttc-irq-install.c @@ -0,0 +1,187 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup DevClockXilTtcValFatalIrqInstall + */ + +/* + * Copyright (C) 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 + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <bsp.h> +#include <rtems.h> +#include <bsp/fatal.h> +#include <rtems/sysinit.h> + +#include "tr-fatal-clock-xil-ttc-irq-install.h" + +#include <rtems/test.h> + +/** + * @defgroup DevClockXilTtcValFatalIrqInstall \ + * spec:/dev/clock/xil-ttc/val/fatal-irq-install + * + * @ingroup TestsuitesBspsFatalClockXilTtcIrqInstall + * + * @brief Tests a fatal error. + * + * This test case performs the following actions: + * + * - The test action is carried out by the OccupyClockInterrupt() system + * initialization handler. + * + * - Check that the expected fatal source is present. + * + * - Check that the expected fatal code is present. + * + * @{ + */ + +/** + * @brief Test context for spec:/dev/clock/xil-ttc/val/fatal-irq-install test + * case. + */ +typedef struct { + /** + * @brief This member contains a copy of the corresponding + * DevClockXilTtcValFatalIrqInstall_Run() parameter. + */ + rtems_fatal_source source; + + /** + * @brief This member contains a copy of the corresponding + * DevClockXilTtcValFatalIrqInstall_Run() parameter. + */ + rtems_fatal_code code; +} DevClockXilTtcValFatalIrqInstall_Context; + +static DevClockXilTtcValFatalIrqInstall_Context + DevClockXilTtcValFatalIrqInstall_Instance; + +static void ClockInterrupt( void *arg ) +{ + (void) arg; +} + +static rtems_interrupt_entry interrupt_entry = RTEMS_INTERRUPT_ENTRY_INITIALIZER( + ClockInterrupt, + NULL, + "Clock" +); + +static void OccupyClockInterrupt( void ) +{ + (void) rtems_interrupt_entry_install( + XIL_CLOCK_TTC_IRQ, + RTEMS_INTERRUPT_UNIQUE, + &interrupt_entry + ); +} + +RTEMS_SYSINIT_ITEM( + OccupyClockInterrupt, + RTEMS_SYSINIT_DEVICE_DRIVERS, + RTEMS_SYSINIT_ORDER_FIRST +); + +static T_fixture DevClockXilTtcValFatalIrqInstall_Fixture = { + .setup = NULL, + .stop = NULL, + .teardown = NULL, + .scope = NULL, + .initial_context = &DevClockXilTtcValFatalIrqInstall_Instance +}; + +/** + * @brief The test action is carried out by the OccupyClockInterrupt() system + * initialization handler. + */ +static void DevClockXilTtcValFatalIrqInstall_Action_0( + DevClockXilTtcValFatalIrqInstall_Context *ctx +) +{ + /* Nothing to do */ + + /* + * Check that the expected fatal source is present. + */ + T_step_eq_int( 0, ctx->source, RTEMS_FATAL_SOURCE_BSP ); + + /* + * Check that the expected fatal code is present. + */ + T_step_eq_ulong( + 1, + ctx->code, + XIL_FATAL_TTC_IRQ_INSTALL + ); +} + +void DevClockXilTtcValFatalIrqInstall_Run( + rtems_fatal_source source, + rtems_fatal_code code +) +{ + DevClockXilTtcValFatalIrqInstall_Context *ctx; + + ctx = &DevClockXilTtcValFatalIrqInstall_Instance; + ctx->source = source; + ctx->code = code; + + ctx = T_case_begin( + "DevClockXilTtcValFatalIrqInstall", + &DevClockXilTtcValFatalIrqInstall_Fixture + ); + + T_plan( 2 ); + + DevClockXilTtcValFatalIrqInstall_Action_0( ctx ); + + T_case_end(); +} + +/** @} */ diff --git a/testsuites/validation/bsps/tr-fatal-clock-xil-ttc-irq-install.h b/testsuites/validation/bsps/tr-fatal-clock-xil-ttc-irq-install.h new file mode 100644 index 0000000000..74021233a0 --- /dev/null +++ b/testsuites/validation/bsps/tr-fatal-clock-xil-ttc-irq-install.h @@ -0,0 +1,84 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup DevClockXilTtcValFatalIrqInstall + */ + +/* + * Copyright (C) 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 + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifndef _TR_FATAL_CLOCK_XIL_TTC_IRQ_INSTALL_H +#define _TR_FATAL_CLOCK_XIL_TTC_IRQ_INSTALL_H + +#include <rtems.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup DevClockXilTtcValFatalIrqInstall + * + * @{ + */ + +/** + * @brief Runs the parameterized test case. + * + * @param source is fatal source. + * + * @param code is fatal code. + */ +void DevClockXilTtcValFatalIrqInstall_Run( + rtems_fatal_source source, + rtems_fatal_code code +); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TR_FATAL_CLOCK_XIL_TTC_IRQ_INSTALL_H */ diff --git a/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-boot.c b/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-boot.c new file mode 100644 index 0000000000..748fd88e70 --- /dev/null +++ b/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-boot.c @@ -0,0 +1,175 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup BspSparcLeon3ValFatalCacheSnoopingDisabledBoot + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <bsp/fatal.h> +#include <bsp/leon3.h> +#include <rtems/sysinit.h> + +#include "tr-fatal-sparc-leon3-cache-snooping-disabled-boot.h" + +#include <rtems/test.h> + +/** + * @defgroup BspSparcLeon3ValFatalCacheSnoopingDisabledBoot \ + * spec:/bsp/sparc/leon3/val/fatal-cache-snooping-disabled-boot + * + * @ingroup TestsuitesBspsFatalSparcLeon3CacheSnoopingDisabledBoot + * + * @brief Tests a fatal error. + * + * This test case performs the following actions: + * + * - The test action is carried out by the DisableCacheSnooping() system + * initialization handler. + * + * - Check that the expected fatal source is present. + * + * - Check that the expected fatal code is present. + * + * @{ + */ + +/** + * @brief Test context for + * spec:/bsp/sparc/leon3/val/fatal-cache-snooping-disabled-boot test case. + */ +typedef struct { + /** + * @brief This member contains a copy of the corresponding + * BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Run() parameter. + */ + rtems_fatal_source source; + + /** + * @brief This member contains a copy of the corresponding + * BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Run() parameter. + */ + rtems_fatal_code code; +} BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Context; + +static BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Context + BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Instance; + +static void DisableCacheSnooping( void ) +{ + uint32_t control; + + control = leon3_get_cache_control_register(); + control &= ~LEON3_REG_CACHE_CTRL_DS; + leon3_set_cache_control_register( control ); +} + +RTEMS_SYSINIT_ITEM( + DisableCacheSnooping, + RTEMS_SYSINIT_BSP_EARLY, + RTEMS_SYSINIT_ORDER_FIRST +); + +static T_fixture BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Fixture = { + .setup = NULL, + .stop = NULL, + .teardown = NULL, + .scope = NULL, + .initial_context = &BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Instance +}; + +/** + * @brief The test action is carried out by the DisableCacheSnooping() system + * initialization handler. + */ +static void BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Action_0( + BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Context *ctx +) +{ + /* Nothing to do */ + + /* + * Check that the expected fatal source is present. + */ + T_step_eq_int( 0, ctx->source, RTEMS_FATAL_SOURCE_BSP ); + + /* + * Check that the expected fatal code is present. + */ + T_step_eq_ulong( + 1, + ctx->code, + LEON3_FATAL_INVALID_CACHE_CONFIG_BOOT_PROCESSOR + ); +} + +void BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Run( + rtems_fatal_source source, + rtems_fatal_code code +) +{ + BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Context *ctx; + + ctx = &BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Instance; + ctx->source = source; + ctx->code = code; + + ctx = T_case_begin( + "BspSparcLeon3ValFatalCacheSnoopingDisabledBoot", + &BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Fixture + ); + + T_plan( 2 ); + + BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Action_0( ctx ); + + T_case_end(); +} + +/** @} */ diff --git a/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-boot.h b/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-boot.h new file mode 100644 index 0000000000..e375e6baac --- /dev/null +++ b/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-boot.h @@ -0,0 +1,84 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup BspSparcLeon3ValFatalCacheSnoopingDisabledBoot + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifndef _TR_FATAL_SPARC_LEON3_CACHE_SNOOPING_DISABLED_BOOT_H +#define _TR_FATAL_SPARC_LEON3_CACHE_SNOOPING_DISABLED_BOOT_H + +#include <rtems.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup BspSparcLeon3ValFatalCacheSnoopingDisabledBoot + * + * @{ + */ + +/** + * @brief Runs the parameterized test case. + * + * @param source is fatal source. + * + * @param code is fatal code. + */ +void BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Run( + rtems_fatal_source source, + rtems_fatal_code code +); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TR_FATAL_SPARC_LEON3_CACHE_SNOOPING_DISABLED_BOOT_H */ diff --git a/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-secondary.c b/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-secondary.c new file mode 100644 index 0000000000..4d90abf42d --- /dev/null +++ b/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-secondary.c @@ -0,0 +1,176 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <bsp/bootcard.h> +#include <bsp/fatal.h> +#include <bsp/leon3.h> + +#include "tr-fatal-sparc-leon3-cache-snooping-disabled-secondary.h" + +#include <rtems/test.h> + +/** + * @defgroup BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary \ + * spec:/bsp/sparc/leon3/val/fatal-cache-snooping-disabled-secondary + * + * @ingroup TestsuitesBspsFatalSparcLeon3CacheSnoopingDisabledSecondary + * + * @brief Tests a fatal error. + * + * This test case performs the following actions: + * + * - The test action is carried out by the wrapped + * bsp_start_on_secondary_processor() function. + * + * - Check that the expected fatal source is present. + * + * - Check that the expected fatal code is present. + * + * @{ + */ + +/** + * @brief Test context for + * spec:/bsp/sparc/leon3/val/fatal-cache-snooping-disabled-secondary test + * case. + */ +typedef struct { + /** + * @brief This member contains a copy of the corresponding + * BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Run() parameter. + */ + rtems_fatal_source source; + + /** + * @brief This member contains a copy of the corresponding + * BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Run() parameter. + */ + rtems_fatal_code code; +} BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Context; + +static BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Context + BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Instance; + +void __real_bsp_start_on_secondary_processor( struct Per_CPU_Control *cpu_self ); + +void __wrap_bsp_start_on_secondary_processor( struct Per_CPU_Control *cpu_self ); + +void __wrap_bsp_start_on_secondary_processor( struct Per_CPU_Control *cpu_self ) +{ + uint32_t control; + + control = leon3_get_cache_control_register(); + control &= ~LEON3_REG_CACHE_CTRL_DS; + leon3_set_cache_control_register( control ); + + __real_bsp_start_on_secondary_processor( cpu_self ); +} + +static T_fixture BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Fixture = { + .setup = NULL, + .stop = NULL, + .teardown = NULL, + .scope = NULL, + .initial_context = &BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Instance +}; + +/** + * @brief The test action is carried out by the wrapped + * bsp_start_on_secondary_processor() function. + */ +static void BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Action_0( + BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Context *ctx +) +{ + /* Nothing to do */ + + /* + * Check that the expected fatal source is present. + */ + T_step_eq_int( 0, ctx->source, RTEMS_FATAL_SOURCE_BSP ); + + /* + * Check that the expected fatal code is present. + */ + T_step_eq_ulong( + 1, + ctx->code, + LEON3_FATAL_INVALID_CACHE_CONFIG_SECONDARY_PROCESSOR + ); +} + +void BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Run( + rtems_fatal_source source, + rtems_fatal_code code +) +{ + BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Context *ctx; + + ctx = &BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Instance; + ctx->source = source; + ctx->code = code; + + ctx = T_case_begin( + "BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary", + &BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Fixture + ); + + T_plan( 2 ); + + BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Action_0( ctx ); + + T_case_end(); +} + +/** @} */ diff --git a/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-secondary.h b/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-secondary.h new file mode 100644 index 0000000000..0782942222 --- /dev/null +++ b/testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-secondary.h @@ -0,0 +1,84 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifndef _TR_FATAL_SPARC_LEON3_CACHE_SNOOPING_DISABLED_SECONDARY_H +#define _TR_FATAL_SPARC_LEON3_CACHE_SNOOPING_DISABLED_SECONDARY_H + +#include <rtems.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary + * + * @{ + */ + +/** + * @brief Runs the parameterized test case. + * + * @param source is fatal source. + * + * @param code is fatal code. + */ +void BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Run( + rtems_fatal_source source, + rtems_fatal_code code +); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TR_FATAL_SPARC_LEON3_CACHE_SNOOPING_DISABLED_SECONDARY_H */ diff --git a/testsuites/validation/bsps/tr-fatal-sparc-leon3-clock-initialization.c b/testsuites/validation/bsps/tr-fatal-sparc-leon3-clock-initialization.c new file mode 100644 index 0000000000..5cd81b736c --- /dev/null +++ b/testsuites/validation/bsps/tr-fatal-sparc-leon3-clock-initialization.c @@ -0,0 +1,190 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup BspSparcLeon3ValFatalClockInitialization + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <bsp/fatal.h> +#include <bsp/leon3.h> +#include <rtems/irq-extension.h> +#include <rtems/sysinit.h> + +#include "tr-fatal-sparc-leon3-clock-initialization.h" + +#include <rtems/test.h> + +/** + * @defgroup BspSparcLeon3ValFatalClockInitialization \ + * spec:/bsp/sparc/leon3/val/fatal-clock-initialization + * + * @ingroup TestsuitesBspsFatalSparcLeon3ClockInitialization + * + * @brief Tests a fatal error. + * + * This test case performs the following actions: + * + * - The test action is carried out by the OccupyClockInterrupt() system + * initialization handler. + * + * - Check that the expected fatal source is present. + * + * - Check that the expected fatal code is present. + * + * @{ + */ + +/** + * @brief Test context for spec:/bsp/sparc/leon3/val/fatal-clock-initialization + * test case. + */ +typedef struct { + /** + * @brief This member contains a copy of the corresponding + * BspSparcLeon3ValFatalClockInitialization_Run() parameter. + */ + rtems_fatal_source source; + + /** + * @brief This member contains a copy of the corresponding + * BspSparcLeon3ValFatalClockInitialization_Run() parameter. + */ + rtems_fatal_code code; +} BspSparcLeon3ValFatalClockInitialization_Context; + +static BspSparcLeon3ValFatalClockInitialization_Context + BspSparcLeon3ValFatalClockInitialization_Instance; + +static void ClockInterrupt( void *arg ) +{ + (void) arg; +} + +static rtems_interrupt_entry interrupt_entry = RTEMS_INTERRUPT_ENTRY_INITIALIZER( + ClockInterrupt, + NULL, + "Clock" +); + +static void OccupyClockInterrupt( void ) +{ + rtems_vector_number vector; + + vector = GPTIMER_CONFIG_IRQ_GET( grlib_load_32( &LEON3_Timer_Regs->config ) ); + (void) rtems_interrupt_entry_install( + vector, + RTEMS_INTERRUPT_UNIQUE, + &interrupt_entry + ); +} + +RTEMS_SYSINIT_ITEM( + OccupyClockInterrupt, + RTEMS_SYSINIT_DEVICE_DRIVERS, + RTEMS_SYSINIT_ORDER_FIRST +); + +static T_fixture BspSparcLeon3ValFatalClockInitialization_Fixture = { + .setup = NULL, + .stop = NULL, + .teardown = NULL, + .scope = NULL, + .initial_context = &BspSparcLeon3ValFatalClockInitialization_Instance +}; + +/** + * @brief The test action is carried out by the OccupyClockInterrupt() system + * initialization handler. + */ +static void BspSparcLeon3ValFatalClockInitialization_Action_0( + BspSparcLeon3ValFatalClockInitialization_Context *ctx +) +{ + /* Nothing to do */ + + /* + * Check that the expected fatal source is present. + */ + T_step_eq_int( 0, ctx->source, RTEMS_FATAL_SOURCE_BSP ); + + /* + * Check that the expected fatal code is present. + */ + T_step_eq_ulong( + 1, + ctx->code, + LEON3_FATAL_CLOCK_INITIALIZATION + ); +} + +void BspSparcLeon3ValFatalClockInitialization_Run( + rtems_fatal_source source, + rtems_fatal_code code +) +{ + BspSparcLeon3ValFatalClockInitialization_Context *ctx; + + ctx = &BspSparcLeon3ValFatalClockInitialization_Instance; + ctx->source = source; + ctx->code = code; + + ctx = T_case_begin( + "BspSparcLeon3ValFatalClockInitialization", + &BspSparcLeon3ValFatalClockInitialization_Fixture + ); + + T_plan( 2 ); + + BspSparcLeon3ValFatalClockInitialization_Action_0( ctx ); + + T_case_end(); +} + +/** @} */ diff --git a/testsuites/validation/bsps/tr-fatal-sparc-leon3-clock-initialization.h b/testsuites/validation/bsps/tr-fatal-sparc-leon3-clock-initialization.h new file mode 100644 index 0000000000..6997b3f22c --- /dev/null +++ b/testsuites/validation/bsps/tr-fatal-sparc-leon3-clock-initialization.h @@ -0,0 +1,84 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup BspSparcLeon3ValFatalClockInitialization + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifndef _TR_FATAL_SPARC_LEON3_CLOCK_INITIALIZATION_H +#define _TR_FATAL_SPARC_LEON3_CLOCK_INITIALIZATION_H + +#include <rtems.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup BspSparcLeon3ValFatalClockInitialization + * + * @{ + */ + +/** + * @brief Runs the parameterized test case. + * + * @param source is fatal source. + * + * @param code is fatal code. + */ +void BspSparcLeon3ValFatalClockInitialization_Run( + rtems_fatal_source source, + rtems_fatal_code code +); + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif /* _TR_FATAL_SPARC_LEON3_CLOCK_INITIALIZATION_H */ diff --git a/testsuites/validation/bsps/ts-fatal-clock-xil-ttc-irq-install.c b/testsuites/validation/bsps/ts-fatal-clock-xil-ttc-irq-install.c new file mode 100644 index 0000000000..e5c1062348 --- /dev/null +++ b/testsuites/validation/bsps/ts-fatal-clock-xil-ttc-irq-install.c @@ -0,0 +1,79 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup TestsuitesBspsFatalClockXilTtcIrqInstall + */ + +/* + * Copyright (C) 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 + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "tr-fatal-clock-xil-ttc-irq-install.h" + +#include <rtems/test.h> + +/** + * @defgroup TestsuitesBspsFatalClockXilTtcIrqInstall \ + * spec:/testsuites/bsps/fatal-clock-xil-ttc-irq-install + * + * @ingroup RTEMSTestSuitesValidation + * + * @brief This validation test suite contains a test case which triggers a + * fatal error during system initialization. + * + * @{ + */ + +const char rtems_test_name[] = "TestsuitesBspsFatalClockXilTtcIrqInstall"; + +#define FATAL_SYSINIT_RUN DevClockXilTtcValFatalIrqInstall_Run + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#include "ts-fatal-sysinit.h" + +/** @} */ diff --git a/testsuites/validation/bsps/ts-fatal-sparc-leon3-cache-snooping-disabled-boot.c b/testsuites/validation/bsps/ts-fatal-sparc-leon3-cache-snooping-disabled-boot.c new file mode 100644 index 0000000000..53e18b5b0b --- /dev/null +++ b/testsuites/validation/bsps/ts-fatal-sparc-leon3-cache-snooping-disabled-boot.c @@ -0,0 +1,79 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup TestsuitesBspsFatalSparcLeon3CacheSnoopingDisabledBoot + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "tr-fatal-sparc-leon3-cache-snooping-disabled-boot.h" + +#include <rtems/test.h> + +/** + * @defgroup TestsuitesBspsFatalSparcLeon3CacheSnoopingDisabledBoot \ + * spec:/testsuites/bsps/fatal-sparc-leon3-cache-snooping-disabled-boot + * + * @ingroup RTEMSTestSuitesValidation + * + * @brief This validation test suite contains a test case which triggers a + * fatal error during system initialization. + * + * @{ + */ + +const char rtems_test_name[] = "TestsuitesBspsFatalSparcLeon3CacheSnoopingDisabledBoot"; + +#define FATAL_SYSINIT_RUN BspSparcLeon3ValFatalCacheSnoopingDisabledBoot_Run + +#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER + +#include "ts-fatal-sysinit.h" + +/** @} */ diff --git a/testsuites/validation/bsps/ts-fatal-sparc-leon3-cache-snooping-disabled-secondary.c b/testsuites/validation/bsps/ts-fatal-sparc-leon3-cache-snooping-disabled-secondary.c new file mode 100644 index 0000000000..3b8829dcf9 --- /dev/null +++ b/testsuites/validation/bsps/ts-fatal-sparc-leon3-cache-snooping-disabled-secondary.c @@ -0,0 +1,82 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup TestsuitesBspsFatalSparcLeon3CacheSnoopingDisabledSecondary + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "tr-fatal-sparc-leon3-cache-snooping-disabled-secondary.h" + +#include <rtems/test.h> + +/** + * @defgroup TestsuitesBspsFatalSparcLeon3CacheSnoopingDisabledSecondary \ + * spec:/testsuites/bsps/fatal-sparc-leon3-cache-snooping-disabled-secondary + * + * @ingroup RTEMSTestSuitesValidation + * + * @brief This validation test suite contains a test case which triggers a + * fatal error during system initialization. + * + * @{ + */ + +const char rtems_test_name[] = "TestsuitesBspsFatalSparcLeon3CacheSnoopingDisabledSecondary"; + +#define FATAL_SYSINIT_RUN \ + BspSparcLeon3ValFatalCacheSnoopingDisabledSecondary_Run + +#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER + +#define CONFIGURE_MAXIMUM_PROCESSORS 2 + +#include "ts-fatal-sysinit.h" + +/** @} */ diff --git a/testsuites/validation/bsps/ts-fatal-sparc-leon3-clock-initialization.c b/testsuites/validation/bsps/ts-fatal-sparc-leon3-clock-initialization.c new file mode 100644 index 0000000000..b75223537f --- /dev/null +++ b/testsuites/validation/bsps/ts-fatal-sparc-leon3-clock-initialization.c @@ -0,0 +1,79 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup TestsuitesBspsFatalSparcLeon3ClockInitialization + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "tr-fatal-sparc-leon3-clock-initialization.h" + +#include <rtems/test.h> + +/** + * @defgroup TestsuitesBspsFatalSparcLeon3ClockInitialization \ + * spec:/testsuites/bsps/fatal-sparc-leon3-clock-initialization + * + * @ingroup RTEMSTestSuitesValidation + * + * @brief This validation test suite contains a test case which triggers a + * fatal error during system initialization. + * + * @{ + */ + +const char rtems_test_name[] = "TestsuitesBspsFatalSparcLeon3ClockInitialization"; + +#define FATAL_SYSINIT_RUN BspSparcLeon3ValFatalClockInitialization_Run + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER + +#include "ts-fatal-sysinit.h" + +/** @} */ diff --git a/testsuites/validation/bsps/ts-fatal-sparc-leon3-shutdown-response.c b/testsuites/validation/bsps/ts-fatal-sparc-leon3-shutdown-response.c new file mode 100644 index 0000000000..d730b6d027 --- /dev/null +++ b/testsuites/validation/bsps/ts-fatal-sparc-leon3-shutdown-response.c @@ -0,0 +1,94 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup RTEMSTestSuiteTestsuitesFatalBspSparcLeon3ShutdownResponse + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems/score/smpimpl.h> + +#include "tr-fatal-sparc-leon3-shutdown-response.h" + +#include <rtems/test.h> + +/** + * @defgroup RTEMSTestSuiteTestsuitesFatalBspSparcLeon3ShutdownResponse \ + * spec:/testsuites/fatal-sparc-leon3-shutdown-response + * + * @ingroup RTEMSTestSuitesValidation + * + * @brief This validation test suite contains a test case which performs a + * system shutdown. + * + * @{ + */ + +const char rtems_test_name[] = "FatalBspSparcLeon3ShutdownResponse"; + +#define FATAL_SYSINIT_RUN BspSparcLeon3ValFatalShutdownResponse_Run + +static void FatalSysinitExit( rtems_fatal_code exit_code ) +{ + if ( exit_code == 0 ) { + rtems_fatal( RTEMS_FATAL_SOURCE_SMP, SMP_FATAL_SHUTDOWN ); + } else { + rtems_fatal( RTEMS_FATAL_SOURCE_EXIT, exit_code ); + } +} + +#define FATAL_SYSINIT_EXIT( exit_code ) FatalSysinitExit( exit_code ) + +#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER + +#define CONFIGURE_MAXIMUM_PROCESSORS 2 + +#include "ts-fatal-sysinit.h" + +/** @} */ diff --git a/testsuites/validation/bsps/ts-fatal-sparc-leon3-shutdown.c b/testsuites/validation/bsps/ts-fatal-sparc-leon3-shutdown.c new file mode 100644 index 0000000000..bc229e7824 --- /dev/null +++ b/testsuites/validation/bsps/ts-fatal-sparc-leon3-shutdown.c @@ -0,0 +1,177 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup TestsuitesBspsFatalSparcLeon3Shutdown + */ + +/* + * Copyright (C) 2021, 2022 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems.h> +#include <rtems/bspIo.h> +#include <rtems/test-info.h> +#include <rtems/test.h> +#include <rtems/testopts.h> +#include <rtems/score/smpimpl.h> + +#include "ts-config.h" +#include "tx-support.h" + +#include <rtems/test.h> + +/** + * @defgroup TestsuitesBspsFatalSparcLeon3Shutdown \ + * spec:/testsuites/bsps/fatal-sparc-leon3-shutdown + * + * @ingroup RTEMSTestSuitesValidation + * + * @brief This validation test suite provides an application configuration to + * perform a shutdown. + * + * @{ + */ + +const char rtems_test_name[] = "TestsuitesBspsFatalSparcLeon3Shutdown"; + +static char buffer[ 512 ]; + +static const T_action actions[] = { + T_report_hash_sha256 +}; + +static const T_config test_config = { + .name = rtems_test_name, + .buf = buffer, + .buf_size = sizeof( buffer ), + .putchar = rtems_put_char, + .verbosity = RTEMS_TEST_VERBOSITY, + .now = T_now_tick, + .allocate = T_memory_allocate, + .deallocate = T_memory_deallocate, + .action_count = T_ARRAY_SIZE( actions ), + .actions = actions +}; + +void __real__CPU_Fatal_halt( uint32_t source, CPU_Uint32ptr code ); + +void __wrap__CPU_Fatal_halt( uint32_t source, CPU_Uint32ptr code ); + +void __wrap__CPU_Fatal_halt( uint32_t source, CPU_Uint32ptr code ) +{ + int exit_code; + + T_register(); + exit_code = T_main( &test_config ); + + if ( exit_code == 0 ) { + rtems_test_end( rtems_test_name ); + } + +#if defined(RTEMS_GCOV_COVERAGE) + rtems_test_gcov_dump_info(); +#endif + __real__CPU_Fatal_halt( source, code ); +} + +#define CONFIGURE_APPLICATION_DOES_NOT_NEED_CLOCK_DRIVER + +#if defined(RTEMS_SMP) +#define CONFIGURE_MAXIMUM_PROCESSORS 2 + +#include <rtems/score/scheduleredfsmp.h> + +#define CONFIGURE_SCHEDULER_EDF_SMP + +#include <rtems/scheduler.h> + +RTEMS_SCHEDULER_EDF_SMP( a ); + +#define CONFIGURE_SCHEDULER_TABLE_ENTRIES \ + RTEMS_SCHEDULER_TABLE_EDF_SMP( a, TEST_SCHEDULER_A_NAME ) + +#define CONFIGURE_SCHEDULER_ASSIGNMENTS \ + RTEMS_SCHEDULER_ASSIGN( 0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY ), \ + RTEMS_SCHEDULER_ASSIGN( 0, RTEMS_SCHEDULER_ASSIGN_PROCESSOR_MANDATORY ) +#endif /* RTEMS_SMP */ + +#define CONFIGURE_MAXIMUM_FILE_DESCRIPTORS 0 + +#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1 + +#define CONFIGURE_DISABLE_NEWLIB_REENTRANCY + +#define CONFIGURE_APPLICATION_DISABLE_FILESYSTEM + +#define CONFIGURE_IDLE_TASK_STORAGE_SIZE RTEMS_MINIMUM_STACK_SIZE + +#define CONFIGURE_IDLE_TASK_INITIALIZES_APPLICATION + +static void *ShutdownIdleBody( uintptr_t arg ) +{ +#if defined(RTEMS_SMP) + if ( rtems_scheduler_get_processor() == 0 ) { + rtems_test_begin( rtems_test_name, TEST_STATE ); + rtems_fatal( RTEMS_FATAL_SOURCE_SMP, SMP_FATAL_SHUTDOWN ); + } + + return _CPU_Thread_Idle_body( arg ); +#else + rtems_test_begin( rtems_test_name, TEST_STATE ); + rtems_fatal( RTEMS_FATAL_SOURCE_APPLICATION, 123 ); +#endif +} + +#define CONFIGURE_IDLE_TASK_BODY ShutdownIdleBody + +#define CONFIGURE_INITIAL_EXTENSIONS { .fatal = FatalInitialExtension } + +#define CONFIGURE_INIT + +#include <rtems/confdefs.h> + +/** @} */ diff --git a/testsuites/validation/bsps/ts-validation-bsp-0.c b/testsuites/validation/bsps/ts-validation-bsp-0.c new file mode 100644 index 0000000000..c072c8fdf1 --- /dev/null +++ b/testsuites/validation/bsps/ts-validation-bsp-0.c @@ -0,0 +1,73 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup TestsuitesBspsValidationBsp0 + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems/test.h> + +/** + * @defgroup TestsuitesBspsValidationBsp0 \ + * spec:/testsuites/bsps/validation-bsp-0 + * + * @ingroup RTEMSTestSuitesValidation + * + * @brief This general purpose validation test suite provides enough resources + * to run target-specific tests. + * + * @{ + */ + +const char rtems_test_name[] = "TestsuitesBspsValidationBsp0"; + +#include "ts-default.h" + +/** @} */ diff --git a/testsuites/validation/tc-basedefs.c b/testsuites/validation/tc-basedefs.c index 94600f5241..835f76ec64 100644 --- a/testsuites/validation/tc-basedefs.c +++ b/testsuites/validation/tc-basedefs.c @@ -432,6 +432,12 @@ * - Checked that the RTEMS_ZERO_LENGTH_ARRAY macro produces a structure * similar to a structure with one element. * + * - Use the RTEMS_DEFINE_GLOBAL_SYMBOL() macro at the beginning of this file + * and assign the address of the symbol to an object. + * + * - Check that the RTEMS_DEFINE_GLOBAL_SYMBOL() macro defines a global + * symbol with the correct value. + * * @{ */ @@ -527,8 +533,18 @@ RTEMS_COMPILER_PURE_ATTRIBUTE static int compiler_pure_attribute_func( void ) return 21; } +static int global_symbol_base; + RTEMS_DEFINE_GLOBAL_SYMBOL( - GLOBAL_SYMBOL, GLOBAL_SYMBOL_VALULE( abc ) ); + GLOBAL_SYMBOL, + RTEMS_SYMBOL_NAME( global_symbol_base ) + GLOBAL_SYMBOL_VALULE( abc ) +); + +RTEMS_DECLARE_GLOBAL_SYMBOL( global_symbol_2 ); + +RTEMS_DEFINE_GLOBAL_SYMBOL( global_symbol_2, 0x123 ); + +static const char * const volatile global_symbol_2_object = global_symbol_2; static int deprecated_func( int i ) RTEMS_DEPRECATED; static int deprecated_func( int i ) @@ -1055,7 +1071,11 @@ static void RtemsBasedefsValBasedefs_Action_18( void ) * which is defined in a file different from the file in which the gobal * symbol is defined. */ - T_step_eq_int( 45, basedefs_get_global_symbol(), 0xabc ); + T_step_eq_uptr( + 45, + basedefs_get_global_symbol() - (uintptr_t) &global_symbol_base, + 0xabc + ); } /** @@ -1089,7 +1109,11 @@ static void RtemsBasedefsValBasedefs_Action_20( void ) * Check that the RTEMS_DEFINE_GLOBAL_SYMBOL() macro defines a global symbol * with the correct value. */ - T_step_eq_int( 49, (uintptr_t) global_symbol, 0xabc ); + T_step_eq_uptr( + 49, + (uintptr_t) global_symbol - (uintptr_t) &global_symbol_base, + 0xabc + ); } /** @@ -1926,11 +1950,26 @@ static void RtemsBasedefsValBasedefs_Action_55( void ) } /** + * @brief Use the RTEMS_DEFINE_GLOBAL_SYMBOL() macro at the beginning of this + * file and assign the address of the symbol to an object. + */ +static void RtemsBasedefsValBasedefs_Action_56( void ) +{ + /* No action */ + + /* + * Check that the RTEMS_DEFINE_GLOBAL_SYMBOL() macro defines a global symbol + * with the correct value. + */ + T_step_eq_uptr( 129, (uintptr_t) global_symbol_2_object, 0x123 ); +} + +/** * @fn void T_case_body_RtemsBasedefsValBasedefs( void ) */ T_TEST_CASE( RtemsBasedefsValBasedefs ) { - T_plan( 129 ); + T_plan( 130 ); RtemsBasedefsValBasedefs_Action_0(); RtemsBasedefsValBasedefs_Action_1(); @@ -1988,6 +2027,7 @@ T_TEST_CASE( RtemsBasedefsValBasedefs ) RtemsBasedefsValBasedefs_Action_53(); RtemsBasedefsValBasedefs_Action_54(); RtemsBasedefsValBasedefs_Action_55(); + RtemsBasedefsValBasedefs_Action_56(); } /** @} */ diff --git a/testsuites/validation/tc-clock-nanosleep.c b/testsuites/validation/tc-clock-nanosleep.c index 2e2d9e343c..514f5376ba 100644 --- a/testsuites/validation/tc-clock-nanosleep.c +++ b/testsuites/validation/tc-clock-nanosleep.c @@ -166,29 +166,29 @@ typedef struct { /** * @brief This member provides the scheduler operation records. */ - T_scheduler_log_4 scheduler_log;; + T_scheduler_log_4 scheduler_log; /** * @brief This member contains the CLOCK_REALTIME value before the * clock_nanosleep() call. */ - struct timespec now_realtime;; + struct timespec now_realtime; /** * @brief This member contains the CLOCK_MONOTONIC value before the * clock_nanosleep() call. */ - struct timespec now_monotonic;; + struct timespec now_monotonic; /** * @brief This member contains the worker task identifier. */ - rtems_id worker_id;; + rtems_id worker_id; /** * @brief This member contains the timer information of the worker task. */ - TaskTimerInfo timer_info;; + TaskTimerInfo timer_info; /** * @brief This member provides the object referenced by the ``rqtp`` diff --git a/testsuites/validation/tc-cpu-performance.c b/testsuites/validation/tc-cpu-performance.c new file mode 100644 index 0000000000..4f090e704f --- /dev/null +++ b/testsuites/validation/tc-cpu-performance.c @@ -0,0 +1,270 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup ScoreCpuValPerf + */ + +/* + * Copyright (C) 2023 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems/score/cpuimpl.h> + +#include "tx-support.h" + +#include <rtems/test.h> + +/** + * @defgroup ScoreCpuValPerf spec:/score/cpu/val/perf + * + * @ingroup TestsuitesPerformanceNoClock0 + * + * @brief This test case provides a context to run CPU port performance tests. + * + * @{ + */ + +/** + * @brief Test context for spec:/score/cpu/val/perf test case. + */ +typedef struct { + /** + * @brief This member references the measure runtime context. + */ + T_measure_runtime_context *context; + + /** + * @brief This member provides the measure runtime request. + */ + T_measure_runtime_request request; + + /** + * @brief This member provides an optional measurement begin time point. + */ + T_ticks begin; + + /** + * @brief This member provides an optional measurement end time point. + */ + T_ticks end; +} ScoreCpuValPerf_Context; + +static ScoreCpuValPerf_Context + ScoreCpuValPerf_Instance; + +static void ScoreCpuValPerf_Setup_Context( ScoreCpuValPerf_Context *ctx ) +{ + T_measure_runtime_config config; + + memset( &config, 0, sizeof( config ) ); + config.sample_count = 100; + ctx->request.arg = ctx; + ctx->request.flags = T_MEASURE_RUNTIME_REPORT_SAMPLES; + ctx->context = T_measure_runtime_create( &config ); + T_assert_not_null( ctx->context ); +} + +static void ScoreCpuValPerf_Setup_Wrap( void *arg ) +{ + ScoreCpuValPerf_Context *ctx; + + ctx = arg; + ScoreCpuValPerf_Setup_Context( ctx ); +} + +static T_fixture ScoreCpuValPerf_Fixture = { + .setup = ScoreCpuValPerf_Setup_Wrap, + .stop = NULL, + .teardown = NULL, + .scope = NULL, + .initial_context = &ScoreCpuValPerf_Instance +}; + +/** + * @defgroup ScoreCpuReqPerfEmpty spec:/score/cpu/req/perf-empty + * + * @{ + */ + +/** + * @brief Do nothing and just return. + */ +static void ScoreCpuReqPerfEmpty_Body( ScoreCpuValPerf_Context *ctx ) +{ + /* No code */ +} + +static void ScoreCpuReqPerfEmpty_Body_Wrap( void *arg ) +{ + ScoreCpuValPerf_Context *ctx; + + ctx = arg; + ScoreCpuReqPerfEmpty_Body( ctx ); +} + +/** + * @brief Discard samples interrupted by a clock tick. + */ +static bool ScoreCpuReqPerfEmpty_Teardown( + ScoreCpuValPerf_Context *ctx, + T_ticks *delta, + uint32_t tic, + uint32_t toc, + unsigned int retry +) +{ + return tic == toc; +} + +static bool ScoreCpuReqPerfEmpty_Teardown_Wrap( + void *arg, + T_ticks *delta, + uint32_t tic, + uint32_t toc, + unsigned int retry +) +{ + ScoreCpuValPerf_Context *ctx; + + ctx = arg; + return ScoreCpuReqPerfEmpty_Teardown( ctx, delta, tic, toc, retry ); +} + +/** @} */ + +/** + * @defgroup ScoreCpuReqPerfNops spec:/score/cpu/req/perf-nops + * + * @{ + */ + +/** + * @brief Execute exactly 1000 no-operation instructions. + */ +static void ScoreCpuReqPerfNops_Body( ScoreCpuValPerf_Context *ctx ) +{ + #define NOPS_10 \ + _CPU_Instruction_no_operation(); _CPU_Instruction_no_operation(); \ + _CPU_Instruction_no_operation(); _CPU_Instruction_no_operation(); \ + _CPU_Instruction_no_operation(); _CPU_Instruction_no_operation(); \ + _CPU_Instruction_no_operation(); _CPU_Instruction_no_operation(); \ + _CPU_Instruction_no_operation(); _CPU_Instruction_no_operation(); + #define NOPS_100 NOPS_10 NOPS_10 NOPS_10 NOPS_10 NOPS_10 NOPS_10 NOPS_10 \ + NOPS_10 NOPS_10 NOPS_10 + NOPS_100 + NOPS_100 + NOPS_100 + NOPS_100 + NOPS_100 + NOPS_100 + NOPS_100 + NOPS_100 + NOPS_100 + NOPS_100 +} + +static void ScoreCpuReqPerfNops_Body_Wrap( void *arg ) +{ + ScoreCpuValPerf_Context *ctx; + + ctx = arg; + ScoreCpuReqPerfNops_Body( ctx ); +} + +/** + * @brief Discard samples interrupted by a clock tick. + */ +static bool ScoreCpuReqPerfNops_Teardown( + ScoreCpuValPerf_Context *ctx, + T_ticks *delta, + uint32_t tic, + uint32_t toc, + unsigned int retry +) +{ + return tic == toc; +} + +static bool ScoreCpuReqPerfNops_Teardown_Wrap( + void *arg, + T_ticks *delta, + uint32_t tic, + uint32_t toc, + unsigned int retry +) +{ + ScoreCpuValPerf_Context *ctx; + + ctx = arg; + return ScoreCpuReqPerfNops_Teardown( ctx, delta, tic, toc, retry ); +} + +/** @} */ + +/** + * @fn void T_case_body_ScoreCpuValPerf( void ) + */ +T_TEST_CASE_FIXTURE( ScoreCpuValPerf, &ScoreCpuValPerf_Fixture ) +{ + ScoreCpuValPerf_Context *ctx; + + ctx = T_fixture_context(); + + ctx->request.name = "ScoreCpuReqPerfEmpty"; + ctx->request.setup = NULL; + ctx->request.body = ScoreCpuReqPerfEmpty_Body_Wrap; + ctx->request.teardown = ScoreCpuReqPerfEmpty_Teardown_Wrap; + T_measure_runtime( ctx->context, &ctx->request ); + + ctx->request.name = "ScoreCpuReqPerfNops"; + ctx->request.setup = NULL; + ctx->request.body = ScoreCpuReqPerfNops_Body_Wrap; + ctx->request.teardown = ScoreCpuReqPerfNops_Teardown_Wrap; + T_measure_runtime( ctx->context, &ctx->request ); +} + +/** @} */ diff --git a/testsuites/validation/tc-dev-clock-xil-ttc.c b/testsuites/validation/tc-dev-clock-xil-ttc.c new file mode 100644 index 0000000000..70f49a4cc6 --- /dev/null +++ b/testsuites/validation/tc-dev-clock-xil-ttc.c @@ -0,0 +1,136 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup DevClockXilTtcValTickCatchUp + */ + +/* + * Copyright (C) 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 + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems.h> +#include <sys/time.h> + +#include <rtems/test.h> + +/** + * @defgroup DevClockXilTtcValTickCatchUp \ + * spec:/dev/clock/xil-ttc/val/tick-catch-up + * + * @ingroup TestsuitesBspsValidationBsp0 + * + * @brief Tests some Xilinx TTC clock driver functions. + * + * This test case performs the following actions: + * + * - Synchronize with the clock tick. Disable interrupts. Busy wait three + * clock tick intervals. Enable interrupts. + * + * - Check that exactly three clock ticks happened once interrupts are + * enabled again. + * + * @{ + */ + +/** + * @brief Synchronize with the clock tick. Disable interrupts. Busy wait + * three clock tick intervals. Enable interrupts. + */ +static void DevClockXilTtcValTickCatchUp_Action_0( void ) +{ + uint32_t ns_per_tick; + uint64_t three_ticks_interval; + rtems_interrupt_level level; + rtems_interval t_0; + rtems_interval t_1; + rtems_interval t_2; + uint64_t m_0; + uint64_t m_1; + + ns_per_tick = rtems_configuration_get_nanoseconds_per_tick(); + three_ticks_interval = ( 7 * (uint64_t) nstosbt( ns_per_tick ) ) / 2; + t_0 = rtems_clock_get_ticks_since_boot(); + + /* Synchronize with clock tick */ + do { + t_1 = rtems_clock_get_ticks_since_boot(); + m_0 = (uint64_t) rtems_clock_get_monotonic_sbintime(); + } while ( t_0 == t_1 ); + + rtems_interrupt_local_disable( level ); + + do { + m_1 = (uint64_t) rtems_clock_get_monotonic_sbintime(); + } while ( m_1 - m_0 <= three_ticks_interval ); + + rtems_interrupt_local_enable( level ); + + /* + * Make sure the clock interrupt was serviced after the interrupt enable. + */ + do { + t_2 = rtems_clock_get_ticks_since_boot(); + } while ( t_1 == t_2 ); + + /* + * Check that exactly three clock ticks happened once interrupts are enabled + * again. + */ + T_step_eq_u32( 0, t_2 - t_1, 3 ); +} + +/** + * @fn void T_case_body_DevClockXilTtcValTickCatchUp( void ) + */ +T_TEST_CASE( DevClockXilTtcValTickCatchUp ) +{ + T_plan( 1 ); + + DevClockXilTtcValTickCatchUp_Action_0(); +} + +/** @} */ diff --git a/testsuites/validation/tc-dev-grlib-apbuart-inbyte-nonblocking.c b/testsuites/validation/tc-dev-grlib-apbuart-inbyte-nonblocking.c new file mode 100644 index 0000000000..b33b6f1a25 --- /dev/null +++ b/testsuites/validation/tc-dev-grlib-apbuart-inbyte-nonblocking.c @@ -0,0 +1,348 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup DevGrlibReqApbuartInbyteNonblocking + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> +#include <grlib/apbuart.h> + +#include <rtems/test.h> + +/** + * @defgroup DevGrlibReqApbuartInbyteNonblocking \ + * spec:/dev/grlib/req/apbuart-inbyte-nonblocking + * + * @ingroup TestsuitesBspsValidationBsp0 + * + * @{ + */ + +typedef enum { + DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady_Yes, + DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady_No, + DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady_NA +} DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady; + +typedef enum { + DevGrlibReqApbuartInbyteNonblocking_Post_Result_Data, + DevGrlibReqApbuartInbyteNonblocking_Post_Result_MinusOne, + DevGrlibReqApbuartInbyteNonblocking_Post_Result_NA +} DevGrlibReqApbuartInbyteNonblocking_Post_Result; + +typedef enum { + DevGrlibReqApbuartInbyteNonblocking_Post_ErrorFlags_Cleared, + DevGrlibReqApbuartInbyteNonblocking_Post_ErrorFlags_NA +} DevGrlibReqApbuartInbyteNonblocking_Post_ErrorFlags; + +typedef struct { + uint8_t Skip : 1; + uint8_t Pre_DataReady_NA : 1; + uint8_t Post_Result : 2; + uint8_t Post_ErrorFlags : 1; +} DevGrlibReqApbuartInbyteNonblocking_Entry; + +/** + * @brief Test context for spec:/dev/grlib/req/apbuart-inbyte-nonblocking test + * case. + */ +typedef struct { + /** + * @brief This member provides the APBUART register block. + */ + apbuart regs; + + /** + * @brief This member contains the return value of the + * apbuart_inbyte_nonblocking() call. + */ + int result; + + struct { + /** + * @brief This member defines the pre-condition states for the next action. + */ + size_t pcs[ 1 ]; + + /** + * @brief If this member is true, then the test action loop is executed. + */ + bool in_action_loop; + + /** + * @brief This member contains the next transition map index. + */ + size_t index; + + /** + * @brief This member contains the current transition map entry. + */ + DevGrlibReqApbuartInbyteNonblocking_Entry entry; + + /** + * @brief If this member is true, then the current transition variant + * should be skipped. + */ + bool skip; + } Map; +} DevGrlibReqApbuartInbyteNonblocking_Context; + +static DevGrlibReqApbuartInbyteNonblocking_Context + DevGrlibReqApbuartInbyteNonblocking_Instance; + +static const char * const DevGrlibReqApbuartInbyteNonblocking_PreDesc_DataReady[] = { + "Yes", + "No", + "NA" +}; + +static const char * const * const DevGrlibReqApbuartInbyteNonblocking_PreDesc[] = { + DevGrlibReqApbuartInbyteNonblocking_PreDesc_DataReady, + NULL +}; + +static void DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady_Prepare( + DevGrlibReqApbuartInbyteNonblocking_Context *ctx, + DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady state +) +{ + switch ( state ) { + case DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady_Yes: { + /* + * While the data ready flag is set in the status register of the + * register block specified by ``regs`` parameter. + */ + ctx->regs.status |= APBUART_STATUS_DR; + break; + } + + case DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady_No: { + /* + * While the data ready flag is cleared in the status register of the + * register block specified by ``regs`` parameter. + */ + ctx->regs.status &= ~APBUART_STATUS_DR; + break; + } + + case DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady_NA: + break; + } +} + +static void DevGrlibReqApbuartInbyteNonblocking_Post_Result_Check( + DevGrlibReqApbuartInbyteNonblocking_Context *ctx, + DevGrlibReqApbuartInbyteNonblocking_Post_Result state +) +{ + switch ( state ) { + case DevGrlibReqApbuartInbyteNonblocking_Post_Result_Data: { + /* + * The return value of apbuart_inbyte_nonblocking() shall be the data + * read from the data register of the register block specified by + * ``regs``. + */ + T_eq_int( ctx->result, 0xff ); + break; + } + + case DevGrlibReqApbuartInbyteNonblocking_Post_Result_MinusOne: { + /* + * The return value of apbuart_inbyte_nonblocking() shall be minus one. + */ + T_eq_int( ctx->result, -1 ); + break; + } + + case DevGrlibReqApbuartInbyteNonblocking_Post_Result_NA: + break; + } +} + +static void DevGrlibReqApbuartInbyteNonblocking_Post_ErrorFlags_Check( + DevGrlibReqApbuartInbyteNonblocking_Context *ctx, + DevGrlibReqApbuartInbyteNonblocking_Post_ErrorFlags state +) +{ + switch ( state ) { + case DevGrlibReqApbuartInbyteNonblocking_Post_ErrorFlags_Cleared: { + /* + * The framing error, parity error, overrun, and break received flags in + * the status register of the register block specified by ``regs`` shall + * be cleared. + */ + T_eq_u32( ctx->regs.status & 0x78, 0 ); + break; + } + + case DevGrlibReqApbuartInbyteNonblocking_Post_ErrorFlags_NA: + break; + } +} + +static void DevGrlibReqApbuartInbyteNonblocking_Prepare( + DevGrlibReqApbuartInbyteNonblocking_Context *ctx +) +{ + memset( &ctx->regs, 0, sizeof( ctx->regs ) ); + ctx->regs.status = 0x78; + ctx->regs.data = 0xff; +} + +static void DevGrlibReqApbuartInbyteNonblocking_Action( + DevGrlibReqApbuartInbyteNonblocking_Context *ctx +) +{ + ctx->result = apbuart_inbyte_nonblocking( &ctx->regs ); +} + +static const DevGrlibReqApbuartInbyteNonblocking_Entry +DevGrlibReqApbuartInbyteNonblocking_Entries[] = { + { 0, 0, DevGrlibReqApbuartInbyteNonblocking_Post_Result_Data, + DevGrlibReqApbuartInbyteNonblocking_Post_ErrorFlags_Cleared }, + { 0, 0, DevGrlibReqApbuartInbyteNonblocking_Post_Result_MinusOne, + DevGrlibReqApbuartInbyteNonblocking_Post_ErrorFlags_Cleared } +}; + +static const uint8_t +DevGrlibReqApbuartInbyteNonblocking_Map[] = { + 0, 1 +}; + +static size_t DevGrlibReqApbuartInbyteNonblocking_Scope( + void *arg, + char *buf, + size_t n +) +{ + DevGrlibReqApbuartInbyteNonblocking_Context *ctx; + + ctx = arg; + + if ( ctx->Map.in_action_loop ) { + return T_get_scope( + DevGrlibReqApbuartInbyteNonblocking_PreDesc, + buf, + n, + ctx->Map.pcs + ); + } + + return 0; +} + +static T_fixture DevGrlibReqApbuartInbyteNonblocking_Fixture = { + .setup = NULL, + .stop = NULL, + .teardown = NULL, + .scope = DevGrlibReqApbuartInbyteNonblocking_Scope, + .initial_context = &DevGrlibReqApbuartInbyteNonblocking_Instance +}; + +static inline DevGrlibReqApbuartInbyteNonblocking_Entry +DevGrlibReqApbuartInbyteNonblocking_PopEntry( + DevGrlibReqApbuartInbyteNonblocking_Context *ctx +) +{ + size_t index; + + index = ctx->Map.index; + ctx->Map.index = index + 1; + return DevGrlibReqApbuartInbyteNonblocking_Entries[ + DevGrlibReqApbuartInbyteNonblocking_Map[ index ] + ]; +} + +static void DevGrlibReqApbuartInbyteNonblocking_TestVariant( + DevGrlibReqApbuartInbyteNonblocking_Context *ctx +) +{ + DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady_Prepare( + ctx, + ctx->Map.pcs[ 0 ] + ); + DevGrlibReqApbuartInbyteNonblocking_Action( ctx ); + DevGrlibReqApbuartInbyteNonblocking_Post_Result_Check( + ctx, + ctx->Map.entry.Post_Result + ); + DevGrlibReqApbuartInbyteNonblocking_Post_ErrorFlags_Check( + ctx, + ctx->Map.entry.Post_ErrorFlags + ); +} + +/** + * @fn void T_case_body_DevGrlibReqApbuartInbyteNonblocking( void ) + */ +T_TEST_CASE_FIXTURE( + DevGrlibReqApbuartInbyteNonblocking, + &DevGrlibReqApbuartInbyteNonblocking_Fixture +) +{ + DevGrlibReqApbuartInbyteNonblocking_Context *ctx; + + ctx = T_fixture_context(); + ctx->Map.in_action_loop = true; + ctx->Map.index = 0; + + for ( + ctx->Map.pcs[ 0 ] = DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady_Yes; + ctx->Map.pcs[ 0 ] < DevGrlibReqApbuartInbyteNonblocking_Pre_DataReady_NA; + ++ctx->Map.pcs[ 0 ] + ) { + ctx->Map.entry = DevGrlibReqApbuartInbyteNonblocking_PopEntry( ctx ); + DevGrlibReqApbuartInbyteNonblocking_Prepare( ctx ); + DevGrlibReqApbuartInbyteNonblocking_TestVariant( ctx ); + } +} + +/** @} */ diff --git a/testsuites/validation/tc-dev-grlib-io.c b/testsuites/validation/tc-dev-grlib-io.c new file mode 100644 index 0000000000..5bfc3fcfab --- /dev/null +++ b/testsuites/validation/tc-dev-grlib-io.c @@ -0,0 +1,295 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup DevGrlibValIo + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <string.h> +#include <grlib/apbuart.h> +#include <grlib/io.h> + +#include "tx-support.h" + +#include <rtems/test.h> + +/** + * @defgroup DevGrlibValIo spec:/dev/grlib/val/io + * + * @ingroup TestsuitesBspsValidationBsp0 + * + * @brief Tests some @ref RTEMSDeviceGRLIB directives. + * + * This test case performs the following actions: + * + * - Call grlib_load_8() to load a prepared value. + * + * - Check that the returned value is equal to the prepared value. + * + * - Call grlib_load_16() to load a prepared value. + * + * - Check that the returned value is equal to the prepared value. + * + * - Call grlib_load_32() to load a prepared value. + * + * - Check that the returned value is equal to the prepared value. + * + * - Call grlib_load_64() to load a prepared value. + * + * - Check that the returned value is equal to the prepared value. + * + * - Call grlib_store_8() to store a value to an object. + * + * - Check that the value of the object is equal to the stored value. + * + * - Call grlib_store_16() to store a value to an object. + * + * - Check that the value of the object is equal to the stored value. + * + * - Call grlib_store_32() to store a value to an object. + * + * - Check that the value of the object is equal to the stored value. + * + * - Call grlib_store_64() to store a value to an object. + * + * - Check that the value of the object is equal to the stored value. + * + * - Call apbuart_outbyte_polled() to store a character to the data register. + * The transmitter FIFO shall be initially non-empty. The status is checked + * by apbuart_outbyte_wait(). + * + * - Check that the transmitter FIFO empty flag was set by ApbuartIORelax(). + * + * - Check that the data register was written by apbuart_outbyte_polled(). + * + * @{ + */ + +static void ApbuartIORelax( void *arg ) +{ + apbuart *regs; + + regs = arg; + regs->status = 0x4; + T_quiet_eq_u32( regs->data, 0 ); +} + +/** + * @brief Call grlib_load_8() to load a prepared value. + */ +static void DevGrlibValIo_Action_0( void ) +{ + uint8_t reg_8; + uint8_t val_8; + + reg_8 = 0x81; + val_8 = grlib_load_8( ®_8 ); + + /* + * Check that the returned value is equal to the prepared value. + */ + T_step_eq_u8( 0, val_8, 0x81 ); +} + +/** + * @brief Call grlib_load_16() to load a prepared value. + */ +static void DevGrlibValIo_Action_1( void ) +{ + uint16_t reg_16; + uint16_t val_16; + + reg_16 = 0x8001; + val_16 = grlib_load_16( ®_16 ); + + /* + * Check that the returned value is equal to the prepared value. + */ + T_step_eq_u16( 1, val_16, 0x8001 ); +} + +/** + * @brief Call grlib_load_32() to load a prepared value. + */ +static void DevGrlibValIo_Action_2( void ) +{ + uint32_t reg_32; + uint32_t val_32; + + reg_32 = 0x80000001; + val_32 = grlib_load_32( ®_32 ); + + /* + * Check that the returned value is equal to the prepared value. + */ + T_step_eq_u32( 2, val_32, 0x80000001 ); +} + +/** + * @brief Call grlib_load_64() to load a prepared value. + */ +static void DevGrlibValIo_Action_3( void ) +{ + uint64_t reg_64; + uint64_t val_64; + + reg_64 = 0x8000000000000001; + val_64 = grlib_load_64( ®_64 ); + + /* + * Check that the returned value is equal to the prepared value. + */ + T_step_eq_u64( 3, val_64, 0x8000000000000001 ); +} + +/** + * @brief Call grlib_store_8() to store a value to an object. + */ +static void DevGrlibValIo_Action_4( void ) +{ + uint8_t reg_8; + + grlib_store_8( ®_8, 0x81 ); + + /* + * Check that the value of the object is equal to the stored value. + */ + T_step_eq_u8( 4, reg_8, 0x81 ); +} + +/** + * @brief Call grlib_store_16() to store a value to an object. + */ +static void DevGrlibValIo_Action_5( void ) +{ + uint16_t reg_16; + + grlib_store_16( ®_16, 0x8001 ); + + /* + * Check that the value of the object is equal to the stored value. + */ + T_step_eq_u16( 5, reg_16, 0x8001 ); +} + +/** + * @brief Call grlib_store_32() to store a value to an object. + */ +static void DevGrlibValIo_Action_6( void ) +{ + uint32_t reg_32; + + grlib_store_32( ®_32, 0x80000001 ); + + /* + * Check that the value of the object is equal to the stored value. + */ + T_step_eq_u32( 6, reg_32, 0x80000001 ); +} + +/** + * @brief Call grlib_store_64() to store a value to an object. + */ +static void DevGrlibValIo_Action_7( void ) +{ + uint64_t reg_64; + + grlib_store_64( ®_64, 0x8000000000000001 ); + + /* + * Check that the value of the object is equal to the stored value. + */ + T_step_eq_u64( 7, reg_64, 0x8000000000000001 ); +} + +/** + * @brief Call apbuart_outbyte_polled() to store a character to the data + * register. The transmitter FIFO shall be initially non-empty. The status + * is checked by apbuart_outbyte_wait(). + */ +static void DevGrlibValIo_Action_8( void ) +{ + apbuart regs; + + memset( ®s, 0, sizeof( regs ) ); + SetIORelaxHandler( ApbuartIORelax, ®s ); + apbuart_outbyte_polled( ®s, (char) 0xff ); + SetIORelaxHandler( NULL, NULL ); + + /* + * Check that the transmitter FIFO empty flag was set by ApbuartIORelax(). + */ + T_step_eq_u32( 8, regs.status, APBUART_STATUS_TE ); + + /* + * Check that the data register was written by apbuart_outbyte_polled(). + */ + T_step_eq_u32( 9, regs.data, 0xff ); +} + +/** + * @fn void T_case_body_DevGrlibValIo( void ) + */ +T_TEST_CASE( DevGrlibValIo ) +{ + T_plan( 10 ); + + DevGrlibValIo_Action_0(); + DevGrlibValIo_Action_1(); + DevGrlibValIo_Action_2(); + DevGrlibValIo_Action_3(); + DevGrlibValIo_Action_4(); + DevGrlibValIo_Action_5(); + DevGrlibValIo_Action_6(); + DevGrlibValIo_Action_7(); + DevGrlibValIo_Action_8(); +} + +/** @} */ diff --git a/testsuites/validation/tc-dev-grlib-irqamp-get-timestamp.c b/testsuites/validation/tc-dev-grlib-irqamp-get-timestamp.c new file mode 100644 index 0000000000..a064c479b9 --- /dev/null +++ b/testsuites/validation/tc-dev-grlib-irqamp-get-timestamp.c @@ -0,0 +1,304 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup DevGrlibReqIrqampGetTimestamp + */ + +/* + * Copyright (C) 2021 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <grlib/irqamp.h> + +#include <rtems/test.h> + +/** + * @defgroup DevGrlibReqIrqampGetTimestamp \ + * spec:/dev/grlib/req/irqamp-get-timestamp + * + * @ingroup TestsuitesBspsValidationBsp0 + * + * @{ + */ + +typedef enum { + DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets_Zero, + DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets_Positive, + DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets_NA +} DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets; + +typedef enum { + DevGrlibReqIrqampGetTimestamp_Post_Result_Registers, + DevGrlibReqIrqampGetTimestamp_Post_Result_Null, + DevGrlibReqIrqampGetTimestamp_Post_Result_NA +} DevGrlibReqIrqampGetTimestamp_Post_Result; + +typedef struct { + uint8_t Skip : 1; + uint8_t Pre_NumberOfTimestampRegisterSets_NA : 1; + uint8_t Post_Result : 2; +} DevGrlibReqIrqampGetTimestamp_Entry; + +/** + * @brief Test context for spec:/dev/grlib/req/irqamp-get-timestamp test case. + */ +typedef struct { + /** + * @brief This member contains the return value of the + * irqamp_get_timestamp_registers() call. + */ + irqamp_timestamp *result; + + /** + * @brief This member contains the IRQ(A)MP register block. + */ + irqamp irqamp_regs; + + struct { + /** + * @brief This member defines the pre-condition states for the next action. + */ + size_t pcs[ 1 ]; + + /** + * @brief If this member is true, then the test action loop is executed. + */ + bool in_action_loop; + + /** + * @brief This member contains the next transition map index. + */ + size_t index; + + /** + * @brief This member contains the current transition map entry. + */ + DevGrlibReqIrqampGetTimestamp_Entry entry; + + /** + * @brief If this member is true, then the current transition variant + * should be skipped. + */ + bool skip; + } Map; +} DevGrlibReqIrqampGetTimestamp_Context; + +static DevGrlibReqIrqampGetTimestamp_Context + DevGrlibReqIrqampGetTimestamp_Instance; + +static const char * const DevGrlibReqIrqampGetTimestamp_PreDesc_NumberOfTimestampRegisterSets[] = { + "Zero", + "Positive", + "NA" +}; + +static const char * const * const DevGrlibReqIrqampGetTimestamp_PreDesc[] = { + DevGrlibReqIrqampGetTimestamp_PreDesc_NumberOfTimestampRegisterSets, + NULL +}; + +static void +DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets_Prepare( + DevGrlibReqIrqampGetTimestamp_Context *ctx, + DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets state +) +{ + switch ( state ) { + case DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets_Zero: { + /* + * While the number of timestamp register sets indicated by the IRQ(A)MP + * register block specified by the ``irqamp_regs`` parameter is zero. + */ + ctx->irqamp_regs.itstmp[ 0 ].itstmpc = 0; + break; + } + + case DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets_Positive: { + /* + * While the number of timestamp register sets indicated by the IRQ(A)MP + * register block specified by the ``irqamp_regs`` parameter is positive. + */ + ctx->irqamp_regs.itstmp[ 0 ].itstmpc = IRQAMP_ITSTMPC_TSTAMP( 1 ); + break; + } + + case DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets_NA: + break; + } +} + +static void DevGrlibReqIrqampGetTimestamp_Post_Result_Check( + DevGrlibReqIrqampGetTimestamp_Context *ctx, + DevGrlibReqIrqampGetTimestamp_Post_Result state +) +{ + switch ( state ) { + case DevGrlibReqIrqampGetTimestamp_Post_Result_Registers: { + /* + * The return value of irqamp_get_timestamp_registers() shall be address + * of the timestamping register block contained in the IRQ(A)MP register + * block specified by the ``irqamp_regs`` parameter. + */ + T_not_null( ctx->result ); + break; + } + + case DevGrlibReqIrqampGetTimestamp_Post_Result_Null: { + /* + * The return value of irqamp_get_timestamp_registers() shall be false. + */ + T_null( ctx->result ); + break; + } + + case DevGrlibReqIrqampGetTimestamp_Post_Result_NA: + break; + } +} + +static void DevGrlibReqIrqampGetTimestamp_Action( + DevGrlibReqIrqampGetTimestamp_Context *ctx +) +{ + ctx->result = irqamp_get_timestamp_registers( &ctx->irqamp_regs ); +} + +static const DevGrlibReqIrqampGetTimestamp_Entry +DevGrlibReqIrqampGetTimestamp_Entries[] = { + { 0, 0, DevGrlibReqIrqampGetTimestamp_Post_Result_Null }, + { 0, 0, DevGrlibReqIrqampGetTimestamp_Post_Result_Registers } +}; + +static const uint8_t +DevGrlibReqIrqampGetTimestamp_Map[] = { + 0, 1 +}; + +static size_t DevGrlibReqIrqampGetTimestamp_Scope( + void *arg, + char *buf, + size_t n +) +{ + DevGrlibReqIrqampGetTimestamp_Context *ctx; + + ctx = arg; + + if ( ctx->Map.in_action_loop ) { + return T_get_scope( + DevGrlibReqIrqampGetTimestamp_PreDesc, + buf, + n, + ctx->Map.pcs + ); + } + + return 0; +} + +static T_fixture DevGrlibReqIrqampGetTimestamp_Fixture = { + .setup = NULL, + .stop = NULL, + .teardown = NULL, + .scope = DevGrlibReqIrqampGetTimestamp_Scope, + .initial_context = &DevGrlibReqIrqampGetTimestamp_Instance +}; + +static inline DevGrlibReqIrqampGetTimestamp_Entry +DevGrlibReqIrqampGetTimestamp_PopEntry( + DevGrlibReqIrqampGetTimestamp_Context *ctx +) +{ + size_t index; + + index = ctx->Map.index; + ctx->Map.index = index + 1; + return DevGrlibReqIrqampGetTimestamp_Entries[ + DevGrlibReqIrqampGetTimestamp_Map[ index ] + ]; +} + +static void DevGrlibReqIrqampGetTimestamp_TestVariant( + DevGrlibReqIrqampGetTimestamp_Context *ctx +) +{ + DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets_Prepare( + ctx, + ctx->Map.pcs[ 0 ] + ); + DevGrlibReqIrqampGetTimestamp_Action( ctx ); + DevGrlibReqIrqampGetTimestamp_Post_Result_Check( + ctx, + ctx->Map.entry.Post_Result + ); +} + +/** + * @fn void T_case_body_DevGrlibReqIrqampGetTimestamp( void ) + */ +T_TEST_CASE_FIXTURE( + DevGrlibReqIrqampGetTimestamp, + &DevGrlibReqIrqampGetTimestamp_Fixture +) +{ + DevGrlibReqIrqampGetTimestamp_Context *ctx; + + ctx = T_fixture_context(); + ctx->Map.in_action_loop = true; + ctx->Map.index = 0; + + for ( + ctx->Map.pcs[ 0 ] = DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets_Zero; + ctx->Map.pcs[ 0 ] < DevGrlibReqIrqampGetTimestamp_Pre_NumberOfTimestampRegisterSets_NA; + ++ctx->Map.pcs[ 0 ] + ) { + ctx->Map.entry = DevGrlibReqIrqampGetTimestamp_PopEntry( ctx ); + DevGrlibReqIrqampGetTimestamp_TestVariant( ctx ); + } +} + +/** @} */ diff --git a/testsuites/validation/tc-futex-wait.c b/testsuites/validation/tc-futex-wait.c index 700ee74636..3730df2a40 100644 --- a/testsuites/validation/tc-futex-wait.c +++ b/testsuites/validation/tc-futex-wait.c @@ -101,7 +101,7 @@ typedef struct { /** * @brief This member contains the thread queue test context. */ - TQContext tq_ctx;; + TQContext tq_ctx; /** * @brief This member specifies the expected futex state value. diff --git a/testsuites/validation/tc-futex-wake.c b/testsuites/validation/tc-futex-wake.c index 67d5f8a4f0..baaa0daa6b 100644 --- a/testsuites/validation/tc-futex-wake.c +++ b/testsuites/validation/tc-futex-wake.c @@ -100,7 +100,7 @@ typedef struct { /** * @brief This member contains the thread queue test context. */ - TQContext tq_ctx;; + TQContext tq_ctx; /** * @brief This member provides the futex object. diff --git a/testsuites/validation/tc-intr-entry-install.c b/testsuites/validation/tc-intr-entry-install.c index 2a78681346..58c7989dbe 100644 --- a/testsuites/validation/tc-intr-entry-install.c +++ b/testsuites/validation/tc-intr-entry-install.c @@ -180,7 +180,7 @@ typedef struct { /** * @brief This member provides a counter snapshot for each entry. */ - uint32_t counter_by_entry[ 3 ];; + uint32_t counter_by_entry[ 3 ]; /** * @brief This member provides the vector number of a testable interrupt @@ -272,7 +272,7 @@ typedef struct { /** * @brief This member specifies if the ``entry`` parameter value. */ - rtems_interrupt_entry *entry;; + rtems_interrupt_entry *entry; /** * @brief This member contains the return value of the @@ -431,11 +431,8 @@ static void Routine( Context *ctx, uint32_t counter ) ctx->handler_counter = counter; - if ( - ctx->attributes.can_clear && - !ctx->attributes.cleared_by_acknowledge - ) { - sc = rtems_interrupt_clear( ctx->test_vector ); + if ( !ctx->attributes.cleared_by_acknowledge ) { + sc = ClearSoftwareInterrupt( ctx->test_vector ); T_rsc_success( sc ); } @@ -544,7 +541,7 @@ static void Action( void *arg ) T_rsc_success( sc ); if ( ctx->status == RTEMS_SUCCESSFUL ) { - sc = rtems_interrupt_raise( ctx->test_vector ); + sc = RaiseSoftwareInterrupt( ctx->test_vector ); T_rsc_success( sc ); } } diff --git a/testsuites/validation/tc-intr-entry-remove.c b/testsuites/validation/tc-intr-entry-remove.c index b6e0207ad3..01a72410e1 100644 --- a/testsuites/validation/tc-intr-entry-remove.c +++ b/testsuites/validation/tc-intr-entry-remove.c @@ -181,7 +181,7 @@ typedef struct { /** * @brief This member provides a counter incremented by EntryRoutine(). */ - uint32_t entry_counter;; + uint32_t entry_counter; /** * @brief This member provides another rtems_interrupt_entry object. @@ -285,7 +285,7 @@ typedef struct { /** * @brief This member specifies if the ``entry`` parameter value. */ - rtems_interrupt_entry *entry;; + rtems_interrupt_entry *entry; /** * @brief This member contains the return value of the diff --git a/testsuites/validation/tc-intr-get-affinity.c b/testsuites/validation/tc-intr-get-affinity.c index 713a5b483f..60509203b4 100644 --- a/testsuites/validation/tc-intr-get-affinity.c +++ b/testsuites/validation/tc-intr-get-affinity.c @@ -138,7 +138,7 @@ typedef struct { * @brief This member provides the object referenced by the ``affinity`` * parameter. */ - cpu_set_t cpuset_obj[ 2 ];; + cpu_set_t cpuset_obj[ 2 ]; /** * @brief This member contains the return value of the diff --git a/testsuites/validation/tc-intr-get-attributes.c b/testsuites/validation/tc-intr-get-attributes.c index 5b8c3fbcac..4594c78a2e 100644 --- a/testsuites/validation/tc-intr-get-attributes.c +++ b/testsuites/validation/tc-intr-get-attributes.c @@ -118,7 +118,7 @@ typedef struct { /** * @brief This member specifies if the ``attributes`` parameter value. */ - rtems_interrupt_attributes *attributes;; + rtems_interrupt_attributes *attributes; /** * @brief This member contains the return value of the diff --git a/testsuites/validation/tc-intr-is-pending.c b/testsuites/validation/tc-intr-is-pending.c index d1b8f73d78..097e3d7a17 100644 --- a/testsuites/validation/tc-intr-is-pending.c +++ b/testsuites/validation/tc-intr-is-pending.c @@ -142,7 +142,7 @@ typedef struct { /** * @brief This member specifies if the ``pending`` parameter value. */ - bool *pending;; + bool *pending; /** * @brief This member contains the return value of the diff --git a/testsuites/validation/tc-intr-vector-is-enabled.c b/testsuites/validation/tc-intr-vector-is-enabled.c index bf7be7ac2c..d24ad3f602 100644 --- a/testsuites/validation/tc-intr-vector-is-enabled.c +++ b/testsuites/validation/tc-intr-vector-is-enabled.c @@ -143,7 +143,7 @@ typedef struct { /** * @brief This member specifies if the ``enabled`` parameter value. */ - bool *enabled;; + bool *enabled; /** * @brief This member contains the return value of the diff --git a/testsuites/validation/tc-message-receive.c b/testsuites/validation/tc-message-receive.c index 1ca7afd221..944512eaa8 100644 --- a/testsuites/validation/tc-message-receive.c +++ b/testsuites/validation/tc-message-receive.c @@ -207,7 +207,7 @@ typedef struct { * * It is used for run-time type checking. */ - uint32_t magic;; + uint32_t magic; /** * @brief This member contains a number which is sent as next message. diff --git a/testsuites/validation/tc-message-urgent-send.c b/testsuites/validation/tc-message-urgent-send.c index 7640137ebb..e7364f108d 100644 --- a/testsuites/validation/tc-message-urgent-send.c +++ b/testsuites/validation/tc-message-urgent-send.c @@ -172,7 +172,7 @@ typedef struct { * * It is used for run-time type checking. */ - uint32_t magic;; + uint32_t magic; /** * @brief This member contains a number which is sent as next message. diff --git a/testsuites/validation/tc-part-performance.c b/testsuites/validation/tc-part-performance.c index 5a5c4841db..858dbc0b4b 100644 --- a/testsuites/validation/tc-part-performance.c +++ b/testsuites/validation/tc-part-performance.c @@ -53,7 +53,6 @@ #endif #include <rtems.h> -#include <rtems/chain.h> #include <rtems/test.h> @@ -143,7 +142,7 @@ static void RtemsPartValPerf_Setup( RtemsPartValPerf_Context *ctx ) void *area; uintptr_t length; - size = sizeof( rtems_chain_node ); + size = 2 * sizeof( uintptr_t ); area = T_malloc( size ); sc = rtems_partition_create( diff --git a/testsuites/validation/tc-sched-smp.c b/testsuites/validation/tc-sched-smp.c index 930ebb048c..3e8e3fe1a2 100644 --- a/testsuites/validation/tc-sched-smp.c +++ b/testsuites/validation/tc-sched-smp.c @@ -284,7 +284,7 @@ typedef struct { /** * @brief If this member is true, then the worker shall be in the busy loop. */ - volatile bool is_busy[ WORKER_COUNT ];; + volatile bool is_busy[ WORKER_COUNT ]; /** * @brief This member contains the per-CPU jobs. @@ -299,7 +299,7 @@ typedef struct { /** * @brief This member contains the call within ISR request. */ - CallWithinISRRequest request;; + CallWithinISRRequest request; } ScoreSchedSmpValSmp_Context; static ScoreSchedSmpValSmp_Context @@ -685,6 +685,7 @@ static void PrepareOwnerScheduled( Context *ctx ) SetScheduler( ctx->worker_id[ WORKER_C ], SCHEDULER_B_ID, PRIO_HIGH ); SetPriority( ctx->worker_id[ WORKER_A ], PRIO_NORMAL ); MakeBusy( ctx, WORKER_C ); + WaitForBusy( ctx, WORKER_C ); MakeBusy( ctx, WORKER_A ); } diff --git a/testsuites/validation/tc-scheduler-add-processor.c b/testsuites/validation/tc-scheduler-add-processor.c index ca86eb4d32..a26132aea0 100644 --- a/testsuites/validation/tc-scheduler-add-processor.c +++ b/testsuites/validation/tc-scheduler-add-processor.c @@ -155,18 +155,18 @@ typedef struct { * @brief This member contains the online status of the processor to add * before the rtems_scheduler_add_processor() call is prepared. */ - bool online;; + bool online; /** * @brief If this member is true, then the processor should be added to the * scheduler B during cleanup. */ - bool add_cpu_to_scheduler_b;; + bool add_cpu_to_scheduler_b; /** * @brief This member provides the scheduler operation records. */ - T_scheduler_log_2 scheduler_log;; + T_scheduler_log_2 scheduler_log; /** * @brief This member contains the return value of the diff --git a/testsuites/validation/tc-scheduler-ident-by-processor.c b/testsuites/validation/tc-scheduler-ident-by-processor.c index 1685725576..8cfe25a70e 100644 --- a/testsuites/validation/tc-scheduler-ident-by-processor.c +++ b/testsuites/validation/tc-scheduler-ident-by-processor.c @@ -246,7 +246,7 @@ static void RtemsSchedulerReqIdentByProcessor_Pre_CPUIndex_Prepare( switch ( state ) { case RtemsSchedulerReqIdentByProcessor_Pre_CPUIndex_Invalid: { /* - * While the ``cpu_index`` parameter greater than or equal to the + * While the ``cpu_index`` parameter is greater than or equal to the * processor maximum. */ ctx->cpu_index = rtems_scheduler_get_processor_maximum(); @@ -255,7 +255,7 @@ static void RtemsSchedulerReqIdentByProcessor_Pre_CPUIndex_Prepare( case RtemsSchedulerReqIdentByProcessor_Pre_CPUIndex_Valid: { /* - * While the ``cpu_index`` parameter less than the processor maximum. + * While the ``cpu_index`` parameter is less than the processor maximum. */ if ( ctx->cpu_has_scheduler ) { ctx->cpu_index = 0; diff --git a/testsuites/validation/tc-scheduler-remove-processor.c b/testsuites/validation/tc-scheduler-remove-processor.c index 8af90a99d9..f199389a33 100644 --- a/testsuites/validation/tc-scheduler-remove-processor.c +++ b/testsuites/validation/tc-scheduler-remove-processor.c @@ -177,12 +177,12 @@ typedef struct { /** * @brief This member contains the worker busy status. */ - volatile bool busy[ WORKER_COUNT ];; + volatile bool busy[ WORKER_COUNT ]; /** * @brief This member contains the worker busy status. */ - volatile uint32_t busy_counter[ WORKER_COUNT ];; + volatile uint32_t busy_counter[ WORKER_COUNT ]; /** * @brief This member contains the barrier to synchronize the runner and the @@ -193,7 +193,7 @@ typedef struct { /** * @brief This member contains the call within ISR request. */ - CallWithinISRRequest request;; + CallWithinISRRequest request; /** * @brief This member provides the context to wrap thread queue operations. @@ -246,7 +246,7 @@ typedef struct { /** * @brief This member provides the scheduler operation records. */ - T_scheduler_log_4 scheduler_log;; + T_scheduler_log_4 scheduler_log; /** * @brief This member contains the return value of the diff --git a/testsuites/validation/tc-score-fatal.c b/testsuites/validation/tc-score-fatal.c index dd61a87d80..b0a55f4664 100644 --- a/testsuites/validation/tc-score-fatal.c +++ b/testsuites/validation/tc-score-fatal.c @@ -7,7 +7,7 @@ */ /* - * Copyright (C) 2021 embedded brains GmbH & Co. KG + * Copyright (C) 2021, 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 @@ -74,14 +74,21 @@ * This test case performs the following actions: * * - Construct a task with a task body which returns. Check that the right - * fatal error occurs. + * fatal error occurred. * - * - Construct a task which performs a thread dispatch with maskable interrupts - * disabled. Check that the right fatal error occurs or no fatal error - * occurs. + * - Construct a task which performs a direct thread dispatch with maskable + * interrupts disabled. Where robust thread dispatching is required, check + * that the right fatal error occurred, otherwise check that no fatal error + * occurred. + * + * - Construct a task which performs an on demand thread dispatch with maskable + * interrupts disabled. Where robust thread dispatching is required, check + * that the right fatal error occurred, otherwise check that no fatal error + * occurred. * * - Construct a task which performs a direct thread dispatch with a thread - * dispatch level not equal to one. Check that the right fatal error occurs. + * dispatch level not equal to one. Check that the right fatal error + * occurred. * * - Create a mutex and construct a task which produces a deadlock which * involves the allocator mutex. @@ -164,10 +171,11 @@ static void FatalBadThreadDispatchEnvironment( { Fatal( source, code, arg ); _ISR_Set_level( 0 ); - _Thread_Dispatch_direct_no_return( _Per_CPU_Get() ); + _Thread_Dispatch_unnest( _Per_CPU_Get() ); + rtems_task_exit(); } -static void ISRDisabledThreadDispatchTask( rtems_task_argument arg ) +static void ISRDisabledDirectThreadDispatchTask( rtems_task_argument arg ) { rtems_interrupt_level level; @@ -177,6 +185,16 @@ static void ISRDisabledThreadDispatchTask( rtems_task_argument arg ) rtems_task_exit(); } +static void ISRDisabledOnDemandThreadDispatchTask( rtems_task_argument arg ) +{ + rtems_interrupt_level level; + + (void) arg; + rtems_interrupt_local_disable( level ); + (void) level; + SetSelfPriority( PRIO_VERY_HIGH ); +} + static void FatalBadThreadDispatchDisableLevel( rtems_fatal_source source, rtems_fatal_code code, @@ -245,7 +263,7 @@ static T_fixture ScoreValFatal_Fixture = { /** * @brief Construct a task with a task body which returns. Check that the - * right fatal error occurs. + * right fatal error occurred. */ static void ScoreValFatal_Action_0( ScoreValFatal_Context *ctx ) { @@ -265,9 +283,10 @@ static void ScoreValFatal_Action_0( ScoreValFatal_Context *ctx ) } /** - * @brief Construct a task which performs a thread dispatch with maskable - * interrupts disabled. Check that the right fatal error occurs or no fatal - * error occurs. + * @brief Construct a task which performs a direct thread dispatch with + * maskable interrupts disabled. Where robust thread dispatching is + * required, check that the right fatal error occurred, otherwise check that + * no fatal error occurred. */ static void ScoreValFatal_Action_1( ScoreValFatal_Context *ctx ) { @@ -278,7 +297,40 @@ static void ScoreValFatal_Action_1( ScoreValFatal_Context *ctx ) SetSelfPriority( PRIO_NORMAL ); counter = ResetFatalInfo( ctx ); id = CreateTask( "BENV", PRIO_HIGH ); - StartTask( id, ISRDisabledThreadDispatchTask, NULL ); + StartTask( id, ISRDisabledDirectThreadDispatchTask, NULL ); + + #if CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE + if ( rtems_configuration_get_maximum_processors() > 1 ) { + #endif + T_eq_uint( GetFatalCounter( ctx ), counter + 1 ); + T_eq_int( ctx->source, INTERNAL_ERROR_CORE ); + T_eq_ulong( ctx->code, INTERNAL_ERROR_BAD_THREAD_DISPATCH_ENVIRONMENT ); + #if CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE + } else { + T_eq_uint( GetFatalCounter( ctx ), counter ); + } + #endif + + RestoreRunnerPriority(); + SetFatalHandler( NULL, NULL ); +} + +/** + * @brief Construct a task which performs an on demand thread dispatch with + * maskable interrupts disabled. Where robust thread dispatching is + * required, check that the right fatal error occurred, otherwise check that + * no fatal error occurred. + */ +static void ScoreValFatal_Action_2( ScoreValFatal_Context *ctx ) +{ + rtems_id id; + unsigned int counter; + + SetFatalHandler( FatalBadThreadDispatchEnvironment, ctx ); + SetSelfPriority( PRIO_NORMAL ); + counter = ResetFatalInfo( ctx ); + id = CreateTask( "BENV", PRIO_HIGH ); + StartTask( id, ISRDisabledOnDemandThreadDispatchTask, NULL ); #if CPU_ENABLE_ROBUST_THREAD_DISPATCH == FALSE if ( rtems_configuration_get_maximum_processors() > 1 ) { @@ -299,9 +351,9 @@ static void ScoreValFatal_Action_1( ScoreValFatal_Context *ctx ) /** * @brief Construct a task which performs a direct thread dispatch with a * thread dispatch level not equal to one. Check that the right fatal error - * occurs. + * occurred. */ -static void ScoreValFatal_Action_2( ScoreValFatal_Context *ctx ) +static void ScoreValFatal_Action_3( ScoreValFatal_Context *ctx ) { rtems_id id; unsigned int counter; @@ -322,7 +374,7 @@ static void ScoreValFatal_Action_2( ScoreValFatal_Context *ctx ) * @brief Create a mutex and construct a task which produces a deadlock which * involves the allocator mutex. */ -static void ScoreValFatal_Action_3( ScoreValFatal_Context *ctx ) +static void ScoreValFatal_Action_4( ScoreValFatal_Context *ctx ) { rtems_extensions_table extensions; rtems_status_code sc; @@ -374,7 +426,7 @@ static void ScoreValFatal_Action_3( ScoreValFatal_Context *ctx ) * SetFatalHandler() requires an initial extension this validates * CONFIGURE_INITIAL_EXTENSIONS. */ -static void ScoreValFatal_Action_4( ScoreValFatal_Context *ctx ) +static void ScoreValFatal_Action_5( ScoreValFatal_Context *ctx ) { unsigned int counter; @@ -404,6 +456,7 @@ T_TEST_CASE_FIXTURE( ScoreValFatal, &ScoreValFatal_Fixture ) ScoreValFatal_Action_2( ctx ); ScoreValFatal_Action_3( ctx ); ScoreValFatal_Action_4( ctx ); + ScoreValFatal_Action_5( ctx ); } /** @} */ diff --git a/testsuites/validation/tc-score-isr.c b/testsuites/validation/tc-score-isr.c new file mode 100644 index 0000000000..b178541e72 --- /dev/null +++ b/testsuites/validation/tc-score-isr.c @@ -0,0 +1,285 @@ +/* SPDX-License-Identifier: BSD-2-Clause */ + +/** + * @file + * + * @ingroup ScoreIsrValIsr + */ + +/* + * Copyright (C) 2023 embedded brains GmbH & Co. KG + * + * 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. + */ + +/* + * This file is part of the RTEMS quality process and was automatically + * generated. If you find something that needs to be fixed or + * worded better please post a report or patch to an RTEMS mailing list + * or raise a bug report: + * + * https://www.rtems.org/bugs.html + * + * For information on updating and regenerating please refer to the How-To + * section in the Software Requirements Engineering chapter of the + * RTEMS Software Engineering manual. The manual is provided as a part of + * a release. For development sources please refer to the online + * documentation at: + * + * https://docs.rtems.org + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems.h> +#include <rtems/sysinit.h> +#include <rtems/score/percpu.h> +#include <rtems/score/thread.h> + +#include "tx-support.h" + +#include <rtems/test.h> + +/** + * @defgroup ScoreIsrValIsr spec:/score/isr/val/isr + * + * @ingroup TestsuitesValidationIntr + * + * @brief Tests general interrupt support behaviour. + * + * This test case performs the following actions: + * + * - Submit an ISR request during system initialization. Check the stack of + * the interrupted context while the ISR request is serviced. Store the + * result of the check in interrupted_stack_at_multitasking_start_is_valid. + * + * - Check that stack of the interrupted context was valid when an interrupt + * was serviced during the multitasking start. + * + * @{ + */ + +static uintptr_t interrupted_stack_at_multitasking_start; + +static bool interrupted_stack_at_multitasking_start_is_valid; + +#if defined(__aarch64__) +void __real_bsp_interrupt_dispatch( void ); + +void __wrap_bsp_interrupt_dispatch( void ); + +void __wrap_bsp_interrupt_dispatch( void ) +{ + if ( interrupted_stack_at_multitasking_start == 0 ) { + uintptr_t sp; + rtems_interrupt_level level; + + rtems_interrupt_local_disable( level ); + __asm__ volatile ( + "msr spsel, #1\n" + "mov %0, sp\n" + "msr spsel, #0" + : "=r" ( sp ) + ); + rtems_interrupt_local_enable( level ); + + interrupted_stack_at_multitasking_start = sp; + } + + __real_bsp_interrupt_dispatch(); +} +#endif + +#if defined(ARM_MULTILIB_ARCH_V4) +void __real_bsp_interrupt_dispatch( void ); + +void __wrap_bsp_interrupt_dispatch( void ); + +void __wrap_bsp_interrupt_dispatch( void ) +{ + register uintptr_t sp __asm__( "9" ); + + if ( interrupted_stack_at_multitasking_start == 0 ) { + interrupted_stack_at_multitasking_start = sp; + } + + __real_bsp_interrupt_dispatch(); +} +#endif + +#if defined(__microblaze__) +void __real_bsp_interrupt_dispatch( uint32_t source ); + +void __wrap_bsp_interrupt_dispatch( uint32_t source ); + +void __wrap_bsp_interrupt_dispatch( uint32_t source ) +{ + register uintptr_t sp __asm__( "1" ); + + if ( interrupted_stack_at_multitasking_start == 0 ) { + interrupted_stack_at_multitasking_start = sp; + } + + __real_bsp_interrupt_dispatch( source ); +} +#endif + +#if defined(__PPC__) || defined(__powerpc64__) +void __real_bsp_interrupt_dispatch( void ); + +void __wrap_bsp_interrupt_dispatch( void ); + +void __wrap_bsp_interrupt_dispatch( void ) +{ + register uintptr_t sp __asm__( "14" ); + + if ( interrupted_stack_at_multitasking_start == 0 ) { + interrupted_stack_at_multitasking_start = sp; + } + + __real_bsp_interrupt_dispatch(); +} +#endif + +#if defined(__riscv) +void __real__RISCV_Interrupt_dispatch( + uintptr_t mcause, + Per_CPU_Control *cpu_self +); + +void __wrap__RISCV_Interrupt_dispatch( + uintptr_t mcause, + Per_CPU_Control *cpu_self +); + +void __wrap__RISCV_Interrupt_dispatch( + uintptr_t mcause, + Per_CPU_Control *cpu_self +) +{ + register uintptr_t sp __asm__( "s1" ); + + if ( interrupted_stack_at_multitasking_start == 0 ) { + interrupted_stack_at_multitasking_start = sp; + } + + __real__RISCV_Interrupt_dispatch( mcause, cpu_self ); +} +#endif + +#if defined(__sparc__) +void __real__SPARC_Interrupt_dispatch( uint32_t irq ); + +static RTEMS_USED void InterruptDispatch( uint32_t irq, uintptr_t sp ) +{ + if ( interrupted_stack_at_multitasking_start == 0 ) { + interrupted_stack_at_multitasking_start = sp; + } + + __real__SPARC_Interrupt_dispatch( irq ); +} + +__asm__ ( + "\t.section\t\".text\"\n" + "\t.align\t4\n" + "\t.globl\t__wrap__SPARC_Interrupt_dispatch\n" + "\t.type\t__wrap__SPARC_Interrupt_dispatch, #function\n" + "__wrap__SPARC_Interrupt_dispatch:\n" + "\tmov\t%fp, %o1\n" + "\tor\t%o7, %g0, %g1\n" + "\tcall\tInterruptDispatch, 0\n" + "\t or\t%g1, %g0, %o7\n" + "\t.previous\n" +); +#endif + +static void ISRHandler( void *arg ) +{ + uintptr_t begin; + uintptr_t end; + + (void) arg; + +#if defined(RTEMS_SMP) && !(defined(__PPC__) || (__powerpc64__)) + Per_CPU_Control *cpu_self; + + cpu_self = _Per_CPU_Get(); + begin = (uintptr_t) &cpu_self->Interrupt_frame; + end = begin + sizeof( cpu_self->Interrupt_frame ); +#else + Thread_Control *executing; + + executing = GetExecuting(); + begin = (uintptr_t) executing->Start.Initial_stack.area; + end = begin + executing->Start.Initial_stack.size; +#endif + + interrupted_stack_at_multitasking_start_is_valid = + ( begin <= interrupted_stack_at_multitasking_start && + interrupted_stack_at_multitasking_start < end ); +} + +static CallWithinISRRequest isr_request = { + .handler = ISRHandler +}; + +static void SubmitISRRequest( void ) +{ + CallWithinISRSubmit( &isr_request ); +} + +RTEMS_SYSINIT_ITEM( + SubmitISRRequest, + RTEMS_SYSINIT_DEVICE_DRIVERS, + RTEMS_SYSINIT_ORDER_LAST +); + +/** + * @brief Submit an ISR request during system initialization. Check the stack + * of the interrupted context while the ISR request is serviced. Store the + * result of the check in interrupted_stack_at_multitasking_start_is_valid. + */ +static void ScoreIsrValIsr_Action_0( void ) +{ + /* + * The actions are performed during system initialization and the + * multitasking start. + */ + + /* + * Check that stack of the interrupted context was valid when an interrupt + * was serviced during the multitasking start. + */ + T_true( interrupted_stack_at_multitasking_start_is_valid ); +} + +/** + * @fn void T_case_body_ScoreIsrValIsr( void ) + */ +T_TEST_CASE( ScoreIsrValIsr ) +{ + ScoreIsrValIsr_Action_0(); +} + +/** @} */ diff --git a/testsuites/validation/tc-score-thread.c b/testsuites/validation/tc-score-thread.c index 764a04cd4b..e065905641 100644 --- a/testsuites/validation/tc-score-thread.c +++ b/testsuites/validation/tc-score-thread.c @@ -7,7 +7,7 @@ */ /* - * Copyright (C) 2021 embedded brains GmbH & Co. KG + * Copyright (C) 2021, 2023 embedded brains GmbH & Co. KG * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -104,6 +104,13 @@ * * - Check that the global constructor was called before the task entry. * + * - Validate that thread dispatching does not recurse. Issue a couple of + * thread context switches during a thread dispatch. Record the stack + * pointers of the heir threads. + * + * - Check that the thread dispatching did not recurse through the recorded + * stack pointers. + * * @{ */ @@ -125,6 +132,21 @@ typedef struct { * @brief This member contains a floating-point object. */ volatile double fp_obj; + + /** + * @brief This member indicates the thread switch state. + */ + int thread_switch_state; + + /** + * @brief This member contain the runner stack pointer at the context switch. + */ + uintptr_t runner_stack[ 2 ]; + + /** + * @brief This member contain the worker stack pointer at the context switch. + */ + uintptr_t worker_stack[ 2 ]; } ScoreThreadValThread_Context; static ScoreThreadValThread_Context @@ -195,6 +217,44 @@ static void KillerTask( rtems_task_argument arg ) DeleteTask( ctx->worker_id ); } +static void TaskSwitch( rtems_tcb *executing, rtems_tcb *heir ) +{ + Context *ctx; + rtems_id worker_id; + int state; + uintptr_t heir_stack; + + ctx = T_fixture_context(); + worker_id = ctx->worker_id; + state = ctx->thread_switch_state; + ctx->thread_switch_state = state + 1; + heir_stack = _CPU_Context_Get_SP( &heir->Registers ); + + switch ( state ) { + case 0: + T_eq_u32( heir->Object.id, worker_id ); + SuspendTask( worker_id ); + ctx->worker_stack[ 0 ] = heir_stack; + break; + case 1: + T_eq_u32( executing->Object.id, worker_id ); + ResumeTask( worker_id ); + ctx->runner_stack[ 0 ] = heir_stack; + break; + case 2: + T_eq_u32( heir->Object.id, worker_id ); + SuspendTask( worker_id ); + ctx->worker_stack[ 1 ] = heir_stack; + break; + case 3: + T_eq_u32( executing->Object.id, worker_id ); + ctx->runner_stack[ 1 ] = heir_stack; + break; + default: + T_unreachable(); + } +} + static T_fixture ScoreThreadValThread_Fixture = { .setup = NULL, .stop = NULL, @@ -338,6 +398,37 @@ static void ScoreThreadValThread_Action_2( ScoreThreadValThread_Context *ctx ) } /** + * @brief Validate that thread dispatching does not recurse. Issue a couple of + * thread context switches during a thread dispatch. Record the stack + * pointers of the heir threads. + */ +static void ScoreThreadValThread_Action_3( ScoreThreadValThread_Context *ctx ) +{ + SetSelfPriority( PRIO_NORMAL ); + ctx->worker_id = CreateTask( "WORK", PRIO_HIGH ); + StartTask( ctx->worker_id, WorkerTask, NULL ); + + ctx->thread_switch_state = 0; + ctx->runner_stack[ 0 ] = 0; + ctx->runner_stack[ 1 ] = 1; + ctx->worker_stack[ 0 ] = 0; + ctx->worker_stack[ 1 ] = 1; + SetTaskSwitchExtension( TaskSwitch ); + ResumeTask( ctx->worker_id ); + + SetTaskSwitchExtension( NULL ); + DeleteTask( ctx->worker_id ); + RestoreRunnerPriority(); + + /* + * Check that the thread dispatching did not recurse through the recorded + * stack pointers. + */ + T_eq_uptr( ctx->runner_stack[ 0 ], ctx->runner_stack[ 1 ] ); + T_eq_uptr( ctx->worker_stack[ 0 ], ctx->worker_stack[ 1 ] ); +} + +/** * @fn void T_case_body_ScoreThreadValThread( void ) */ T_TEST_CASE_FIXTURE( ScoreThreadValThread, &ScoreThreadValThread_Fixture ) @@ -349,6 +440,7 @@ T_TEST_CASE_FIXTURE( ScoreThreadValThread, &ScoreThreadValThread_Fixture ) ScoreThreadValThread_Action_0( ctx ); ScoreThreadValThread_Action_1( ctx ); ScoreThreadValThread_Action_2( ctx ); + ScoreThreadValThread_Action_3( ctx ); } /** @} */ diff --git a/testsuites/validation/tc-sem-create.c b/testsuites/validation/tc-sem-create.c index 3d57fefcc0..9975cb0778 100644 --- a/testsuites/validation/tc-sem-create.c +++ b/testsuites/validation/tc-sem-create.c @@ -224,15 +224,15 @@ typedef struct { rtems_status_code status; - Semaphore_Variant variant;; + Semaphore_Variant variant; - Semaphore_Discipline discipline;; + Semaphore_Discipline discipline; - uint32_t sem_count;; + uint32_t sem_count; - Thread_Control *executing;; + Thread_Control *executing; - Thread_Control *owner;; + Thread_Control *owner; rtems_name name; diff --git a/testsuites/validation/tc-sem-flush.c b/testsuites/validation/tc-sem-flush.c index da4ffb2940..4fb2027354 100644 --- a/testsuites/validation/tc-sem-flush.c +++ b/testsuites/validation/tc-sem-flush.c @@ -118,7 +118,7 @@ typedef struct { /** * @brief This member contains the thread queue test context. */ - TQContext tq_ctx;; + TQContext tq_ctx; /** * @brief This member specifies if the attribute set of the semaphore. @@ -498,7 +498,9 @@ static void RtemsSemReqFlush_Action( RtemsSemReqFlush_Context *ctx ) static void RtemsSemReqFlush_Cleanup( RtemsSemReqFlush_Context *ctx ) { rtems_status_code sc; - sc = rtems_semaphore_delete( ctx->tq_ctx.thread_queue_id ); T_rsc_success( sc ); + + sc = rtems_semaphore_delete( ctx->tq_ctx.thread_queue_id ); + T_rsc_success( sc ); } static const RtemsSemReqFlush_Entry diff --git a/testsuites/validation/tc-sem-obtain.c b/testsuites/validation/tc-sem-obtain.c index 3370a57604..10c4475d8c 100644 --- a/testsuites/validation/tc-sem-obtain.c +++ b/testsuites/validation/tc-sem-obtain.c @@ -499,11 +499,15 @@ static void RtemsSemReqObtain_Post_Action_Check( * spec:/score/mtx/req/seize-try where an enqueue is sticky, a recursive * seize returns an error status, and a priority ceiling is used. */ + #if defined(RTEMS_SMP) ctx->tq_mtx_ctx.base.enqueue_variant = TQ_ENQUEUE_STICKY; ctx->tq_mtx_ctx.protocol = TQ_MTX_MRSP; ctx->tq_mtx_ctx.recursive = TQ_MTX_RECURSIVE_DEADLOCK; ctx->tq_mtx_ctx.priority_ceiling = PRIO_VERY_HIGH; ScoreMtxReqSeizeTry_Run( &ctx->tq_mtx_ctx ); + #else + T_unreachable(); + #endif break; } @@ -513,11 +517,15 @@ static void RtemsSemReqObtain_Post_Action_Check( * spec:/score/mtx/req/seize-wait where an enqueue is sticky, a recursive * seize returns an error status, and a priority ceiling is used. */ + #if defined(RTEMS_SMP) ctx->tq_mtx_ctx.base.enqueue_variant = TQ_ENQUEUE_STICKY; ctx->tq_mtx_ctx.protocol = TQ_MTX_MRSP; ctx->tq_mtx_ctx.recursive = TQ_MTX_RECURSIVE_DEADLOCK; ctx->tq_mtx_ctx.priority_ceiling = PRIO_VERY_HIGH; ScoreMtxReqSeizeWait_Run( &ctx->tq_mtx_ctx ); + #else + T_unreachable(); + #endif break; } @@ -580,6 +588,7 @@ static void RtemsSemReqObtain_Action( RtemsSemReqObtain_Context *ctx ) ); T_rsc_success( sc ); + #if defined(RTEMS_SMP) if ( ( ctx->attribute_set & RTEMS_MULTIPROCESSOR_RESOURCE_SHARING ) != 0 ) { rtems_task_priority prio; @@ -591,6 +600,7 @@ static void RtemsSemReqObtain_Action( RtemsSemReqObtain_Context *ctx ) ); T_rsc_success( sc ); } + #endif } static void RtemsSemReqObtain_Cleanup( RtemsSemReqObtain_Context *ctx ) @@ -606,33 +616,28 @@ RtemsSemReqObtain_Entries[] = { { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_SemSeizeWait }, { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_SemSeizeTry }, { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_MtxSeizeWait }, -#if defined(RTEMS_SMP) - { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_InvId }, -#else - { 1, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_NA }, -#endif { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_MtxSeizeTry }, { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_CeilingMtxSeizeWait }, { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_InheritMtxSeizeWait }, #if defined(RTEMS_SMP) { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_MrsPMtxSeizeWait }, #else - { 1, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_NA }, + { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_CeilingMtxSeizeWait }, #endif { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_CeilingMtxSeizeTry }, { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_InheritMtxSeizeTry }, #if defined(RTEMS_SMP) { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_MrsPMtxSeizeTry } #else - { 1, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_NA } + { 0, 0, 0, 0, 0, RtemsSemReqObtain_Post_Action_CeilingMtxSeizeTry } #endif }; static const uint8_t RtemsSemReqObtain_Map[] = { - 3, 2, 2, 0, 0, 0, 3, 2, 2, 0, 0, 0, 3, 2, 2, 0, 0, 0, 3, 2, 2, 0, 0, 0, 6, 4, - 4, 0, 0, 0, 6, 4, 4, 0, 0, 0, 1, 1, 1, 1, 1, 1, 10, 7, 7, 0, 0, 0, 1, 1, 1, - 1, 1, 1, 11, 8, 8, 0, 0, 0, 1, 1, 1, 1, 1, 1, 12, 9, 9, 5, 5, 5 + 3, 2, 2, 0, 0, 0, 3, 2, 2, 0, 0, 0, 3, 2, 2, 0, 0, 0, 3, 2, 2, 0, 0, 0, 5, 4, + 4, 0, 0, 0, 5, 4, 4, 0, 0, 0, 1, 1, 1, 1, 1, 1, 9, 6, 6, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 10, 7, 7, 0, 0, 0, 1, 1, 1, 1, 1, 1, 11, 8, 8, 0, 0, 0 }; static size_t RtemsSemReqObtain_Scope( void *arg, char *buf, size_t n ) diff --git a/testsuites/validation/tc-sem-performance.c b/testsuites/validation/tc-sem-performance.c index 0014306ddb..5861e3ee8e 100644 --- a/testsuites/validation/tc-sem-performance.c +++ b/testsuites/validation/tc-sem-performance.c @@ -382,9 +382,10 @@ static void RtemsSemReqPerfMtxPiReleaseOne_Setup( RtemsSemValPerf_Context *ctx ) { + SetSelfPriority( PRIO_HIGH ); ObtainMutex( ctx->mutex_id ); Send( ctx, EVENT_OBTAIN ); - SetPriority( ctx->worker_id, PRIO_LOW ); + Yield(); Send( ctx, EVENT_RELEASE ); } @@ -401,6 +402,11 @@ static void RtemsSemReqPerfMtxPiReleaseOne_Setup_Wrap( void *arg ) */ static void RtemsSemReqPerfMtxPiReleaseOne_Body( RtemsSemValPerf_Context *ctx ) { + /* + * The release will unblock the worker task which has our priority. The + * scheduler ensures FIFO ordering for ready threads of the same priority, so + * the release will not preempt us. + */ ctx->status = rtems_semaphore_release( ctx->mutex_id ); } @@ -426,7 +432,7 @@ static bool RtemsSemReqPerfMtxPiReleaseOne_Teardown( { T_quiet_rsc( ctx->status, RTEMS_SUCCESSFUL ); - SetPriority( ctx->worker_id, PRIO_HIGH ); + SetSelfPriority( PRIO_NORMAL ); return tic == toc; } @@ -734,7 +740,7 @@ static void RtemsSemReqPerfMtxPiWaitForever_Setup( ) { Send( ctx, EVENT_OBTAIN ); - SetPriority( ctx->worker_id, PRIO_LOW ); + SetSelfPriority( PRIO_VERY_HIGH ); Send( ctx, EVENT_END | EVENT_RELEASE ); } @@ -784,8 +790,8 @@ static bool RtemsSemReqPerfMtxPiWaitForever_Teardown( T_quiet_rsc( ctx->status, RTEMS_SUCCESSFUL ); *delta = ctx->end - ctx->begin; - SetPriority( ctx->worker_id, PRIO_HIGH ); ReleaseMutex( ctx->mutex_id ); + SetSelfPriority( PRIO_NORMAL ); return tic == toc; } @@ -825,7 +831,7 @@ static bool RtemsSemReqPerfMtxPiWaitForever_Teardown_Wrap( static void RtemsSemReqPerfMtxPiWaitTimed_Setup( RtemsSemValPerf_Context *ctx ) { Send( ctx, EVENT_OBTAIN ); - SetPriority( ctx->worker_id, PRIO_LOW ); + SetSelfPriority( PRIO_VERY_HIGH ); Send( ctx, EVENT_END | EVENT_RELEASE ); } @@ -873,8 +879,8 @@ static bool RtemsSemReqPerfMtxPiWaitTimed_Teardown( T_quiet_rsc( ctx->status, RTEMS_SUCCESSFUL ); *delta = ctx->end - ctx->begin; - SetPriority( ctx->worker_id, PRIO_HIGH ); ReleaseMutex( ctx->mutex_id ); + SetSelfPriority( PRIO_NORMAL ); return tic == toc; } diff --git a/testsuites/validation/tc-sem-smp.c b/testsuites/validation/tc-sem-smp.c index aa0c7dda0d..5dc3f437a1 100644 --- a/testsuites/validation/tc-sem-smp.c +++ b/testsuites/validation/tc-sem-smp.c @@ -123,12 +123,12 @@ typedef struct { /** * @brief This member contains the mutex identifier. */ - rtems_id mutex_id;; + rtems_id mutex_id; /** * @brief This member contains the second mutex identifier. */ - rtems_id mutex_2_id;; + rtems_id mutex_2_id; /** * @brief If this member is true, then the worker is done. diff --git a/testsuites/validation/tc-sem-timeout.c b/testsuites/validation/tc-sem-timeout.c index bdf46fe6de..a150d067d2 100644 --- a/testsuites/validation/tc-sem-timeout.c +++ b/testsuites/validation/tc-sem-timeout.c @@ -55,7 +55,6 @@ #include <rtems.h> #include <string.h> -#include "tr-tq-timeout-mrsp.h" #include "tr-tq-timeout-priority-inherit.h" #include "tr-tq-timeout.h" #include "tx-support.h" @@ -108,7 +107,7 @@ typedef struct { /** * @brief This member contains the thread queue test context. */ - TQContext tq_ctx;; + TQContext tq_ctx; /** * @brief This member specifies if the attribute set of the semaphore. @@ -169,6 +168,10 @@ static const char * const * const RtemsSemReqTimeout_PreDesc[] = { NULL }; +#if defined(RTEMS_SMP) +#include "tr-tq-timeout-mrsp.h" +#endif + static void RtemsSemReqTimeout_Pre_Class_Prepare( RtemsSemReqTimeout_Context *ctx, RtemsSemReqTimeout_Pre_Class state @@ -226,7 +229,11 @@ static void RtemsSemReqTimeout_Pre_Class_Prepare( */ ctx->attribute_set |= RTEMS_BINARY_SEMAPHORE | RTEMS_MULTIPROCESSOR_RESOURCE_SHARING; + #if defined(RTEMS_SMP) ctx->tq_ctx.enqueue_variant = TQ_ENQUEUE_STICKY; + #else + ctx->tq_ctx.enqueue_variant = TQ_ENQUEUE_BLOCKS; + #endif break; } @@ -285,8 +292,12 @@ static void RtemsSemReqTimeout_Post_Action_Check( * The semaphore obtain timeout actions shall be done as specified by * spec:/score/tq/req/timeout-mrsp. */ + #if defined(RTEMS_SMP) ctx->tq_ctx.wait = TQ_WAIT_TIMED; ScoreTqReqTimeoutMrsp_Run( &ctx->tq_ctx ); + #else + T_unreachable(); + #endif break; } @@ -361,8 +372,12 @@ static void RtemsSemReqTimeout_Action( RtemsSemReqTimeout_Context *ctx ) static void RtemsSemReqTimeout_Cleanup( RtemsSemReqTimeout_Context *ctx ) { - if ( ctx->tq_ctx.thread_queue_id != 0 ) { rtems_status_code sc; - sc = rtems_semaphore_delete( ctx->tq_ctx.thread_queue_id ); T_rsc_success( sc ); } + if ( ctx->tq_ctx.thread_queue_id != 0 ) { + rtems_status_code sc; + + sc = rtems_semaphore_delete( ctx->tq_ctx.thread_queue_id ); + T_rsc_success( sc ); + } } static const RtemsSemReqTimeout_Entry @@ -370,10 +385,10 @@ RtemsSemReqTimeout_Entries[] = { { 0, 0, 0, RtemsSemReqTimeout_Post_Action_Timeout }, { 1, 0, 0, RtemsSemReqTimeout_Post_Action_NA }, { 0, 0, 0, RtemsSemReqTimeout_Post_Action_TimeoutPriorityInherit }, -#if !defined(RTEMS_SMP) - { 1, 0, 0, RtemsSemReqTimeout_Post_Action_NA } -#else +#if defined(RTEMS_SMP) { 0, 0, 0, RtemsSemReqTimeout_Post_Action_TimeoutMrsP } +#else + { 0, 0, 0, RtemsSemReqTimeout_Post_Action_Timeout } #endif }; diff --git a/testsuites/validation/tc-signal-send.c b/testsuites/validation/tc-signal-send.c index 82cde6c5cc..aedcec5e47 100644 --- a/testsuites/validation/tc-signal-send.c +++ b/testsuites/validation/tc-signal-send.c @@ -154,9 +154,9 @@ typedef struct { rtems_signal_set processed_signal_sets[ 2 ]; - uintptr_t stack_pointers[ 2 ];; + uintptr_t stack_pointers[ 2 ]; - rtems_mode mode;; + rtems_mode mode; rtems_status_code status; diff --git a/testsuites/validation/tc-task-construct.c b/testsuites/validation/tc-task-construct.c index 8f82db8b54..5a7ca4f497 100644 --- a/testsuites/validation/tc-task-construct.c +++ b/testsuites/validation/tc-task-construct.c @@ -291,7 +291,7 @@ typedef struct { * @brief If this member is true, then the zombie thread is ready to get * killed. */ - volatile bool zombie_ready;; + volatile bool zombie_ready; /** * @brief This member contains the actual modes of the constructed task. diff --git a/testsuites/validation/tc-task-delete.c b/testsuites/validation/tc-task-delete.c index d8d708171b..d917062d0d 100644 --- a/testsuites/validation/tc-task-delete.c +++ b/testsuites/validation/tc-task-delete.c @@ -57,7 +57,6 @@ #include <setjmp.h> #include <rtems/bspIo.h> #include <rtems/test-scheduler.h> -#include <rtems/score/io.h> #include <rtems/score/statesimpl.h> #include <rtems/score/threaddispatch.h> #include <rtems/score/threadimpl.h> @@ -262,7 +261,7 @@ typedef struct { /** * @brief This member provides a jump context to resume a thread dispatch. */ - jmp_buf thread_dispatch_context;; + jmp_buf thread_dispatch_context; /** * @brief This member contains the identifier of the runner scheduler. @@ -310,13 +309,13 @@ typedef struct { * @brief This member contains the worker timer info at the end of the * rtems_task_delete() call. */ - TaskTimerInfo worker_timer_info;; + TaskTimerInfo worker_timer_info; /** * @brief This member contains the worker thread queue at the end of the * rtems_task_delete() call. */ - const Thread_queue_Queue *worker_wait_queue;; + const Thread_queue_Queue *worker_wait_queue; /** * @brief This member contains the worker thread life state at the end of the @@ -358,13 +357,13 @@ typedef struct { /** * @brief This member contains extension calls. */ - ExtensionCalls calls;; + ExtensionCalls calls; /** * @brief This member contains extension calls after the rtems_task_delete() * call. */ - ExtensionCalls calls_after_restart;; + ExtensionCalls calls_after_restart; /** * @brief This member contains the delete counter. diff --git a/testsuites/validation/tc-task-restart.c b/testsuites/validation/tc-task-restart.c index e62dbbb567..c915f01a49 100644 --- a/testsuites/validation/tc-task-restart.c +++ b/testsuites/validation/tc-task-restart.c @@ -251,7 +251,7 @@ typedef struct { /** * @brief This member provides a jump context to resume a thread dispatch. */ - jmp_buf thread_dispatch_context;; + jmp_buf thread_dispatch_context; /** * @brief This member provides the context to wrap thread queue operations. @@ -319,13 +319,13 @@ typedef struct { /** * @brief This member contains extension calls. */ - ExtensionCalls calls;; + ExtensionCalls calls; /** * @brief This member contains extension calls after the rtems_task_restart() * call. */ - ExtensionCalls calls_after_restart;; + ExtensionCalls calls_after_restart; /** * @brief This member contains the actual argument passed to the entry point. diff --git a/testsuites/validation/tc-task-set-affinity.c b/testsuites/validation/tc-task-set-affinity.c index 5f11b0250c..9502d009e1 100644 --- a/testsuites/validation/tc-task-set-affinity.c +++ b/testsuites/validation/tc-task-set-affinity.c @@ -131,7 +131,7 @@ typedef struct { /** * @brief This member provides the scheduler operation records. */ - T_scheduler_log_2 scheduler_log;; + T_scheduler_log_2 scheduler_log; /** * @brief This member provides the object referenced by the ``cpuset`` diff --git a/testsuites/validation/tc-task-set-scheduler.c b/testsuites/validation/tc-task-set-scheduler.c index eef4295a73..174aa55736 100644 --- a/testsuites/validation/tc-task-set-scheduler.c +++ b/testsuites/validation/tc-task-set-scheduler.c @@ -266,7 +266,7 @@ typedef struct { /** * @brief This member contains the identifier of the new scheduler. */ - rtems_id new_scheduler;; + rtems_id new_scheduler; /** * @brief This member contains the new priorities of the task. diff --git a/testsuites/validation/tc-task-wake-after.c b/testsuites/validation/tc-task-wake-after.c index b600644efe..ba12d21c85 100644 --- a/testsuites/validation/tc-task-wake-after.c +++ b/testsuites/validation/tc-task-wake-after.c @@ -122,29 +122,29 @@ typedef struct { /** * @brief This member provides the scheduler operation records. */ - T_scheduler_log_4 scheduler_log;; + T_scheduler_log_4 scheduler_log; /** * @brief This member contains the clock tick value before the * rtems_task_wake_after() call. */ - uint64_t now;; + uint64_t now; /** * @brief This member contains the worker task identifier. */ - rtems_id worker_id;; + rtems_id worker_id; /** * @brief If this member is true, then the worker shall be suspended during * the rtems_task_wake_after() call. */ - bool suspended;; + bool suspended; /** * @brief This member contains the timer information of the worker task. */ - TaskTimerInfo timer_info;; + TaskTimerInfo timer_info; /** * @brief This member contains the return value of the diff --git a/testsuites/validation/tc-task-wake-when.c b/testsuites/validation/tc-task-wake-when.c index cd95555adc..bb31fded26 100644 --- a/testsuites/validation/tc-task-wake-when.c +++ b/testsuites/validation/tc-task-wake-when.c @@ -131,23 +131,23 @@ typedef struct { /** * @brief This member provides the scheduler operation records. */ - T_scheduler_log_4 scheduler_log;; + T_scheduler_log_4 scheduler_log; /** * @brief This member contains the CLOCK_REALTIME value before the * rtems_task_wake_when() call. */ - struct timespec now;; + struct timespec now; /** * @brief This member contains the worker task identifier. */ - rtems_id worker_id;; + rtems_id worker_id; /** * @brief This member contains the timer information of the worker task. */ - TaskTimerInfo timer_info;; + TaskTimerInfo timer_info; /** * @brief This member provides the object referenced by the ``time_buffer`` diff --git a/testsuites/validation/tc-task.c b/testsuites/validation/tc-task.c index ce1c5ffd8b..5ab96445ed 100644 --- a/testsuites/validation/tc-task.c +++ b/testsuites/validation/tc-task.c @@ -303,7 +303,7 @@ static void RtemsTaskValTask_Action_8( void ) static void RtemsTaskValTask_Action_9( void ) { rtems_status_code sc; - rtems_status_code id; + rtems_id id; /* * Create a task. Check that the home scheduler of the created task is diff --git a/testsuites/validation/tc-terminate.c b/testsuites/validation/tc-terminate.c index 3ea314efc3..b533092c19 100644 --- a/testsuites/validation/tc-terminate.c +++ b/testsuites/validation/tc-terminate.c @@ -58,7 +58,6 @@ #include <rtems/bspIo.h> #include <rtems/test-info.h> #include <rtems/score/atomic.h> -#include <rtems/score/io.h> #include <rtems/score/percpu.h> #include <rtems/score/sysstate.h> diff --git a/testsuites/validation/tc-thread-idle-body-no-return.c b/testsuites/validation/tc-thread-idle-body-no-return.c index 303f80faf9..19c86dad99 100644 --- a/testsuites/validation/tc-thread-idle-body-no-return.c +++ b/testsuites/validation/tc-thread-idle-body-no-return.c @@ -90,7 +90,7 @@ typedef struct { /** * @brief This member contains a counter. */ - uint32_t counter;; + uint32_t counter; } ScoreThreadValIdleBodyNoReturn_Context; static ScoreThreadValIdleBodyNoReturn_Context @@ -100,19 +100,30 @@ typedef ScoreThreadValIdleBodyNoReturn_Context Context; static void CheckIdleBody( Context *ctx, rtems_task_entry entry ) { - rtems_id id; + rtems_id id; + rtems_interval interval; + rtems_status_code sc; ctx->counter = 0; id = CreateTask( "WORK", PRIO_LOW ); StartTask( id, entry, ctx ); - while ( ctx->counter == 0 ) { - rtems_status_code sc; + /* + * With optimization disabled, coverage enabled, SMP enabled and a slow + * target, things may take some time. + */ + interval = 1; + while ( ctx->counter == 0 && interval <= 1024 ) { - sc = rtems_task_wake_after( 1 ); + sc = rtems_task_wake_after( interval ); T_rsc_success( sc ); + + interval *= 2; } + sc = rtems_task_wake_after( interval ); + T_rsc_success( sc ); + T_eq_u32( ctx->counter, 1 ); DeleteTask( id ); } diff --git a/testsuites/validation/tc-timer-reset.c b/testsuites/validation/tc-timer-reset.c index d720b83073..709b9fe8a5 100644 --- a/testsuites/validation/tc-timer-reset.c +++ b/testsuites/validation/tc-timer-reset.c @@ -225,7 +225,7 @@ typedef struct { * @brief This member contains a reference to the user data to be used in the * next call to the Timer Service Routine. */ - void **scheduled_user_data;; + void **scheduled_user_data; /** * @brief This member contains 1 if the Timer Service Routine "A" has been diff --git a/testsuites/validation/tc-userext-create.c b/testsuites/validation/tc-userext-create.c index 9a23523190..a15ccf6c1a 100644 --- a/testsuites/validation/tc-userext-create.c +++ b/testsuites/validation/tc-userext-create.c @@ -129,13 +129,13 @@ typedef struct { typedef struct { void *seized_objects; - rtems_extensions_table table_variable;; + rtems_extensions_table table_variable; rtems_id id_value; rtems_name name; - rtems_extensions_table *table;; + rtems_extensions_table *table; rtems_id *id; diff --git a/testsuites/validation/tc-userext.c b/testsuites/validation/tc-userext.c index bb5e064974..192be30669 100644 --- a/testsuites/validation/tc-userext.c +++ b/testsuites/validation/tc-userext.c @@ -159,6 +159,18 @@ * - Check that the thread terminate extension of the extension set deleted * before its turn in the invocation was not invoked. * + * - Create five dynamic extensions. Let an idle thread return from its entry. + * Delete three dynamic extension during the thread exitted invocation. + * Clean up the used resources. + * + * - Check that the thread exitted extensions were invoked in the right + * order. + * + * - Check that the other extensions were not invoked. + * + * - Check that the thread exitted extension of the extension set deleted + * before its turn in the invocation was not invoked. + * * @{ */ @@ -293,7 +305,13 @@ static void Extension( if ( index == 6 && ( kind == THREAD_EXITTED || kind == THREAD_RESTART ) ) { StopTestCase(); - rtems_task_exit(); + + if ( GetExecuting()->is_idle ) { + SetSelfPriority( RTEMS_MAXIMUM_PRIORITY ); + _CPU_Thread_Idle_body( 0 ); + } else { + rtems_task_exit(); + } } if ( index == 0 && kind == THREAD_TERMINATE ) { @@ -516,6 +534,18 @@ static void TerminateWorker( rtems_task_argument arg ) rtems_task_exit(); } +void *IdleBody( uintptr_t arg ) +{ + rtems_event_set events; + + do { + events = PollAnyEvents(); + } while ( events == 0 ); + + (void) StartTestCase( THREAD_EXITTED ); + return (void *) arg; +} + static void RtemsUserextValUserext_Setup( void *ctx ) { SetSelfPriority( PRIO_NORMAL ); @@ -832,6 +862,45 @@ static void RtemsUserextValUserext_Action_6( void ) } /** + * @brief Create five dynamic extensions. Let an idle thread return from its + * entry. Delete three dynamic extension during the thread exitted + * invocation. Clean up the used resources. + */ +static void RtemsUserextValUserext_Action_7( void ) +{ + rtems_tcb *thread; + rtems_id id; + + /* ID of idle thread of processor 0 */ + id = 0x09010001; + thread = GetThread( id ); + SendEvents( id, RTEMS_EVENT_0 ); + SetPriority( id, PRIO_HIGH ); + + /* + * Check that the thread exitted extensions were invoked in the right order. + */ + CheckForward( THREAD_EXITTED, 1, 1, thread, NULL ); + + /* + * Check that the other extensions were not invoked. + */ + CheckForward( THREAD_BEGIN, 0, 0, NULL, NULL ); + CheckForward( THREAD_CREATE, 0, 0, NULL, NULL ); + CheckReverse( THREAD_DELETE, 0, 0, NULL, NULL ); + CheckForward( THREAD_RESTART, 0, 0, NULL, NULL ); + CheckForward( THREAD_START, 0, 0, NULL, NULL ); + CheckForward( THREAD_SWITCH, 0, 0, NULL, NULL ); + CheckReverse( THREAD_TERMINATE, 0, 0, NULL, NULL ); + + /* + * Check that the thread exitted extension of the extension set deleted + * before its turn in the invocation was not invoked. + */ + CheckDeletedNotInvoked( THREAD_EXITTED ); +} + +/** * @fn void T_case_body_RtemsUserextValUserext( void ) */ T_TEST_CASE_FIXTURE( RtemsUserextValUserext, &RtemsUserextValUserext_Fixture ) @@ -843,6 +912,7 @@ T_TEST_CASE_FIXTURE( RtemsUserextValUserext, &RtemsUserextValUserext_Fixture ) RtemsUserextValUserext_Action_4(); RtemsUserextValUserext_Action_5(); RtemsUserextValUserext_Action_6(); + RtemsUserextValUserext_Action_7(); } /** @} */ diff --git a/testsuites/validation/tr-event-constant.c b/testsuites/validation/tr-event-constant.c index 82b3129fde..a0327973de 100644 --- a/testsuites/validation/tr-event-constant.c +++ b/testsuites/validation/tr-event-constant.c @@ -681,6 +681,11 @@ static void RtemsEventValEventConstant_Action_16( static T_fixture_node RtemsEventValEventConstant_Node; +static T_remark RtemsEventValEventConstant_Remark = { + .next = NULL, + .remark = "RtemsEventValEventConstant" +}; + void RtemsEventValEventConstant_Run( rtems_event_set event, int number ) { RtemsEventValEventConstant_Context *ctx; @@ -714,6 +719,7 @@ void RtemsEventValEventConstant_Run( rtems_event_set event, int number ) RtemsEventValEventConstant_Action_15( ctx ); RtemsEventValEventConstant_Action_16( ctx ); + T_add_remark( &RtemsEventValEventConstant_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-event-send-receive.c b/testsuites/validation/tr-event-send-receive.c index 1437223c41..85d0040615 100644 --- a/testsuites/validation/tr-event-send-receive.c +++ b/testsuites/validation/tr-event-send-receive.c @@ -1250,6 +1250,11 @@ static void RtemsEventReqSendReceive_TestVariant( static T_fixture_node RtemsEventReqSendReceive_Node; +static T_remark RtemsEventReqSendReceive_Remark = { + .next = NULL, + .remark = "RtemsEventReqSendReceive" +}; + void RtemsEventReqSendReceive_Run( rtems_status_code ( *send )( rtems_id, rtems_event_set ), rtems_status_code ( *receive )( rtems_event_set, rtems_option, rtems_interval, rtems_event_set * ), @@ -1309,6 +1314,7 @@ void RtemsEventReqSendReceive_Run( } } + T_add_remark( &RtemsEventReqSendReceive_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-mtx-seize-try.c b/testsuites/validation/tr-mtx-seize-try.c index 23f90629c9..ddc995c2e1 100644 --- a/testsuites/validation/tr-mtx-seize-try.c +++ b/testsuites/validation/tr-mtx-seize-try.c @@ -53,10 +53,6 @@ #endif #include "tr-mtx-seize-try.h" -#include "tr-tq-enqueue-ceiling.h" -#include "tr-tq-enqueue-fifo.h" -#include "tr-tq-enqueue-mrsp.h" -#include "tr-tq-enqueue-priority.h" #include <rtems/test.h> @@ -88,19 +84,19 @@ typedef struct { * @brief If this member is true, then the calling thread shall be the owner * of the mutex. */ - bool owner_caller;; + bool owner_caller; /** * @brief If this member is true, then a thread other than the calling thread * shall be the owner of the mutex. */ - bool owner_other;; + bool owner_other; /** * @brief This member contains the current priority of the calling thread * before the directive call. */ - rtems_task_priority priority_before;; + rtems_task_priority priority_before; /** * @brief This member contains the owner of the mutex after the directive @@ -112,7 +108,7 @@ typedef struct { * @brief This member contains the current priority of the calling thread * after the directive call. */ - rtems_task_priority priority_after;; + rtems_task_priority priority_after; /** * @brief This member contains a copy of the corresponding @@ -805,6 +801,11 @@ static void ScoreMtxReqSeizeTry_TestVariant( ScoreMtxReqSeizeTry_Context *ctx ) static T_fixture_node ScoreMtxReqSeizeTry_Node; +static T_remark ScoreMtxReqSeizeTry_Remark = { + .next = NULL, + .remark = "ScoreMtxReqSeizeTry" +}; + void ScoreMtxReqSeizeTry_Run( TQMtxContext *tq_ctx ) { ScoreMtxReqSeizeTry_Context *ctx; @@ -860,6 +861,7 @@ void ScoreMtxReqSeizeTry_Run( TQMtxContext *tq_ctx ) } } + T_add_remark( &ScoreMtxReqSeizeTry_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-mtx-seize-wait.c b/testsuites/validation/tr-mtx-seize-wait.c index 5a8747b5d6..2e2fe9d1ec 100644 --- a/testsuites/validation/tr-mtx-seize-wait.c +++ b/testsuites/validation/tr-mtx-seize-wait.c @@ -56,7 +56,6 @@ #include "tr-tq-enqueue-ceiling.h" #include "tr-tq-enqueue-deadlock.h" #include "tr-tq-enqueue-fifo.h" -#include "tr-tq-enqueue-mrsp.h" #include "tr-tq-enqueue-priority-inherit.h" #include "tr-tq-enqueue-priority.h" @@ -92,24 +91,24 @@ typedef struct { * @brief If this member is true, then the calling thread shall be the owner * of the mutex. */ - bool owner_caller;; + bool owner_caller; /** * @brief If this member is true, then a thread other than the calling thread * shall be the owner of the mutex. */ - bool owner_other;; + bool owner_other; /** * @brief If this member is true, then a deadlock shall occur. */ - bool deadlock;; + bool deadlock; /** * @brief This member contains the current priority of the calling thread * before the directive call. */ - rtems_task_priority priority_before;; + rtems_task_priority priority_before; /** * @brief This member contains the owner of the mutex after the directive @@ -121,7 +120,7 @@ typedef struct { * @brief This member contains the current priority of the calling thread * after the directive call. */ - rtems_task_priority priority_after;; + rtems_task_priority priority_after; /** * @brief This member contains a copy of the corresponding @@ -218,6 +217,10 @@ static const char * const * const ScoreMtxReqSeizeWait_PreDesc[] = { NULL }; +#if defined(RTEMS_SMP) +#include "tr-tq-enqueue-mrsp.h" +#endif + typedef ScoreMtxReqSeizeWait_Context Context; static Status_Control Status( const Context *ctx, Status_Control status ) @@ -707,7 +710,7 @@ static void ScoreMtxReqSeizeWait_Post_Enqueued_Check( case ScoreMtxReqSeizeWait_Post_Enqueued_PriorityInherit: { /* - * The calling thread shall be enqueued in priority order with priorit + * The calling thread shall be enqueued in priority order with priority * inheritance. */ ScoreTqReqEnqueuePriorityInherit_Run( &ctx->tq_ctx->base ); @@ -728,7 +731,11 @@ static void ScoreMtxReqSeizeWait_Post_Enqueued_Check( * The calling thread shall be enqueued in priority order according to * the MrsP locking protocol. */ + #if defined(RTEMS_SMP) ScoreTqReqEnqueueMrsp_Run( &ctx->tq_ctx->base ); + #else + T_unreachable(); + #endif break; } @@ -1072,6 +1079,11 @@ static void ScoreMtxReqSeizeWait_TestVariant( static T_fixture_node ScoreMtxReqSeizeWait_Node; +static T_remark ScoreMtxReqSeizeWait_Remark = { + .next = NULL, + .remark = "ScoreMtxReqSeizeWait" +}; + void ScoreMtxReqSeizeWait_Run( TQMtxContext *tq_ctx ) { ScoreMtxReqSeizeWait_Context *ctx; @@ -1133,6 +1145,7 @@ void ScoreMtxReqSeizeWait_Run( TQMtxContext *tq_ctx ) } } + T_add_remark( &ScoreMtxReqSeizeWait_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-mtx-surrender.c b/testsuites/validation/tr-mtx-surrender.c index e02b7282bd..3c60726803 100644 --- a/testsuites/validation/tr-mtx-surrender.c +++ b/testsuites/validation/tr-mtx-surrender.c @@ -53,7 +53,6 @@ #endif #include "tr-mtx-surrender.h" -#include "tr-tq-surrender-mrsp.h" #include "tr-tq-surrender-priority-inherit.h" #include "tr-tq-surrender.h" @@ -252,6 +251,10 @@ static const char * const * const ScoreMtxReqSurrender_PreDesc[] = { NULL }; +#if defined(RTEMS_SMP) +#include "tr-tq-surrender-mrsp.h" +#endif + typedef ScoreMtxReqSurrender_Context Context; static Status_Control Status( const Context *ctx, Status_Control status ) @@ -810,8 +813,12 @@ static void ScoreMtxReqSurrender_Post_Surrender_Check( * The thread queue of the mutex shall be surrendered in priority order * with MrsP. */ + #if defined(RTEMS_SMP) T_eq_u32( ctx->counter, 1 ); ScoreTqReqSurrenderMrsp_Run( &ctx->tq_ctx->base ); + #else + T_unreachable(); + #endif break; } @@ -1154,6 +1161,11 @@ static void ScoreMtxReqSurrender_TestVariant( static T_fixture_node ScoreMtxReqSurrender_Node; +static T_remark ScoreMtxReqSurrender_Remark = { + .next = NULL, + .remark = "ScoreMtxReqSurrender" +}; + void ScoreMtxReqSurrender_Run( TQMtxContext *tq_ctx ) { ScoreMtxReqSurrender_Context *ctx; @@ -1227,6 +1239,7 @@ void ScoreMtxReqSurrender_Run( TQMtxContext *tq_ctx ) } } + T_add_remark( &ScoreMtxReqSurrender_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-object-ident-local.c b/testsuites/validation/tr-object-ident-local.c index 6339bd50b5..5cf521fbd6 100644 --- a/testsuites/validation/tr-object-ident-local.c +++ b/testsuites/validation/tr-object-ident-local.c @@ -350,6 +350,11 @@ static void RtemsReqIdentLocal_TestVariant( RtemsReqIdentLocal_Context *ctx ) static T_fixture_node RtemsReqIdentLocal_Node; +static T_remark RtemsReqIdentLocal_Remark = { + .next = NULL, + .remark = "RtemsReqIdentLocal" +}; + void RtemsReqIdentLocal_Run( rtems_id id_local_object, rtems_name name_local_object, @@ -382,6 +387,7 @@ void RtemsReqIdentLocal_Run( } } + T_add_remark( &RtemsReqIdentLocal_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-object-ident.c b/testsuites/validation/tr-object-ident.c index a2b8ecbb67..df66d51437 100644 --- a/testsuites/validation/tr-object-ident.c +++ b/testsuites/validation/tr-object-ident.c @@ -454,6 +454,11 @@ static void RtemsReqIdent_TestVariant( RtemsReqIdent_Context *ctx ) static T_fixture_node RtemsReqIdent_Node; +static T_remark RtemsReqIdent_Remark = { + .next = NULL, + .remark = "RtemsReqIdent" +}; + void RtemsReqIdent_Run( rtems_id id_local_object, rtems_name name_local_object, @@ -492,6 +497,7 @@ void RtemsReqIdent_Run( } } + T_add_remark( &RtemsReqIdent_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-sem-seize-try.c b/testsuites/validation/tr-sem-seize-try.c index c1a6f84e1d..3470f832fd 100644 --- a/testsuites/validation/tr-sem-seize-try.c +++ b/testsuites/validation/tr-sem-seize-try.c @@ -294,6 +294,11 @@ static void ScoreSemReqSeizeTry_TestVariant( ScoreSemReqSeizeTry_Context *ctx ) static T_fixture_node ScoreSemReqSeizeTry_Node; +static T_remark ScoreSemReqSeizeTry_Remark = { + .next = NULL, + .remark = "ScoreSemReqSeizeTry" +}; + void ScoreSemReqSeizeTry_Run( TQSemContext *tq_ctx ) { ScoreSemReqSeizeTry_Context *ctx; @@ -317,6 +322,7 @@ void ScoreSemReqSeizeTry_Run( TQSemContext *tq_ctx ) ScoreSemReqSeizeTry_TestVariant( ctx ); } + T_add_remark( &ScoreSemReqSeizeTry_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-sem-seize-wait.c b/testsuites/validation/tr-sem-seize-wait.c index ef312eb587..bbc1cfd252 100644 --- a/testsuites/validation/tr-sem-seize-wait.c +++ b/testsuites/validation/tr-sem-seize-wait.c @@ -368,6 +368,11 @@ static void ScoreSemReqSeizeWait_TestVariant( static T_fixture_node ScoreSemReqSeizeWait_Node; +static T_remark ScoreSemReqSeizeWait_Remark = { + .next = NULL, + .remark = "ScoreSemReqSeizeWait" +}; + void ScoreSemReqSeizeWait_Run( TQSemContext *tq_ctx ) { ScoreSemReqSeizeWait_Context *ctx; @@ -392,6 +397,7 @@ void ScoreSemReqSeizeWait_Run( TQSemContext *tq_ctx ) ScoreSemReqSeizeWait_TestVariant( ctx ); } + T_add_remark( &ScoreSemReqSeizeWait_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-sem-surrender.c b/testsuites/validation/tr-sem-surrender.c index 6b4f26cf05..d554a33dd2 100644 --- a/testsuites/validation/tr-sem-surrender.c +++ b/testsuites/validation/tr-sem-surrender.c @@ -528,6 +528,11 @@ static void ScoreSemReqSurrender_TestVariant( static T_fixture_node ScoreSemReqSurrender_Node; +static T_remark ScoreSemReqSurrender_Remark = { + .next = NULL, + .remark = "ScoreSemReqSurrender" +}; + void ScoreSemReqSurrender_Run( TQSemContext *tq_ctx ) { ScoreSemReqSurrender_Context *ctx; @@ -564,6 +569,7 @@ void ScoreSemReqSurrender_Run( TQSemContext *tq_ctx ) } } + T_add_remark( &ScoreSemReqSurrender_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-signal-constant.c b/testsuites/validation/tr-signal-constant.c index 00c2f132e8..c8aeb463fd 100644 --- a/testsuites/validation/tr-signal-constant.c +++ b/testsuites/validation/tr-signal-constant.c @@ -176,6 +176,11 @@ static void RtemsSignalValSignalConstant_Action_1( static T_fixture_node RtemsSignalValSignalConstant_Node; +static T_remark RtemsSignalValSignalConstant_Remark = { + .next = NULL, + .remark = "RtemsSignalValSignalConstant" +}; + void RtemsSignalValSignalConstant_Run( rtems_signal_set signal, int number ) { RtemsSignalValSignalConstant_Context *ctx; @@ -194,6 +199,7 @@ void RtemsSignalValSignalConstant_Run( rtems_signal_set signal, int number ) RtemsSignalValSignalConstant_Action_0( ctx ); RtemsSignalValSignalConstant_Action_1( ctx ); + T_add_remark( &RtemsSignalValSignalConstant_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-enqueue-ceiling.c b/testsuites/validation/tr-tq-enqueue-ceiling.c index 107f32984c..a0b4077689 100644 --- a/testsuites/validation/tr-tq-enqueue-ceiling.c +++ b/testsuites/validation/tr-tq-enqueue-ceiling.c @@ -86,7 +86,7 @@ typedef struct { * @brief This member specifies the priority of a thread with an eligible * scheduler equal to an eligible scheduler of the enqueueing thread. */ - rtems_task_priority priority;; + rtems_task_priority priority; /** * @brief If this member is true, then a thread those eligible schedulers are @@ -94,7 +94,7 @@ typedef struct { * thread with an eligible scheduler equal to an eligible scheduler of the * enqueueing thread. */ - size_t other_before;; + size_t other_before; /** * @brief If this member is true, then a thread those eligible schedulers are @@ -102,7 +102,7 @@ typedef struct { * thread with an eligible scheduler equal to an eligible scheduler of the * enqueueing thread. */ - size_t other_after;; + size_t other_after; /** * @brief This member contains a copy of the corresponding @@ -454,7 +454,9 @@ static void ScoreTqReqEnqueueCeiling_Prepare( ScoreTqReqEnqueueCeiling_Context *ctx ) { - ctx->priority = PRIO_PSEUDO_ISR; ctx->other_before = false; ctx->other_after = false; + ctx->priority = PRIO_PSEUDO_ISR; + ctx->other_before = false; + ctx->other_after = false; } static void ScoreTqReqEnqueueCeiling_Action( @@ -643,6 +645,11 @@ static void ScoreTqReqEnqueueCeiling_TestVariant( static T_fixture_node ScoreTqReqEnqueueCeiling_Node; +static T_remark ScoreTqReqEnqueueCeiling_Remark = { + .next = NULL, + .remark = "ScoreTqReqEnqueueCeiling" +}; + void ScoreTqReqEnqueueCeiling_Run( TQContext *tq_ctx ) { ScoreTqReqEnqueueCeiling_Context *ctx; @@ -679,6 +686,7 @@ void ScoreTqReqEnqueueCeiling_Run( TQContext *tq_ctx ) } } + T_add_remark( &ScoreTqReqEnqueueCeiling_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-enqueue-deadlock.c b/testsuites/validation/tr-tq-enqueue-deadlock.c index afbe07f6d0..7f61cbc444 100644 --- a/testsuites/validation/tr-tq-enqueue-deadlock.c +++ b/testsuites/validation/tr-tq-enqueue-deadlock.c @@ -405,6 +405,11 @@ static void ScoreTqReqEnqueueDeadlock_TestVariant( static T_fixture_node ScoreTqReqEnqueueDeadlock_Node; +static T_remark ScoreTqReqEnqueueDeadlock_Remark = { + .next = NULL, + .remark = "ScoreTqReqEnqueueDeadlock" +}; + void ScoreTqReqEnqueueDeadlock_Run( TQContext *tq_ctx ) { ScoreTqReqEnqueueDeadlock_Context *ctx; @@ -435,6 +440,7 @@ void ScoreTqReqEnqueueDeadlock_Run( TQContext *tq_ctx ) } } + T_add_remark( &ScoreTqReqEnqueueDeadlock_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-enqueue-fifo.c b/testsuites/validation/tr-tq-enqueue-fifo.c index 85d3d0d338..27ac064797 100644 --- a/testsuites/validation/tr-tq-enqueue-fifo.c +++ b/testsuites/validation/tr-tq-enqueue-fifo.c @@ -305,6 +305,11 @@ static void ScoreTqReqEnqueueFifo_TestVariant( static T_fixture_node ScoreTqReqEnqueueFifo_Node; +static T_remark ScoreTqReqEnqueueFifo_Remark = { + .next = NULL, + .remark = "ScoreTqReqEnqueueFifo" +}; + void ScoreTqReqEnqueueFifo_Run( TQContext *tq_ctx ) { ScoreTqReqEnqueueFifo_Context *ctx; @@ -328,6 +333,7 @@ void ScoreTqReqEnqueueFifo_Run( TQContext *tq_ctx ) ScoreTqReqEnqueueFifo_TestVariant( ctx ); } + T_add_remark( &ScoreTqReqEnqueueFifo_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-enqueue-mrsp.c b/testsuites/validation/tr-tq-enqueue-mrsp.c index dbf5a6aa4b..14f1f17713 100644 --- a/testsuites/validation/tr-tq-enqueue-mrsp.c +++ b/testsuites/validation/tr-tq-enqueue-mrsp.c @@ -88,7 +88,7 @@ typedef struct { * with an eligible scheduler equal to an eligible scheduler of the * enqueueing thread. */ - rtems_task_priority priority;; + rtems_task_priority priority; /** * @brief If this member is true, then a thread those eligible schedulers are @@ -96,7 +96,7 @@ typedef struct { * thread with an eligible scheduler equal to an eligible scheduler of the * enqueueing thread. */ - size_t other_before;; + size_t other_before; /** * @brief If this member is true, then a thread those eligible schedulers are @@ -104,7 +104,7 @@ typedef struct { * thread with an eligible scheduler equal to an eligible scheduler of the * enqueueing thread. */ - size_t other_after;; + size_t other_after; /** * @brief This member contains a copy of the corresponding @@ -611,6 +611,11 @@ static void ScoreTqReqEnqueueMrsp_TestVariant( static T_fixture_node ScoreTqReqEnqueueMrsp_Node; +static T_remark ScoreTqReqEnqueueMrsp_Remark = { + .next = NULL, + .remark = "ScoreTqReqEnqueueMrsp" +}; + void ScoreTqReqEnqueueMrsp_Run( TQContext *tq_ctx ) { ScoreTqReqEnqueueMrsp_Context *ctx; @@ -646,6 +651,7 @@ void ScoreTqReqEnqueueMrsp_Run( TQContext *tq_ctx ) } } + T_add_remark( &ScoreTqReqEnqueueMrsp_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-enqueue-priority-inherit.c b/testsuites/validation/tr-tq-enqueue-priority-inherit.c index 734e14395c..160e2d7825 100644 --- a/testsuites/validation/tr-tq-enqueue-priority-inherit.c +++ b/testsuites/validation/tr-tq-enqueue-priority-inherit.c @@ -1668,6 +1668,11 @@ static void ScoreTqReqEnqueuePriorityInherit_TestVariant( static T_fixture_node ScoreTqReqEnqueuePriorityInherit_Node; +static T_remark ScoreTqReqEnqueuePriorityInherit_Remark = { + .next = NULL, + .remark = "ScoreTqReqEnqueuePriorityInherit" +}; + void ScoreTqReqEnqueuePriorityInherit_Run( TQContext *tq_ctx ) { ScoreTqReqEnqueuePriorityInherit_Context *ctx; @@ -1730,6 +1735,7 @@ void ScoreTqReqEnqueuePriorityInherit_Run( TQContext *tq_ctx ) } } + T_add_remark( &ScoreTqReqEnqueuePriorityInherit_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-enqueue-priority.c b/testsuites/validation/tr-tq-enqueue-priority.c index ff0c4493e7..18818e34cd 100644 --- a/testsuites/validation/tr-tq-enqueue-priority.c +++ b/testsuites/validation/tr-tq-enqueue-priority.c @@ -86,7 +86,7 @@ typedef struct { * @brief This member specifies the priority of a thread with an eligible * scheduler equal to an eligible scheduler of the enqueueing thread. */ - rtems_task_priority priority;; + rtems_task_priority priority; /** * @brief If this member is true, then a thread those eligible schedulers are @@ -94,7 +94,7 @@ typedef struct { * thread with an eligible scheduler equal to an eligible scheduler of the * enqueueing thread. */ - size_t other_before;; + size_t other_before; /** * @brief If this member is true, then a thread those eligible schedulers are @@ -102,7 +102,7 @@ typedef struct { * thread with an eligible scheduler equal to an eligible scheduler of the * enqueueing thread. */ - size_t other_after;; + size_t other_after; /** * @brief This member contains a copy of the corresponding @@ -703,6 +703,11 @@ static void ScoreTqReqEnqueuePriority_TestVariant( static T_fixture_node ScoreTqReqEnqueuePriority_Node; +static T_remark ScoreTqReqEnqueuePriority_Remark = { + .next = NULL, + .remark = "ScoreTqReqEnqueuePriority" +}; + void ScoreTqReqEnqueuePriority_Run( TQContext *tq_ctx ) { ScoreTqReqEnqueuePriority_Context *ctx; @@ -739,6 +744,7 @@ void ScoreTqReqEnqueuePriority_Run( TQContext *tq_ctx ) } } + T_add_remark( &ScoreTqReqEnqueuePriority_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-flush-fifo.c b/testsuites/validation/tr-tq-flush-fifo.c index 4bd0573979..785d7b37a1 100644 --- a/testsuites/validation/tr-tq-flush-fifo.c +++ b/testsuites/validation/tr-tq-flush-fifo.c @@ -633,6 +633,11 @@ static void ScoreTqReqFlushFifo_TestVariant( ScoreTqReqFlushFifo_Context *ctx ) static T_fixture_node ScoreTqReqFlushFifo_Node; +static T_remark ScoreTqReqFlushFifo_Remark = { + .next = NULL, + .remark = "ScoreTqReqFlushFifo" +}; + void ScoreTqReqFlushFifo_Run( TQContext *tq_ctx, bool may_stop ) { ScoreTqReqFlushFifo_Context *ctx; @@ -682,6 +687,7 @@ void ScoreTqReqFlushFifo_Run( TQContext *tq_ctx, bool may_stop ) } } + T_add_remark( &ScoreTqReqFlushFifo_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-flush-priority-inherit.c b/testsuites/validation/tr-tq-flush-priority-inherit.c index 19198e6eae..903dc20cf2 100644 --- a/testsuites/validation/tr-tq-flush-priority-inherit.c +++ b/testsuites/validation/tr-tq-flush-priority-inherit.c @@ -81,7 +81,7 @@ typedef struct { /** * @brief This member contains the call within ISR request. */ - CallWithinISRRequest request;; + CallWithinISRRequest request; /** * @brief If this member is true, then a minimum priority of the owner of the @@ -535,6 +535,11 @@ static void ScoreTqReqFlushPriorityInherit_TestVariant( static T_fixture_node ScoreTqReqFlushPriorityInherit_Node; +static T_remark ScoreTqReqFlushPriorityInherit_Remark = { + .next = NULL, + .remark = "ScoreTqReqFlushPriorityInherit" +}; + void ScoreTqReqFlushPriorityInherit_Run( TQContext *tq_ctx ) { ScoreTqReqFlushPriorityInherit_Context *ctx; @@ -565,6 +570,7 @@ void ScoreTqReqFlushPriorityInherit_Run( TQContext *tq_ctx ) } } + T_add_remark( &ScoreTqReqFlushPriorityInherit_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-flush-priority.c b/testsuites/validation/tr-tq-flush-priority.c index 3f1c1f3ca8..b8a06c2340 100644 --- a/testsuites/validation/tr-tq-flush-priority.c +++ b/testsuites/validation/tr-tq-flush-priority.c @@ -78,7 +78,7 @@ typedef struct { /** * @brief This member contains the call within ISR request. */ - CallWithinISRRequest request;; + CallWithinISRRequest request; /** * @brief This member contains a copy of the corresponding @@ -385,6 +385,11 @@ static void ScoreTqReqFlushPriority_TestVariant( static T_fixture_node ScoreTqReqFlushPriority_Node; +static T_remark ScoreTqReqFlushPriority_Remark = { + .next = NULL, + .remark = "ScoreTqReqFlushPriority" +}; + void ScoreTqReqFlushPriority_Run( TQContext *tq_ctx, bool supports_multiple_priority_queues @@ -412,6 +417,7 @@ void ScoreTqReqFlushPriority_Run( ScoreTqReqFlushPriority_TestVariant( ctx ); } + T_add_remark( &ScoreTqReqFlushPriority_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-surrender-mrsp.c b/testsuites/validation/tr-tq-surrender-mrsp.c index 6eca2e0174..903146ccbe 100644 --- a/testsuites/validation/tr-tq-surrender-mrsp.c +++ b/testsuites/validation/tr-tq-surrender-mrsp.c @@ -353,7 +353,7 @@ static void ScoreTqReqSurrenderMrsp_Pre_Suspended_Prepare( switch ( state ) { case ScoreTqReqSurrenderMrsp_Pre_Suspended_Yes: { /* - * Whiel the new owner is suspended. + * While the new owner is suspended. */ ctx->suspended = true; break; @@ -361,7 +361,7 @@ static void ScoreTqReqSurrenderMrsp_Pre_Suspended_Prepare( case ScoreTqReqSurrenderMrsp_Pre_Suspended_No: { /* - * Whiel the new owner is not suspended. + * While the new owner is not suspended. */ ctx->suspended = false; break; @@ -974,6 +974,11 @@ static void ScoreTqReqSurrenderMrsp_TestVariant( static T_fixture_node ScoreTqReqSurrenderMrsp_Node; +static T_remark ScoreTqReqSurrenderMrsp_Remark = { + .next = NULL, + .remark = "ScoreTqReqSurrenderMrsp" +}; + void ScoreTqReqSurrenderMrsp_Run( TQContext *tq_ctx ) { ScoreTqReqSurrenderMrsp_Context *ctx; @@ -1029,6 +1034,7 @@ void ScoreTqReqSurrenderMrsp_Run( TQContext *tq_ctx ) } } + T_add_remark( &ScoreTqReqSurrenderMrsp_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-surrender-priority-inherit.c b/testsuites/validation/tr-tq-surrender-priority-inherit.c index 1e6349a765..d0a580f988 100644 --- a/testsuites/validation/tr-tq-surrender-priority-inherit.c +++ b/testsuites/validation/tr-tq-surrender-priority-inherit.c @@ -96,7 +96,7 @@ typedef struct { /** * @brief This member contains the call within ISR request. */ - CallWithinISRRequest request;; + CallWithinISRRequest request; /** * @brief This member contains the barrier to synchronize the runner and the @@ -921,7 +921,7 @@ static void ScoreTqReqSurrenderPriorityInherit_Pre_Suspended_Prepare( switch ( state ) { case ScoreTqReqSurrenderPriorityInherit_Pre_Suspended_Yes: { /* - * Whiel the new owner is suspended. + * While the new owner is suspended. */ ctx->suspended = true; break; @@ -929,7 +929,7 @@ static void ScoreTqReqSurrenderPriorityInherit_Pre_Suspended_Prepare( case ScoreTqReqSurrenderPriorityInherit_Pre_Suspended_No: { /* - * Whiel the new owner is not suspended. + * While the new owner is not suspended. */ ctx->suspended = false; break; @@ -2435,6 +2435,11 @@ static void ScoreTqReqSurrenderPriorityInherit_TestVariant( static T_fixture_node ScoreTqReqSurrenderPriorityInherit_Node; +static T_remark ScoreTqReqSurrenderPriorityInherit_Remark = { + .next = NULL, + .remark = "ScoreTqReqSurrenderPriorityInherit" +}; + void ScoreTqReqSurrenderPriorityInherit_Run( TQContext *tq_ctx ) { ScoreTqReqSurrenderPriorityInherit_Context *ctx; @@ -2510,6 +2515,7 @@ void ScoreTqReqSurrenderPriorityInherit_Run( TQContext *tq_ctx ) } } + T_add_remark( &ScoreTqReqSurrenderPriorityInherit_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-surrender.c b/testsuites/validation/tr-tq-surrender.c index f2c60c5f3d..ce680d71d2 100644 --- a/testsuites/validation/tr-tq-surrender.c +++ b/testsuites/validation/tr-tq-surrender.c @@ -84,7 +84,7 @@ typedef struct { /** * @brief This member contains the call within ISR request. */ - CallWithinISRRequest request;; + CallWithinISRRequest request; /** * @brief This member contains the barrier to synchronize the runner and the @@ -637,6 +637,11 @@ static void ScoreTqReqSurrender_TestVariant( ScoreTqReqSurrender_Context *ctx ) static T_fixture_node ScoreTqReqSurrender_Node; +static T_remark ScoreTqReqSurrender_Remark = { + .next = NULL, + .remark = "ScoreTqReqSurrender" +}; + void ScoreTqReqSurrender_Run( TQContext *tq_ctx ) { ScoreTqReqSurrender_Context *ctx; @@ -678,6 +683,7 @@ void ScoreTqReqSurrender_Run( TQContext *tq_ctx ) } } + T_add_remark( &ScoreTqReqSurrender_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-timeout-mrsp.c b/testsuites/validation/tr-tq-timeout-mrsp.c index f143f9b3ab..7362e1943b 100644 --- a/testsuites/validation/tr-tq-timeout-mrsp.c +++ b/testsuites/validation/tr-tq-timeout-mrsp.c @@ -439,6 +439,11 @@ static void ScoreTqReqTimeoutMrsp_TestVariant( static T_fixture_node ScoreTqReqTimeoutMrsp_Node; +static T_remark ScoreTqReqTimeoutMrsp_Remark = { + .next = NULL, + .remark = "ScoreTqReqTimeoutMrsp" +}; + void ScoreTqReqTimeoutMrsp_Run( TQContext *tq_ctx ) { ScoreTqReqTimeoutMrsp_Context *ctx; @@ -470,6 +475,7 @@ void ScoreTqReqTimeoutMrsp_Run( TQContext *tq_ctx ) } } + T_add_remark( &ScoreTqReqTimeoutMrsp_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-timeout-priority-inherit.c b/testsuites/validation/tr-tq-timeout-priority-inherit.c index c794ddc085..12ac70df90 100644 --- a/testsuites/validation/tr-tq-timeout-priority-inherit.c +++ b/testsuites/validation/tr-tq-timeout-priority-inherit.c @@ -93,7 +93,7 @@ typedef struct { /** * @brief This member contains the call within ISR request. */ - CallWithinISRRequest request;; + CallWithinISRRequest request; /** * @brief This member specifies the scheduler of the thread. @@ -2071,6 +2071,11 @@ static void ScoreTqReqTimeoutPriorityInherit_TestVariant( static T_fixture_node ScoreTqReqTimeoutPriorityInherit_Node; +static T_remark ScoreTqReqTimeoutPriorityInherit_Remark = { + .next = NULL, + .remark = "ScoreTqReqTimeoutPriorityInherit" +}; + void ScoreTqReqTimeoutPriorityInherit_Run( TQContext *tq_ctx ) { ScoreTqReqTimeoutPriorityInherit_Context *ctx; @@ -2148,6 +2153,7 @@ void ScoreTqReqTimeoutPriorityInherit_Run( TQContext *tq_ctx ) } } + T_add_remark( &ScoreTqReqTimeoutPriorityInherit_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/tr-tq-timeout.c b/testsuites/validation/tr-tq-timeout.c index b2f1436411..c9bc13a937 100644 --- a/testsuites/validation/tr-tq-timeout.c +++ b/testsuites/validation/tr-tq-timeout.c @@ -81,7 +81,7 @@ typedef struct { /** * @brief This member contains the call within ISR request. */ - CallWithinISRRequest request;; + CallWithinISRRequest request; /** * @brief This member contains a copy of the corresponding @@ -427,6 +427,11 @@ static void ScoreTqReqTimeout_TestVariant( ScoreTqReqTimeout_Context *ctx ) static T_fixture_node ScoreTqReqTimeout_Node; +static T_remark ScoreTqReqTimeout_Remark = { + .next = NULL, + .remark = "ScoreTqReqTimeout" +}; + void ScoreTqReqTimeout_Run( TQContext *tq_ctx ) { ScoreTqReqTimeout_Context *ctx; @@ -447,6 +452,7 @@ void ScoreTqReqTimeout_Run( TQContext *tq_ctx ) ScoreTqReqTimeout_TestVariant( ctx ); } + T_add_remark( &ScoreTqReqTimeout_Remark ); T_pop_fixture(); } diff --git a/testsuites/validation/ts-userext.c b/testsuites/validation/ts-userext.c index b4531b579b..461a1ddc0e 100644 --- a/testsuites/validation/ts-userext.c +++ b/testsuites/validation/ts-userext.c @@ -92,6 +92,8 @@ const char rtems_test_name[] = "TestsuitesUserext"; .thread_terminate = ThreadTerminateExtension1 \ } +#define CONFIGURE_IDLE_TASK_BODY IdleBody + #include "ts-default.h" /** @} */ diff --git a/testsuites/validation/tx-call-within-isr.c b/testsuites/validation/tx-call-within-isr.c index 63a9a6dc26..8bbe0e7c29 100644 --- a/testsuites/validation/tx-call-within-isr.c +++ b/testsuites/validation/tx-call-within-isr.c @@ -140,6 +140,7 @@ void CallWithinISRWait( const CallWithinISRRequest *request ) } } +#if !defined( TM27_INTERRUPT_VECTOR_DEFAULT ) static void CallWithinISRIsHandlerInstalled( void *arg, const char *info, @@ -152,13 +153,17 @@ static void CallWithinISRIsHandlerInstalled( (void) option; (void) handler_arg; - if ( handler == CallWithinISRHandler ) { + if ( handler == CallWithinISRHandler && handler_arg == NULL ) { *(bool *) arg = true; } } +#endif rtems_vector_number CallWithinISRGetVector( void ) { +#if defined( TM27_INTERRUPT_VECTOR_DEFAULT ) + return TM27_INTERRUPT_VECTOR_DEFAULT; +#else rtems_vector_number vector; for ( vector = 0; vector < BSP_INTERRUPT_VECTOR_COUNT; ++vector ) { @@ -177,6 +182,38 @@ rtems_vector_number CallWithinISRGetVector( void ) } return UINT32_MAX; +#endif +} + +rtems_vector_number GetSoftwareInterruptVector( void ) +{ +#if defined( TM27_INTERRUPT_VECTOR_ALTERNATIVE ) + return TM27_INTERRUPT_VECTOR_ALTERNATIVE; +#else + return UINT32_MAX; +#endif +} + +rtems_status_code RaiseSoftwareInterrupt( rtems_vector_number vector ) +{ +#if defined( TM27_INTERRUPT_VECTOR_ALTERNATIVE ) + if ( vector == TM27_INTERRUPT_VECTOR_ALTERNATIVE ) { + return _TM27_Raise_alternative(); + } +#endif + + return rtems_interrupt_raise( vector ); +} + +rtems_status_code ClearSoftwareInterrupt( rtems_vector_number vector ) +{ +#if defined( TM27_INTERRUPT_VECTOR_ALTERNATIVE ) + if ( vector == TM27_INTERRUPT_VECTOR_ALTERNATIVE ) { + return _TM27_Clear_alternative(); + } +#endif + + return rtems_interrupt_clear( vector ); } static void CallWithinISRInitialize( void ) diff --git a/testsuites/validation/tx-interrupt.c b/testsuites/validation/tx-interrupt.c index 400ccdf070..c5ea4142c2 100644 --- a/testsuites/validation/tx-interrupt.c +++ b/testsuites/validation/tx-interrupt.c @@ -139,6 +139,10 @@ rtems_vector_number GetTestableInterruptVector( } } + if ( vector == BSP_INTERRUPT_VECTOR_COUNT ) { + vector = GetSoftwareInterruptVector(); + } + return vector; } diff --git a/testsuites/validation/tx-support.h b/testsuites/validation/tx-support.h index e83b461e2b..378bc4c466 100644 --- a/testsuites/validation/tx-support.h +++ b/testsuites/validation/tx-support.h @@ -396,6 +396,8 @@ void CallWithinISRClear( void ); rtems_vector_number CallWithinISRGetVector( void ); +rtems_vector_number GetSoftwareInterruptVector( void ); + typedef struct { Thread_queue_Operations tq_ops; const Thread_queue_Operations *wrapped_ops; @@ -437,6 +439,10 @@ rtems_vector_number GetTestableInterruptVector( const rtems_interrupt_attributes *required ); +rtems_status_code RaiseSoftwareInterrupt( rtems_vector_number vector ); + +rtems_status_code ClearSoftwareInterrupt( rtems_vector_number vector ); + bool HasInterruptVectorEntriesInstalled( rtems_vector_number vector ); /** |