summaryrefslogtreecommitdiffstats
path: root/testsuites/sptests/spintrcritical21
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-09-09 17:13:51 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-09-10 07:12:55 +0200
commit4984ee4aa227cd9a4e4d3f171ea9317d1bc3e163 (patch)
tree220d66bfa7b6f47236aba68a6737a0da031edba3 /testsuites/sptests/spintrcritical21
parentpsxtests/psxonce01: Use test extension (diff)
downloadrtems-4984ee4aa227cd9a4e4d3f171ea9317d1bc3e163.tar.bz2
sptests/sp39: Convert to sptests/spintrcritical21
Use interrupt critical section test support. Do not print end of test message in case of failure.
Diffstat (limited to 'testsuites/sptests/spintrcritical21')
-rw-r--r--testsuites/sptests/spintrcritical21/Makefile.am20
-rw-r--r--testsuites/sptests/spintrcritical21/init.c170
-rw-r--r--testsuites/sptests/spintrcritical21/spintrcritical21.doc22
-rw-r--r--testsuites/sptests/spintrcritical21/spintrcritical21.scn4
-rw-r--r--testsuites/sptests/spintrcritical21/system.h39
5 files changed, 255 insertions, 0 deletions
diff --git a/testsuites/sptests/spintrcritical21/Makefile.am b/testsuites/sptests/spintrcritical21/Makefile.am
new file mode 100644
index 0000000000..b53d0006de
--- /dev/null
+++ b/testsuites/sptests/spintrcritical21/Makefile.am
@@ -0,0 +1,20 @@
+rtems_tests_PROGRAMS = spintrcritical21
+spintrcritical21_SOURCES = init.c ../spintrcritical_support/intrcritical.c
+
+dist_rtems_tests_DATA = spintrcritical21.scn spintrcritical21.doc
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
+include $(top_srcdir)/../automake/compile.am
+include $(top_srcdir)/../automake/leaf.am
+
+AM_CPPFLAGS += -I$(top_srcdir)/../support/include
+AM_CPPFLAGS += -I$(top_srcdir)/spintrcritical_support
+
+LINK_OBJS = $(spintrcritical21_OBJECTS)
+LINK_LIBS = $(spintrcritical21_LDLIBS)
+
+spintrcritical21$(EXEEXT): $(spintrcritical21_OBJECTS) $(spintrcritical21_DEPENDENCIES)
+ @rm -f spintrcritical21$(EXEEXT)
+ $(make-exe)
+
+include $(top_srcdir)/../automake/local.am
diff --git a/testsuites/sptests/spintrcritical21/init.c b/testsuites/sptests/spintrcritical21/init.c
new file mode 100644
index 0000000000..8b1ddcfc37
--- /dev/null
+++ b/testsuites/sptests/spintrcritical21/init.c
@@ -0,0 +1,170 @@
+/*
+ * Classic API Signal to Task from ISR
+ *
+ * COPYRIGHT (c) 1989-2011.
+ * 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
+
+#define CONFIGURE_INIT
+#include "system.h"
+
+#include <intrcritical.h>
+
+#include <rtems/rtems/eventimpl.h>
+
+const char rtems_test_name[] = "SPINTRCRITICAL 21";
+
+/*
+ * ERROR CHECKING NOTE:
+ *
+ * We are either at dispatch disable level 1 or 2. Either way, it is
+ * safer not to check the dispatch level explicitly so we are using
+ * fatal_directive_check_status_only() not directive_failed().
+ */
+
+static volatile bool case_hit;
+
+static rtems_id main_task;
+
+static rtems_id other_task;
+
+static rtems_timer_service_routine test_event_from_isr(
+ rtems_id timer,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
+ /*
+ * This event send hits the critical section but sends to
+ * another task so doesn't impact this critical section.
+ */
+ status = rtems_event_send( other_task, 0x02 );
+ fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" );
+
+ /*
+ * This event send hits the main task but doesn't satisfy
+ * it's blocking condition so it will still block
+ */
+ status = rtems_event_send( main_task, 0x02 );
+ fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" );
+
+ case_hit = true;
+ }
+ status = rtems_event_send( main_task, 0x01 );
+ fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" );
+}
+
+static bool test_body_event_from_isr( void *arg )
+{
+ rtems_status_code status;
+ rtems_event_set out;
+
+ (void) arg;
+
+ status = rtems_event_receive( 0x01, RTEMS_DEFAULT_OPTIONS, 0, &out );
+ rtems_test_assert( status == RTEMS_SUCCESSFUL );
+
+ return case_hit;
+}
+
+static rtems_timer_service_routine test_event_with_timeout_from_isr(
+ rtems_id timer,
+ void *arg
+)
+{
+ rtems_status_code status;
+
+ if ( _Event_Sync_state == THREAD_BLOCKING_OPERATION_NOTHING_HAPPENED ) {
+ /*
+ * We want to catch the task while it is blocking. Otherwise
+ * just send and make it happy.
+ */
+ case_hit = true;
+ }
+ status = rtems_event_send( main_task, 0x01 );
+ fatal_directive_check_status_only( status, RTEMS_SUCCESSFUL, "event send" );
+}
+
+static bool test_body_event_with_timeout_from_isr( void *arg )
+{
+ rtems_status_code status;
+ rtems_event_set out;
+
+ (void) arg;
+
+ status = rtems_event_receive( 0x01, RTEMS_DEFAULT_OPTIONS, 1, &out );
+ rtems_test_assert( status == RTEMS_SUCCESSFUL || status == RTEMS_TIMEOUT );
+
+ return case_hit;
+}
+
+rtems_task Init(
+ rtems_task_argument argument
+)
+{
+ rtems_status_code status;
+
+ TEST_BEGIN();
+
+ main_task = rtems_task_self();
+
+ status = rtems_task_create(
+ 0xa5a5a5a5,
+ 1,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &other_task
+ );
+ directive_failed( status, "rtems_task_create" );
+
+ /*
+ * Test Event send successful from ISR -- receive is forever
+ */
+
+ case_hit = false;
+ interrupt_critical_section_test(
+ test_body_event_from_isr,
+ NULL,
+ test_event_from_isr
+ );
+
+ printf(
+ "Event sent from ISR hitting synchronization point has %soccurred\n",
+ case_hit ? "" : "NOT "
+ );
+
+ rtems_test_assert( case_hit );
+
+ /*
+ * Test Event send successful from ISR -- receive has timeout
+ */
+
+ case_hit = false;
+ interrupt_critical_section_test(
+ test_body_event_with_timeout_from_isr,
+ NULL,
+ test_event_with_timeout_from_isr
+ );
+
+ printf(
+ "Event sent from ISR (with timeout) hitting synchronization "
+ "point has %soccurred\n",
+ case_hit ? "" : "NOT "
+ );
+
+ rtems_test_assert( case_hit );
+
+ TEST_END();
+ rtems_test_exit( 0 );
+}
diff --git a/testsuites/sptests/spintrcritical21/spintrcritical21.doc b/testsuites/sptests/spintrcritical21/spintrcritical21.doc
new file mode 100644
index 0000000000..94423e107f
--- /dev/null
+++ b/testsuites/sptests/spintrcritical21/spintrcritical21.doc
@@ -0,0 +1,22 @@
+# COPYRIGHT (c) 1989-2009.
+# 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.
+#
+
+This file describes the directives and concepts tested by this test set.
+
+test set name: spintrcritical21
+
+directives:
+
+ rtems_event_receive
+ rtems_event_send
+
+concepts:
+
++ Ensure that the interrupt critical section for sending an event from an
+ ISR while the receiving task is in the process of blocking with and withing
+ timeout is handled properly.
diff --git a/testsuites/sptests/spintrcritical21/spintrcritical21.scn b/testsuites/sptests/spintrcritical21/spintrcritical21.scn
new file mode 100644
index 0000000000..d7a1998d0a
--- /dev/null
+++ b/testsuites/sptests/spintrcritical21/spintrcritical21.scn
@@ -0,0 +1,4 @@
+*** BEGIN OF TEST SPINTRCRITICAL 21 ***
+Event sent from ISR hitting synchronization point has occurred
+Event sent from ISR (with timeout) hitting synchronization point has occurred
+*** END OF TEST SPINTRCRITICAL 21 ***
diff --git a/testsuites/sptests/spintrcritical21/system.h b/testsuites/sptests/spintrcritical21/system.h
new file mode 100644
index 0000000000..f9111c0412
--- /dev/null
+++ b/testsuites/sptests/spintrcritical21/system.h
@@ -0,0 +1,39 @@
+/* system.h
+ *
+ * This include file contains information that is included in every
+ * function in the test set.
+ *
+ * COPYRIGHT (c) 1989-2007.
+ * 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.
+ */
+
+#include <tmacros.h>
+
+/* functions */
+
+rtems_task Init(
+ rtems_task_argument argument
+);
+
+/* configuration information */
+
+#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_MICROSECONDS_PER_TICK 1000
+
+#define CONFIGURE_MAXIMUM_TASKS 2
+#define CONFIGURE_MAXIMUM_TIMERS 1
+#define CONFIGURE_MAXIMUM_USER_EXTENSIONS 1
+
+#include <rtems/confdefs.h>
+
+/* end of include file */