summaryrefslogtreecommitdiffstats
path: root/testsuites/sptests
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-12-13 15:29:20 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-12-13 15:29:20 +0000
commit7d91d722baf1f1ff275fd31500526bb2fd6df632 (patch)
tree4200d45e53e783ea350265ba4267083b51566523 /testsuites/sptests
parentCorrected order of output. (diff)
downloadrtems-7d91d722baf1f1ff275fd31500526bb2fd6df632.tar.bz2
First attempt at adding simple binary semaphore in addition to the current
"mutex" and counting semaphore. This is at the request of Eric Norum and his EPICS porting effort.
Diffstat (limited to 'testsuites/sptests')
-rw-r--r--testsuites/sptests/Makefile.am3
-rw-r--r--testsuites/sptests/sp29/Makefile.am36
-rw-r--r--testsuites/sptests/sp29/init.c177
-rw-r--r--testsuites/sptests/sp29/sp29.doc0
-rw-r--r--testsuites/sptests/sp29/sp29.scn0
5 files changed, 215 insertions, 1 deletions
diff --git a/testsuites/sptests/Makefile.am b/testsuites/sptests/Makefile.am
index e483267102..7452d72394 100644
--- a/testsuites/sptests/Makefile.am
+++ b/testsuites/sptests/Makefile.am
@@ -7,7 +7,8 @@ ACLOCAL_AMFLAGS = -I $(RTEMS_TOPdir)/aclocal
## sp10 and spfatal are not included for now
SUBDIRS = sp01 sp02 sp03 sp04 sp05 sp06 sp07 sp08 sp09 sp11 sp12 sp13 sp14 \
- sp15 sp16 sp17 sp19 sp20 sp21 sp22 sp23 sp24 sp25 sp26 sp27 sp28 spsize
+ sp15 sp16 sp17 sp19 sp20 sp21 sp22 sp23 sp24 sp25 sp26 sp27 sp28 sp29 \
+ spsize
EXTRA_DIST = sptests.am spfatal
diff --git a/testsuites/sptests/sp29/Makefile.am b/testsuites/sptests/sp29/Makefile.am
new file mode 100644
index 0000000000..ec543997de
--- /dev/null
+++ b/testsuites/sptests/sp29/Makefile.am
@@ -0,0 +1,36 @@
+##
+## $Id$
+##
+
+AUTOMAKE_OPTIONS = foreign 1.4
+
+TEST = sp29
+
+MANAGERS = all
+
+# C source names, if any, go here -- minus the .c
+C_FILES = init.c
+C_O_FILES = $(C_FILES:%.c=${ARCH}/%.o)
+
+DOCTYPES = scn
+DOCS = $(DOCTYPES:%=$(TEST).%)
+
+SRCS = $(C_FILES) $(H_FILES)
+OBJS = $(C_O_FILES)
+
+PRINT_SRCS = $(DOCS)
+
+PGM = ${ARCH}/$(TEST).exe
+
+include $(RTEMS_ROOT)/make/custom/@RTEMS_BSP@.cfg
+include $(RTEMS_ROOT)/make/leaf.cfg
+include $(top_srcdir)/sptests.am
+
+${PGM}: $(OBJS) $(LINK_FILES)
+ $(make-exe)
+
+all-local: $(ARCH) $(TMPINSTALL_FILES)
+
+EXTRA_DIST = $(C_FILES) $(DOCS)
+
+include $(top_srcdir)/../../../../automake/local.am
diff --git a/testsuites/sptests/sp29/init.c b/testsuites/sptests/sp29/init.c
new file mode 100644
index 0000000000..032b1ac42e
--- /dev/null
+++ b/testsuites/sptests/sp29/init.c
@@ -0,0 +1,177 @@
+/*
+ * Test for rtems_semaphore_flush
+ *
+ * $Id$
+ */
+
+#include <bsp.h>
+
+rtems_task Init (rtems_task_argument argument);
+
+#define CONFIGURE_RTEMS_INIT_TASKS_TABLE
+
+#define CONFIGURE_TEST_NEEDS_CONSOLE_DRIVER
+#define CONFIGURE_TEST_NEEDS_CLOCK_DRIVER
+
+#define CONFIGURE_INIT
+
+#include <confdefs.h>
+
+#include <rtems/error.h>
+#include <stdio.h>
+
+rtems_interval ticksPerSecond;
+
+rtems_task
+subtask (rtems_task_argument arg)
+{
+ int i;
+ rtems_status_code sc;
+ rtems_id sem = (rtems_id)arg;
+
+ for (;;) {
+ rtems_task_wake_after (ticksPerSecond * 2);
+
+ sc = rtems_semaphore_release (sem);
+ if (sc != RTEMS_SUCCESSFUL)
+ printf ("%d: Can't release semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ }
+}
+
+void
+startTask (rtems_id arg)
+{
+ rtems_id tid;
+ rtems_status_code sc;
+
+ sc = rtems_task_create (rtems_build_name ('S', 'R', 'V', 'A'),
+ 100,
+ 10000,
+ RTEMS_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_NO_ASR|RTEMS_INTERRUPT_LEVEL(0),
+ RTEMS_NO_FLOATING_POINT|RTEMS_LOCAL,
+ &tid);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("Can't create task: %s\n", rtems_status_text (sc));
+ rtems_task_suspend (RTEMS_SELF);
+ }
+ sc = rtems_task_start (tid, subtask, arg);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("Can't start task: %s\n", rtems_status_text (sc));
+ rtems_task_suspend (RTEMS_SELF);
+ }
+}
+
+rtems_task Init (rtems_task_argument ignored)
+{
+ int i;
+ rtems_id semrec, semnorec;
+ rtems_status_code sc;
+ rtems_interval then, now;
+
+ sc = rtems_clock_get (RTEMS_CLOCK_GET_TICKS_PER_SECOND, &ticksPerSecond);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("Can't get ticks per second: %s\n", rtems_status_text (sc));
+ exit (1);
+ }
+ sc = rtems_semaphore_create (rtems_build_name ('S', 'M', 'r', 'c'),
+ 1,
+ RTEMS_PRIORITY|RTEMS_BINARY_SEMAPHORE|RTEMS_INHERIT_PRIORITY |RTEMS_NO_PRIORITY_CEILING|RTEMS_LOCAL,
+ 0,
+ &semrec);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("%d: Can't create recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ exit (1);
+ }
+ sc = rtems_semaphore_create (rtems_build_name ('S', 'M', 'n', 'c'),
+ 1,
+ RTEMS_PRIORITY|RTEMS_BINARY_SEMAPHORE|RTEMS_NO_NESTING_ALLOWED|RTEMS_INHERIT_PRIORITY |RTEMS_NO_PRIORITY_CEILING|RTEMS_LOCAL,
+ 0,
+ &semnorec);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("%d: Can't create non-recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ exit (1);
+ }
+
+ sc = rtems_semaphore_obtain (semrec, RTEMS_NO_WAIT, 0);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("%d: Can't obtain recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ }
+ sc = rtems_semaphore_obtain (semrec, RTEMS_NO_WAIT, 0);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("%d: Can't reobtain recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ }
+
+ sc = rtems_semaphore_obtain (semnorec, RTEMS_NO_WAIT, 0);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("%d: Can't obtain non-recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ }
+ sc = rtems_semaphore_obtain (semnorec, RTEMS_NO_WAIT, 0);
+ if (sc == RTEMS_SUCCESSFUL) {
+ printf ("%d: Reobtain non-recursive-lock semaphore -- and should not have.\n", __LINE__);
+ }
+
+ sc = rtems_semaphore_release (semnorec);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("%d: Can't release non-recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ }
+ sc = rtems_semaphore_release (semnorec);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("%d: Can't rerelease non-recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ }
+ sc = rtems_semaphore_obtain (semnorec, RTEMS_NO_WAIT, 0);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("%d: Can't obtain non-recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ }
+ sc = rtems_semaphore_obtain (semnorec, RTEMS_NO_WAIT, 0);
+ if (sc == RTEMS_SUCCESSFUL) {
+ printf ("%d: Reobtain non-recursive-lock semaphore -- and should not have.\n", __LINE__);
+ }
+ else if (sc != RTEMS_UNSATISFIED) {
+ printf ("%d: Reobtain non-recursive-lock semaphore failed, but error is %d (%s), not RTEMS_UNSATISFIED.\n", __LINE__, sc, rtems_status_text (sc));
+ }
+
+ sc = rtems_semaphore_release (semnorec);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("%d: Can't release non-recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ }
+ sc = rtems_semaphore_release (semnorec);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("%d: Can't rerelease non-recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ }
+ sc = rtems_semaphore_obtain (semnorec, RTEMS_NO_WAIT, 0);
+ if (sc != RTEMS_SUCCESSFUL) {
+ printf ("%d: Can't obtain non-recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ }
+ /*
+ * Since this task is holding this, there is no reason to block.
+ * It is obviously an error to reobtain it.
+ */
+ rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &then);
+ sc = rtems_semaphore_obtain (semnorec, RTEMS_WAIT, 5);
+ rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &now);
+ if (sc == RTEMS_SUCCESSFUL) {
+ printf ("%d: Reobtain non-recursive-lock semaphore -- and should not have.\n", __LINE__);
+ }
+ else if (sc != RTEMS_UNSATISFIED) {
+ printf ("%d: Reobtain non-recursive-lock semaphore failed, but error is %d (%s), not RTEMS_UNSATISFIED.\n", __LINE__, sc, rtems_status_text (sc));
+ }
+ if ((then - now) < 4)
+ printf ("%d: Reobtain non-recursive-lock semaphore failed without timeout.\n", __LINE__);
+
+ startTask (semnorec);
+ rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &then);
+ for (i = 0 ; i < 5 ; i++) {
+ int diff;
+
+ sc = rtems_semaphore_obtain (semnorec, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+ rtems_clock_get (RTEMS_CLOCK_GET_TICKS_SINCE_BOOT, &now);
+ diff = now - then;
+ then = now;
+ if (sc != RTEMS_SUCCESSFUL)
+ printf ("%d: Failed to obtain non-recursive-lock semaphore: %s\n", __LINE__, rtems_status_text (sc));
+ else if (diff < (2 * ticksPerSecond + 1))
+ printf ("%d: Obtained obtain non-recursive-lock semaphore too quickly -- %d ticks\n", __LINE__, diff);
+ }
+
+ exit (0);
+}
diff --git a/testsuites/sptests/sp29/sp29.doc b/testsuites/sptests/sp29/sp29.doc
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuites/sptests/sp29/sp29.doc
diff --git a/testsuites/sptests/sp29/sp29.scn b/testsuites/sptests/sp29/sp29.scn
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/testsuites/sptests/sp29/sp29.scn