[rtems commit] sptests/sp07: Minimize thread dispatch latency

Sebastian Huber sebh at rtems.org
Tue Sep 16 13:37:08 UTC 2014


Module:    rtems
Branch:    master
Commit:    7f8a978e6b078492bbc657a3731d324011274f2b
Changeset: http://git.rtems.org/rtems/commit/?id=7f8a978e6b078492bbc657a3731d324011274f2b

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Sep 16 15:43:15 2014 +0200

sptests/sp07: Minimize thread dispatch latency

Do not use sprintf() in thread dispatch critical sections to avoid
corruption of profiling samples.  Update test to reflect thread the life
cycle changes.

---

 testsuites/sptests/sp07/Makefile.am   |    2 +-
 testsuites/sptests/sp07/buffered_io.c |   47 ---------------------------------
 testsuites/sptests/sp07/init.c        |   15 +++++++---
 testsuites/sptests/sp07/sp07.scn      |   17 ++----------
 testsuites/sptests/sp07/system.h      |   29 +++++++++++++-------
 testsuites/sptests/sp07/task2.c       |    2 +
 testsuites/sptests/sp07/task4.c       |   21 ++++++++++++++-
 testsuites/sptests/sp07/tcreate.c     |   23 +++------------
 testsuites/sptests/sp07/tdelete.c     |   32 +++-------------------
 testsuites/sptests/sp07/trestart.c    |   20 ++------------
 testsuites/sptests/sp07/tstart.c      |   20 ++------------
 11 files changed, 71 insertions(+), 157 deletions(-)

diff --git a/testsuites/sptests/sp07/Makefile.am b/testsuites/sptests/sp07/Makefile.am
index d49ffa2..b845e4a 100644
--- a/testsuites/sptests/sp07/Makefile.am
+++ b/testsuites/sptests/sp07/Makefile.am
@@ -1,6 +1,6 @@
 
 rtems_tests_PROGRAMS = sp07
-sp07_SOURCES = init.c buffered_io.c task1.c task2.c task3.c task4.c \
+sp07_SOURCES = init.c task1.c task2.c task3.c task4.c \
     taskexit.c tcreate.c tdelete.c trestart.c tstart.c system.h
 
 dist_rtems_tests_DATA = sp07.scn
diff --git a/testsuites/sptests/sp07/buffered_io.c b/testsuites/sptests/sp07/buffered_io.c
deleted file mode 100644
index bd0f1f5..0000000
--- a/testsuites/sptests/sp07/buffered_io.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- *  COPYRIGHT (c) 2003-2012.
- *  On-Line Applications Research Corporation (OAR).
- *
- *  The license and distribution terms for this file may be
- *  found in the file LICENSE in this distribution or at
- *  http://www.rtems.org/license/LICENSE.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <rtems.h>
-
-#include "system.h"
-
-#define RINGBUF_QUEUE_LENGTH 512
-
-#include <rtems/ringbuf.h>
-
-Ring_buffer_t Buffer;
-
-void buffered_io_initialize( void )
-{
-   Ring_buffer_Initialize( &Buffer );
-}
-
-void buffered_io_flush(void)
-{
-  char ch;
-
-  while ( !Ring_buffer_Is_empty(&Buffer) ) {
-     Ring_buffer_Remove_character( &Buffer, ch );
-     fprintf( stderr, "%c", ch );
-  }
-  FLUSH_OUTPUT();
-}
-
-void buffered_io_add_string( char *s )
-{
-  char *p = s;
-
-  while ( *p ) {
-    Ring_buffer_Add_character( &Buffer, *p++ );
-  }
-}
diff --git a/testsuites/sptests/sp07/init.c b/testsuites/sptests/sp07/init.c
index 8622b4c..c08c5c4 100644
--- a/testsuites/sptests/sp07/init.c
+++ b/testsuites/sptests/sp07/init.c
@@ -70,8 +70,6 @@ rtems_task Init(
 
   TEST_BEGIN();
 
-  buffered_io_initialize();
-
   Extension_name[ 1 ] =  rtems_build_name( 'E', 'X', 'T', '1' );
   Extension_name[ 2 ] =  rtems_build_name( 'E', 'X', 'T', '2' );
 
@@ -155,6 +153,7 @@ rtems_task Init(
     &Task_id[ 1 ]
   );
   directive_failed( status, "rtems_task_create of TA1" );
+  assert_extension_counts( &Task_created[ 0 ], 0x2 );
 
   status = rtems_task_create(
     Task_name[ 2 ],
@@ -165,6 +164,7 @@ rtems_task Init(
     &Task_id[ 2 ]
   );
   directive_failed( status, "rtems_task_create of TA2" );
+  assert_extension_counts( &Task_created[ 0 ], 0x2 | 0x4 );
 
 #define TA3_PRIORITY (RTEMS_MAXIMUM_PRIORITY - 4u)
   status = rtems_task_create(
@@ -176,6 +176,7 @@ rtems_task Init(
     &Task_id[ 3 ]
   );
   directive_failed( status, "rtems_task_create of TA3" );
+  assert_extension_counts( &Task_created[ 0 ], 0x2 | 0x4 | 0x8 );
 
 #define TA4_PRIORITY (RTEMS_MAXIMUM_PRIORITY - 1u)
   status = rtems_task_create(
@@ -187,23 +188,27 @@ rtems_task Init(
     &Task_id[ 4 ]
   );
   directive_failed( status, "rtems_task_create of TA4" );
+  assert_extension_counts( &Task_created[ 0 ], 0x2 | 0x4 | 0x8 | 0x10 );
 
   status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
   directive_failed( status, "rtems_task_start of TA1" );
+  assert_extension_counts( &Task_started[ 0 ], 0x2 );
 
   status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
   directive_failed( status, "rtems_task_start of TA2" );
+  assert_extension_counts( &Task_started[ 0 ], 0x2 | 0x4 );
 
   status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
   directive_failed( status, "rtems_task_start of TA3" );
+  assert_extension_counts( &Task_started[ 0 ], 0x2 | 0x4 | 0x8 );
 
   status = rtems_task_start( Task_id[ 4 ], Task_4, 0 );
   directive_failed( status, "rtems_task_start of TA4" );
+  assert_extension_counts( &Task_started[ 0 ], 0x2 | 0x4 | 0x8 | 0x10 );
 
-  status = rtems_task_restart( Task_id[ 3 ], 0 );
+  status = rtems_task_restart( Task_id[ 2 ], 0 );
   directive_failed( status, "rtems_task_restart of TA3" );
-
-  buffered_io_flush();
+  assert_extension_counts( &Task_restarted[ 0 ], 0x0 );
 
   status = rtems_task_set_note( rtems_task_self(), RTEMS_NOTEPAD_4, 32 );
   directive_failed( status, "task_set_node of Self id" );
diff --git a/testsuites/sptests/sp07/sp07.scn b/testsuites/sptests/sp07/sp07.scn
index e75bdd0..0fe6f29 100644
--- a/testsuites/sptests/sp07/sp07.scn
+++ b/testsuites/sptests/sp07/sp07.scn
@@ -1,4 +1,4 @@
-*** TEST 7 ***
+*** BEGIN OF TEST SP 7 ***
 rtems_extension_create - bad id pointer -- RTEMS_INVALID_ADDRESS
 rtems_extension_create - bad name -- RTEMS_INVALID_NAME
 rtems_extension_create - first one -- OK
@@ -9,15 +9,7 @@ rtems_extension_delete - second one again -- RTEMS_INVALID_ID
 rtems_extension_ident -- OK
 rtems_extension_ident - bad name -- RTEMS_INVALID_NAME
 rtems_extension_ident - bad name -- RTEMS_INVALID_ADDRESS
-TASK_CREATE - TA1  - created
-TASK_CREATE - TA2  - created
-TASK_CREATE - TA3  - created
-TASK_CREATE - TA4  - created
-TASK_START - TA1  - started
-TASK_START - TA2  - started
-TASK_START - TA3  - started
-TASK_START - TA4  - started
-TASK_RESTART - TA3  - restarted
+rtems_extension_create - harmless -- OK
 INIT - rtems_task_set_note - set my (id) RTEMS_NOTEPAD_4 to TA1's priority: 04
 INIT - rtems_task_set_note - set my (SELF) RTEMS_NOTEPAD_4 to TA1's priority: 04
 INIT - rtems_task_set_note - set TA1's RTEMS_NOTEPAD_8 to TA1's priority: 04
@@ -36,9 +28,6 @@ TA1 - rtems_task_set_priority - set TA2's priority: 01
 TA2 - rtems_task_get_note - get RTEMS_NOTEPAD_8 - current priority: 01
 TA2 - rtems_task_suspend - suspend TA1
 TA2 - rtems_task_set_priority - set priority of TA1 ( blocked )
-TASK_DELETE - TA2  TASK_DELETE deleting - TA1 
-TASK_DELETE - TA2  TASK_DELETE deleting - TA3 
-TASK_DELETE - TA2  TASK_DELETE deleting - TA2 
 TA4 - exitting task
 RTEMS_TASK_EXITTED - extension invoked for TA4 
-*** END OF TEST 7 ***
+*** END OF TEST SP 7 ***
diff --git a/testsuites/sptests/sp07/system.h b/testsuites/sptests/sp07/system.h
index b09912f..8bea0fb 100644
--- a/testsuites/sptests/sp07/system.h
+++ b/testsuites/sptests/sp07/system.h
@@ -13,16 +13,6 @@
 
 #include <tmacros.h>
 
-/* buffered IO */
-
-void buffered_io_initialize( void );
-
-void buffered_io_flush(void);
-
-void buffered_io_add_string( char *s );
-
-/* end of buffered IO */
-
 /* functions */
 
 rtems_task Init(
@@ -94,4 +84,23 @@ TEST_EXTERN rtems_name Task_name[ 5 ];       /* array of task names */
 TEST_EXTERN rtems_id   Extension_id[ 4 ];
 TEST_EXTERN rtems_name Extension_name[ 4 ];  /* array of task names */
 
+TEST_EXTERN int Task_created[ RTEMS_ARRAY_SIZE( Task_id ) ];
+
+TEST_EXTERN int Task_started[ RTEMS_ARRAY_SIZE( Task_id ) ];
+
+TEST_EXTERN int Task_restarted[ RTEMS_ARRAY_SIZE( Task_id ) ];
+
+TEST_EXTERN int Task_deleted[ RTEMS_ARRAY_SIZE( Task_id ) ];
+
+RTEMS_INLINE_ROUTINE void assert_extension_counts( const int *table, int tasks )
+{
+  size_t i;
+
+  for ( i = 0; i < RTEMS_ARRAY_SIZE( Task_id ); ++i ) {
+    rtems_test_assert(
+      ( tasks & ( 1 << i ) ) != 0 ? table[ i ] == 1 : table[ i ] == 0
+    );
+  }
+}
+
 /* end of include file */
diff --git a/testsuites/sptests/sp07/task2.c b/testsuites/sptests/sp07/task2.c
index 584c0e5..6451fff 100644
--- a/testsuites/sptests/sp07/task2.c
+++ b/testsuites/sptests/sp07/task2.c
@@ -42,9 +42,11 @@ rtems_task Task_2(
 
       status = rtems_task_delete( Task_id[ 1 ] );          /* TA1 is blocked */
       directive_failed( status, "rtems_task_delete of TA1" );
+      assert_extension_counts( &Task_deleted[ 0 ], 0x0 );
 
       status = rtems_task_delete( Task_id[ 3 ] );          /* TA3 is ready   */
       directive_failed( status, "rtems_task_delete of TA3" );
+      assert_extension_counts( &Task_deleted[ 0 ], 0x0 );
 
       status = rtems_task_delete( RTEMS_SELF );
       directive_failed( status, "rtems_task_delete of SELD" );
diff --git a/testsuites/sptests/sp07/task4.c b/testsuites/sptests/sp07/task4.c
index 1083292..365b595 100644
--- a/testsuites/sptests/sp07/task4.c
+++ b/testsuites/sptests/sp07/task4.c
@@ -27,7 +27,26 @@ rtems_task Task_4(
   rtems_task_argument argument
 )
 {
-  buffered_io_flush();
+  rtems_status_code status;
+  rtems_id id;
+
+  assert_extension_counts( &Task_created[ 0 ], 0x2 | 0x4 | 0x8 | 0x10 );
+  assert_extension_counts( &Task_started[ 0 ], 0x2 | 0x4 | 0x8 | 0x10 );
+  assert_extension_counts( &Task_restarted[ 0 ], 0x4 );
+  assert_extension_counts( &Task_deleted[ 0 ], 0x0 );
+
+  /* Kill the zombies */
+  status = rtems_task_create(
+    rtems_build_name( 'L', 'A', 'Z', 'Y' ),
+    1,
+    RTEMS_MINIMUM_STACK_SIZE,
+    RTEMS_DEFAULT_MODES,
+    RTEMS_DEFAULT_ATTRIBUTES,
+    &id
+  );
+  rtems_test_assert( status == RTEMS_SUCCESSFUL );
+
+  assert_extension_counts( &Task_deleted[ 0 ], 0x2 | 0x4 | 0x8 );
 
   puts( "TA4 - exitting task" );
 }
diff --git a/testsuites/sptests/sp07/tcreate.c b/testsuites/sptests/sp07/tcreate.c
index fd6027f..351aacd 100644
--- a/testsuites/sptests/sp07/tcreate.c
+++ b/testsuites/sptests/sp07/tcreate.c
@@ -27,24 +27,11 @@ bool Task_create_extension(
   rtems_tcb *created_task
 )
 {
-  char line[80];
-  rtems_name name;
+  ssize_t task = task_number( created_task->Object.id );
 
-  if ( task_number( created_task->Object.id ) > 0 ) {
-    name = Task_name[ task_number( created_task->Object.id ) ];
-/*
- * FIXME: There should be a public function to
- * convert numeric rtems_names into char arrays
- * c.f. rtems_name_to_characters() in rtems/rtems/support.inl
- * but it's private.
- */
-    sprintf( line, "TASK_CREATE - %c%c%c%c - created\n",
-      (char)((name >> 24) & 0xff),
-      (char)((name >> 16) & 0xff),
-      (char)((name >> 8) & 0xff),
-      (char)(name & 0xff)
-    );
-    buffered_io_add_string( line );
+  if (task > 0) {
+    ++Task_created[ task ];
   }
-  return TRUE;
+
+  return true;
 }
diff --git a/testsuites/sptests/sp07/tdelete.c b/testsuites/sptests/sp07/tdelete.c
index 152db71..a7136e2 100644
--- a/testsuites/sptests/sp07/tdelete.c
+++ b/testsuites/sptests/sp07/tdelete.c
@@ -27,33 +27,11 @@ void Task_delete_extension(
   rtems_tcb *deleted_task
 )
 {
-  char line[80];
-  rtems_name name;
+  ssize_t task = task_number( deleted_task->Object.id );
 
-  if ( task_number( running_task->Object.id ) > 0 ) {
-    name = Task_name[ task_number( running_task->Object.id ) ];
-    sprintf( line, "TASK_DELETE - %c%c%c%c TASK_DELETE ",
-      (char)((name >> 24) & 0xff),
-      (char)((name >> 16) & 0xff),
-      (char)((name >> 8) & 0xff),
-      (char)(name & 0xff)
-    );
-    buffered_io_add_string( line );
-  }
-  if ( task_number( deleted_task->Object.id ) > 0 ) {
-    name = Task_name[ task_number( deleted_task->Object.id ) ];
-/*
- * FIXME: There should be a public function to
- * convert numeric rtems_names into char arrays
- * c.f. rtems_name_to_characters() in rtems/rtems/support.inl
- * but it's private.
- */
-    sprintf( line, "deleting - %c%c%c%c\n",
-      (char)((name >> 24) & 0xff),
-      (char)((name >> 16) & 0xff),
-      (char)((name >> 8) & 0xff),
-      (char)(name & 0xff)
-    );
-    buffered_io_add_string( line );
+  if (task > 0) {
+    ++Task_deleted[ task ];
   }
+
+  rtems_test_assert( running_task != deleted_task );
 }
diff --git a/testsuites/sptests/sp07/trestart.c b/testsuites/sptests/sp07/trestart.c
index 7a3fecf..d821562 100644
--- a/testsuites/sptests/sp07/trestart.c
+++ b/testsuites/sptests/sp07/trestart.c
@@ -27,23 +27,9 @@ void Task_restart_extension(
   rtems_tcb *restarted_task
 )
 {
-  char line[80];
-  rtems_name name;
+  ssize_t task = task_number( restarted_task->Object.id );
 
-  if ( task_number( restarted_task->Object.id ) > 0 ) {
-    name = Task_name[ task_number( restarted_task->Object.id ) ];
-/*
- * FIXME: There should be a public function to
- * convert numeric rtems_names into char arrays
- * c.f. rtems_name_to_characters() in rtems/rtems/support.inl
- * but it's private.
- */
-    sprintf( line, "TASK_RESTART - %c%c%c%c - restarted\n",
-      (char)((name >> 24) & 0xff),
-      (char)((name >> 16) & 0xff),
-      (char)((name >> 8) & 0xff),
-      (char)(name & 0xff)
-    );
-    buffered_io_add_string( line );
+  if (task > 0) {
+    ++Task_restarted[ task ];
   }
 }
diff --git a/testsuites/sptests/sp07/tstart.c b/testsuites/sptests/sp07/tstart.c
index b6e8db8..c2f29cb 100644
--- a/testsuites/sptests/sp07/tstart.c
+++ b/testsuites/sptests/sp07/tstart.c
@@ -27,23 +27,9 @@ void Task_start_extension(
   rtems_tcb *started_task
 )
 {
-  char line[80];
-  rtems_name name;
+  ssize_t task = task_number( started_task->Object.id );
 
-  if ( task_number( started_task->Object.id ) > 0 ) {
-    name = Task_name[ task_number( started_task->Object.id ) ];
-/*
- * FIXME: There should be a public function to
- * convert numeric rtems_names into char arrays
- * c.f. rtems_name_to_characters() in rtems/rtems/support.inl
- * but it's private.
- */
-    sprintf( line, "TASK_START - %c%c%c%c - started\n",
-      (char)((name >> 24) & 0xff),
-      (char)((name >> 16) & 0xff),
-      (char)((name >> 8) & 0xff),
-      (char)(name & 0xff)
-    );
-    buffered_io_add_string( line );
+  if (task > 0) {
+    ++Task_started[ task ];
   }
 }



More information about the vc mailing list