summaryrefslogtreecommitdiffstats
path: root/testsuites
diff options
context:
space:
mode:
Diffstat (limited to 'testsuites')
-rw-r--r--testsuites/ada/tmtests/tm01/init.c1
-rw-r--r--testsuites/ada/tmtests/tm02/init.c1
-rw-r--r--testsuites/ada/tmtests/tm03/init.c1
-rw-r--r--testsuites/ada/tmtests/tm04/init.c1
-rw-r--r--testsuites/ada/tmtests/tm05/init.c1
-rw-r--r--testsuites/ada/tmtests/tm06/init.c1
-rw-r--r--testsuites/ada/tmtests/tm07/init.c1
-rw-r--r--testsuites/ada/tmtests/tm08/init.c1
-rw-r--r--testsuites/ada/tmtests/tm09/init.c1
-rw-r--r--testsuites/ada/tmtests/tm10/init.c1
-rw-r--r--testsuites/ada/tmtests/tm11/init.c1
-rw-r--r--testsuites/ada/tmtests/tm12/init.c1
-rw-r--r--testsuites/ada/tmtests/tm13/init.c1
-rw-r--r--testsuites/ada/tmtests/tm14/init.c1
-rw-r--r--testsuites/ada/tmtests/tm15/init.c1
-rw-r--r--testsuites/ada/tmtests/tm16/init.c1
-rw-r--r--testsuites/ada/tmtests/tm17/init.c1
-rw-r--r--testsuites/ada/tmtests/tm18/init.c1
-rw-r--r--testsuites/ada/tmtests/tm19/init.c1
-rw-r--r--testsuites/ada/tmtests/tm20/init.c1
-rw-r--r--testsuites/ada/tmtests/tm21/init.c1
-rw-r--r--testsuites/ada/tmtests/tm22/init.c1
-rw-r--r--testsuites/ada/tmtests/tm23/init.c1
-rw-r--r--testsuites/ada/tmtests/tm24/init.c1
-rw-r--r--testsuites/ada/tmtests/tm25/init.c1
-rw-r--r--testsuites/ada/tmtests/tm28/init.c1
-rw-r--r--testsuites/ada/tmtests/tm29/init.c1
-rw-r--r--testsuites/ada/tmtests/tmck/init.c1
-rw-r--r--testsuites/benchmarks/dhrystone/dhry_1.c1
-rw-r--r--testsuites/benchmarks/linpack/linpack-pc.c2
-rw-r--r--testsuites/benchmarks/whetstone/whetstone.c2
-rw-r--r--testsuites/fstests/fsjffs2empty01/fsjffs2empty01.doc11
-rw-r--r--testsuites/fstests/fsjffs2empty01/fsjffs2empty01.scn6
-rw-r--r--testsuites/fstests/fsjffs2empty01/init.c245
-rw-r--r--testsuites/fstests/jffs2_nand_support/fs_config.h33
-rw-r--r--testsuites/fstests/jffs2_nand_support/fs_support.c257
-rw-r--r--testsuites/fstests/tftpfs/init.c59
-rw-r--r--testsuites/libtests/can01/can-loopback.c110
-rw-r--r--testsuites/libtests/can01/init.c249
-rw-r--r--testsuites/libtests/dl01/dl01-o1.c2
-rw-r--r--testsuites/libtests/dl02/dl02-o1.c2
-rw-r--r--testsuites/libtests/dl02/dl02-o2.c2
-rw-r--r--testsuites/libtests/dl05/dl05-o5.cc2
-rw-r--r--testsuites/libtests/dl06/dl06-o1.c2
-rw-r--r--testsuites/libtests/dl06/dl06-o2.c2
-rw-r--r--testsuites/libtests/dl07/dl-load.c1
-rw-r--r--testsuites/libtests/dl07/dl07-o1.c2
-rw-r--r--testsuites/libtests/dl07/dl07-o2.c2
-rw-r--r--testsuites/libtests/dl07/dl07-o3.c2
-rw-r--r--testsuites/libtests/dl07/dl07-o4.c2
-rw-r--r--testsuites/libtests/dl07/dl07-o5.c2
-rw-r--r--testsuites/libtests/dl08/dl08-o1.c2
-rw-r--r--testsuites/libtests/dl08/dl08-o2.c2
-rw-r--r--testsuites/libtests/dl08/dl08-o3.c2
-rw-r--r--testsuites/libtests/dl08/dl08-o4.c2
-rw-r--r--testsuites/libtests/dl08/dl08-o5.c2
-rw-r--r--testsuites/libtests/dl08/dl08-o6-123456789-123456789.c2
-rw-r--r--testsuites/libtests/dl09/dl-load.c16
-rw-r--r--testsuites/libtests/dl09/dl09-o1.c2
-rw-r--r--testsuites/libtests/dl09/dl09-o2.c2
-rw-r--r--testsuites/libtests/dl09/dl09-o3.c2
-rw-r--r--testsuites/libtests/dl09/dl09-o4.c2
-rw-r--r--testsuites/libtests/dl09/dl09-o5.c2
-rw-r--r--testsuites/libtests/dl10/dl10-o1.c2
-rw-r--r--testsuites/libtests/dl10/dl10-o2.c2
-rw-r--r--testsuites/libtests/dl10/dl10-o3.c2
-rw-r--r--testsuites/libtests/dl10/dl10-o4.c2
-rw-r--r--testsuites/libtests/dl10/dl10-o5.c2
-rw-r--r--testsuites/libtests/dl10/dl10-o6.c1
-rw-r--r--testsuites/libtests/dl11/dl-load.c95
-rw-r--r--testsuites/libtests/dl11/dl11-o1.c1
-rw-r--r--testsuites/libtests/dl11/init.c2
-rw-r--r--testsuites/libtests/flashdev01/init.c2
-rw-r--r--testsuites/libtests/regulator01/regulator01.c1310
-rw-r--r--testsuites/libtests/regulator01/regulator01.doc67
-rw-r--r--testsuites/libtests/regulator01/rtems_config.c59
-rw-r--r--testsuites/libtests/termios01/termios_testdriver.c2
-rw-r--r--testsuites/libtests/termios03/termios_testdriver_polled.c2
-rw-r--r--testsuites/libtests/termios04/termios_testdriver_impl.h2
-rw-r--r--testsuites/psxtests/psx13/test.c2
-rw-r--r--testsuites/psxtests/psxftw01/init.c62
-rw-r--r--testsuites/psxtests/psxkey07/init.c42
-rw-r--r--testsuites/rhealstone/rhdeadlockbrk/deadlockbrk.c1
-rw-r--r--testsuites/rhealstone/rhilatency/ilatency.c1
-rw-r--r--testsuites/rhealstone/rhmlatency/mlatency.c1
-rw-r--r--testsuites/rhealstone/rhtaskpreempt/taskpreempt.c1
-rw-r--r--testsuites/rhealstone/rhtaskswitch/taskswitch.c1
-rw-r--r--testsuites/samples/iostream/init.cc9
-rw-r--r--testsuites/smptests/smpipi01/init.c48
-rw-r--r--testsuites/smptests/smplock01/init.c115
-rw-r--r--testsuites/smptests/smplock01/smplock01.scn2811
-rwxr-xr-xtestsuites/smptests/smplock01/smplock01fair.py85
-rwxr-xr-xtestsuites/smptests/smplock01/smplock01perf.py68
-rw-r--r--testsuites/smptests/smpmulticast01/init.c18
-rw-r--r--testsuites/smptests/smpopenmp01/init.c36
-rw-r--r--testsuites/smptests/smpopenmp01/smpopenmp01.py71
-rw-r--r--testsuites/smptests/smpopenmp01/smpopenmp01.scn137
-rw-r--r--testsuites/sptests/sp37/init.c18
-rw-r--r--testsuites/sptests/spmisc01/init.c11
-rw-r--r--testsuites/sptests/spprintk/init.c25
-rw-r--r--testsuites/sptests/sptimecounter02/init.c78
-rwxr-xr-xtestsuites/sptests/sptimecounter02/sptimecounter02.py70
-rw-r--r--testsuites/sptests/sptimecounter02/sptimecounter02.scn1036
-rw-r--r--testsuites/sptests/sptimecounter03/init.c2
-rw-r--r--testsuites/sptests/sptls01/init.c37
-rw-r--r--testsuites/support/include/tmacros.h1
-rw-r--r--testsuites/tmtests/tm01/system.h1
-rw-r--r--testsuites/tmtests/tm02/system.h1
-rw-r--r--testsuites/tmtests/tm03/system.h1
-rw-r--r--testsuites/tmtests/tm04/system.h1
-rw-r--r--testsuites/tmtests/tm05/system.h1
-rw-r--r--testsuites/tmtests/tm06/system.h1
-rw-r--r--testsuites/tmtests/tm07/system.h1
-rw-r--r--testsuites/tmtests/tm08/system.h1
-rw-r--r--testsuites/tmtests/tm09/system.h1
-rw-r--r--testsuites/tmtests/tm10/system.h1
-rw-r--r--testsuites/tmtests/tm11/system.h1
-rw-r--r--testsuites/tmtests/tm12/system.h1
-rw-r--r--testsuites/tmtests/tm13/system.h1
-rw-r--r--testsuites/tmtests/tm14/system.h1
-rw-r--r--testsuites/tmtests/tm15/system.h1
-rw-r--r--testsuites/tmtests/tm16/system.h1
-rw-r--r--testsuites/tmtests/tm17/system.h1
-rw-r--r--testsuites/tmtests/tm18/system.h1
-rw-r--r--testsuites/tmtests/tm19/system.h1
-rw-r--r--testsuites/tmtests/tm20/system.h1
-rw-r--r--testsuites/tmtests/tm21/system.h1
-rw-r--r--testsuites/tmtests/tm22/system.h1
-rw-r--r--testsuites/tmtests/tm23/system.h1
-rw-r--r--testsuites/tmtests/tm24/system.h1
-rw-r--r--testsuites/tmtests/tm25/system.h1
-rw-r--r--testsuites/tmtests/tm26/system.h1
-rw-r--r--testsuites/tmtests/tm27/system.h1
-rw-r--r--testsuites/tmtests/tm28/system.h1
-rw-r--r--testsuites/tmtests/tm29/system.h1
-rw-r--r--testsuites/tmtests/tmck/system.h1
-rw-r--r--testsuites/tmtests/tmcontext01/init.c89
-rw-r--r--testsuites/tmtests/tmcontext01/plot.py73
-rw-r--r--testsuites/tmtests/tmcontext01/tmcontext01.scn379
-rw-r--r--testsuites/tmtests/tmfine01/init.c120
-rw-r--r--testsuites/tmtests/tmfine01/tmfine01.py93
-rw-r--r--testsuites/tmtests/tmfine01/tmfine01.scn4308
-rw-r--r--testsuites/tmtests/tmtimer01/init.c35
-rw-r--r--testsuites/tmtests/tmtimer01/plot.py52
-rw-r--r--testsuites/tmtests/tmtimer01/tmtimer01.scn389
-rw-r--r--testsuites/unit/tc-base64-decode.c186
-rw-r--r--testsuites/unit/tc-compiler-builtins.c1141
-rw-r--r--testsuites/unit/tc-config.c171
-rw-r--r--testsuites/unit/tc-crc.c48
-rw-r--r--testsuites/unit/tc-score-msgq.c452
-rw-r--r--testsuites/validation/bsps/tc-fatal-sparc-leon3-shutdown-halt.c142
-rw-r--r--testsuites/validation/bsps/tc-fatal-sparc-leon3-shutdown-request.c179
-rw-r--r--testsuites/validation/bsps/tc-sparc-gr712rc.c124
-rw-r--r--testsuites/validation/bsps/tr-fatal-clock-xil-ttc-irq-install.c187
-rw-r--r--testsuites/validation/bsps/tr-fatal-clock-xil-ttc-irq-install.h84
-rw-r--r--testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-boot.c175
-rw-r--r--testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-boot.h84
-rw-r--r--testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-secondary.c176
-rw-r--r--testsuites/validation/bsps/tr-fatal-sparc-leon3-cache-snooping-disabled-secondary.h84
-rw-r--r--testsuites/validation/bsps/tr-fatal-sparc-leon3-clock-initialization.c190
-rw-r--r--testsuites/validation/bsps/tr-fatal-sparc-leon3-clock-initialization.h84
-rw-r--r--testsuites/validation/bsps/ts-fatal-clock-xil-ttc-irq-install.c79
-rw-r--r--testsuites/validation/bsps/ts-fatal-sparc-leon3-cache-snooping-disabled-boot.c79
-rw-r--r--testsuites/validation/bsps/ts-fatal-sparc-leon3-cache-snooping-disabled-secondary.c82
-rw-r--r--testsuites/validation/bsps/ts-fatal-sparc-leon3-clock-initialization.c79
-rw-r--r--testsuites/validation/bsps/ts-fatal-sparc-leon3-shutdown-response.c94
-rw-r--r--testsuites/validation/bsps/ts-fatal-sparc-leon3-shutdown.c177
-rw-r--r--testsuites/validation/bsps/ts-validation-bsp-0.c73
-rw-r--r--testsuites/validation/tc-basedefs.c48
-rw-r--r--testsuites/validation/tc-clock-nanosleep.c10
-rw-r--r--testsuites/validation/tc-cpu-performance.c270
-rw-r--r--testsuites/validation/tc-dev-clock-xil-ttc.c136
-rw-r--r--testsuites/validation/tc-dev-grlib-apbuart-inbyte-nonblocking.c348
-rw-r--r--testsuites/validation/tc-dev-grlib-io.c295
-rw-r--r--testsuites/validation/tc-dev-grlib-irqamp-get-timestamp.c304
-rw-r--r--testsuites/validation/tc-futex-wait.c2
-rw-r--r--testsuites/validation/tc-futex-wake.c2
-rw-r--r--testsuites/validation/tc-intr-entry-install.c13
-rw-r--r--testsuites/validation/tc-intr-entry-remove.c4
-rw-r--r--testsuites/validation/tc-intr-get-affinity.c2
-rw-r--r--testsuites/validation/tc-intr-get-attributes.c2
-rw-r--r--testsuites/validation/tc-intr-is-pending.c2
-rw-r--r--testsuites/validation/tc-intr-vector-is-enabled.c2
-rw-r--r--testsuites/validation/tc-message-receive.c2
-rw-r--r--testsuites/validation/tc-message-urgent-send.c2
-rw-r--r--testsuites/validation/tc-part-performance.c3
-rw-r--r--testsuites/validation/tc-sched-smp.c5
-rw-r--r--testsuites/validation/tc-scheduler-add-processor.c6
-rw-r--r--testsuites/validation/tc-scheduler-ident-by-processor.c4
-rw-r--r--testsuites/validation/tc-scheduler-remove-processor.c8
-rw-r--r--testsuites/validation/tc-score-fatal.c87
-rw-r--r--testsuites/validation/tc-score-isr.c285
-rw-r--r--testsuites/validation/tc-score-thread.c94
-rw-r--r--testsuites/validation/tc-sem-create.c10
-rw-r--r--testsuites/validation/tc-sem-flush.c6
-rw-r--r--testsuites/validation/tc-sem-obtain.c25
-rw-r--r--testsuites/validation/tc-sem-performance.c18
-rw-r--r--testsuites/validation/tc-sem-smp.c4
-rw-r--r--testsuites/validation/tc-sem-timeout.c29
-rw-r--r--testsuites/validation/tc-signal-send.c4
-rw-r--r--testsuites/validation/tc-task-construct.c2
-rw-r--r--testsuites/validation/tc-task-delete.c11
-rw-r--r--testsuites/validation/tc-task-restart.c6
-rw-r--r--testsuites/validation/tc-task-set-affinity.c2
-rw-r--r--testsuites/validation/tc-task-set-scheduler.c2
-rw-r--r--testsuites/validation/tc-task-wake-after.c10
-rw-r--r--testsuites/validation/tc-task-wake-when.c8
-rw-r--r--testsuites/validation/tc-task.c2
-rw-r--r--testsuites/validation/tc-terminate.c1
-rw-r--r--testsuites/validation/tc-thread-idle-body-no-return.c21
-rw-r--r--testsuites/validation/tc-timer-reset.c2
-rw-r--r--testsuites/validation/tc-userext-create.c4
-rw-r--r--testsuites/validation/tc-userext.c72
-rw-r--r--testsuites/validation/tr-event-constant.c6
-rw-r--r--testsuites/validation/tr-event-send-receive.c6
-rw-r--r--testsuites/validation/tr-mtx-seize-try.c18
-rw-r--r--testsuites/validation/tr-mtx-seize-wait.c27
-rw-r--r--testsuites/validation/tr-mtx-surrender.c15
-rw-r--r--testsuites/validation/tr-object-ident-local.c6
-rw-r--r--testsuites/validation/tr-object-ident.c6
-rw-r--r--testsuites/validation/tr-sem-seize-try.c6
-rw-r--r--testsuites/validation/tr-sem-seize-wait.c6
-rw-r--r--testsuites/validation/tr-sem-surrender.c6
-rw-r--r--testsuites/validation/tr-signal-constant.c6
-rw-r--r--testsuites/validation/tr-tq-enqueue-ceiling.c16
-rw-r--r--testsuites/validation/tr-tq-enqueue-deadlock.c6
-rw-r--r--testsuites/validation/tr-tq-enqueue-fifo.c6
-rw-r--r--testsuites/validation/tr-tq-enqueue-mrsp.c12
-rw-r--r--testsuites/validation/tr-tq-enqueue-priority-inherit.c6
-rw-r--r--testsuites/validation/tr-tq-enqueue-priority.c12
-rw-r--r--testsuites/validation/tr-tq-flush-fifo.c6
-rw-r--r--testsuites/validation/tr-tq-flush-priority-inherit.c8
-rw-r--r--testsuites/validation/tr-tq-flush-priority.c8
-rw-r--r--testsuites/validation/tr-tq-surrender-mrsp.c10
-rw-r--r--testsuites/validation/tr-tq-surrender-priority-inherit.c12
-rw-r--r--testsuites/validation/tr-tq-surrender.c8
-rw-r--r--testsuites/validation/tr-tq-timeout-mrsp.c6
-rw-r--r--testsuites/validation/tr-tq-timeout-priority-inherit.c8
-rw-r--r--testsuites/validation/tr-tq-timeout.c8
-rw-r--r--testsuites/validation/ts-userext.c2
-rw-r--r--testsuites/validation/tx-call-within-isr.c39
-rw-r--r--testsuites/validation/tx-interrupt.c4
-rw-r--r--testsuites/validation/tx-support.h6
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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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(&regulator, 0, sizeof(regulator));
+
+ sc = rtems_regulator_delete(&regulator, 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(&regulator, 0, sizeof(regulator));
+
+ sc = rtems_regulator_obtain_buffer(&regulator, &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(&regulator, 0, sizeof(regulator));
+
+ sc = rtems_regulator_release_buffer(&regulator, &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(&regulator, 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(&regulator, 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(&regulator, 0, sizeof(regulator));
+
+ sc = rtems_regulator_send(&regulator, 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, &regulator);
+ 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, &regulator);
+ 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, &regulator);
+ 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( &regs->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( &regs->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( &reg_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( &reg_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( &reg_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( &reg_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( &reg_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( &reg_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( &reg_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( &reg_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( &regs, 0, sizeof( regs ) );
+ SetIORelaxHandler( ApbuartIORelax, &regs );
+ apbuart_outbyte_polled( &regs, (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 );
/**