From 7d91d722baf1f1ff275fd31500526bb2fd6df632 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Mon, 13 Dec 1999 15:29:20 +0000 Subject: 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. --- testsuites/sptests/Makefile.am | 3 +- testsuites/sptests/sp29/Makefile.am | 36 ++++++++ testsuites/sptests/sp29/init.c | 177 ++++++++++++++++++++++++++++++++++++ testsuites/sptests/sp29/sp29.doc | 0 testsuites/sptests/sp29/sp29.scn | 0 5 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 testsuites/sptests/sp29/Makefile.am create mode 100644 testsuites/sptests/sp29/init.c create mode 100644 testsuites/sptests/sp29/sp29.doc create mode 100644 testsuites/sptests/sp29/sp29.scn (limited to 'testsuites') 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 + +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 + +#include +#include + +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 diff --git a/testsuites/sptests/sp29/sp29.scn b/testsuites/sptests/sp29/sp29.scn new file mode 100644 index 0000000000..e69de29bb2 -- cgit v1.2.3