diff options
author | Gedare Bloom <gedare@rtems.org> | 2016-08-12 15:25:10 -0400 |
---|---|---|
committer | Gedare Bloom <gedare@rtems.org> | 2017-01-13 11:17:30 -0500 |
commit | ba77628250ae7158db363fc0d7886ebd43e9cb69 (patch) | |
tree | 91a8a5b7d20399c69c5c88223a43ec681451996b /testsuites | |
parent | posix: fix typo in mmap arguments (diff) | |
download | rtems-ba77628250ae7158db363fc0d7886ebd43e9cb69.tar.bz2 |
posix: shared memory support
Add POSIX shared memory manager (Shm). Includes a hook-based
approach for the backing memory storage that defaults to the
Workspace, and a test is provided using the heap. A test is
also provided for the basic use of mmap'ing a shared memory
object. This test currently fails at the mmap stage due to
no support for mmap.
Diffstat (limited to 'testsuites')
-rw-r--r-- | testsuites/psxtests/Makefile.am | 4 | ||||
-rw-r--r-- | testsuites/psxtests/configure.ac | 2 | ||||
-rw-r--r-- | testsuites/psxtests/psxshm01/Makefile.am | 22 | ||||
-rw-r--r-- | testsuites/psxtests/psxshm01/init.c | 91 | ||||
-rw-r--r-- | testsuites/psxtests/psxshm01/psxshm01.scn | 0 | ||||
-rw-r--r-- | testsuites/psxtests/psxshm01/system.h | 29 | ||||
-rw-r--r-- | testsuites/psxtests/psxshm02/Makefile.am | 22 | ||||
-rw-r--r-- | testsuites/psxtests/psxshm02/init.c | 91 | ||||
-rw-r--r-- | testsuites/psxtests/psxshm02/psxshm02.scn | 0 | ||||
-rw-r--r-- | testsuites/psxtests/psxshm02/system.h | 38 | ||||
-rw-r--r-- | testsuites/sptests/spsysinit01/init.c | 17 |
11 files changed, 314 insertions, 2 deletions
diff --git a/testsuites/psxtests/Makefile.am b/testsuites/psxtests/Makefile.am index e0ce36f719..2bea8ab199 100644 --- a/testsuites/psxtests/Makefile.am +++ b/testsuites/psxtests/Makefile.am @@ -10,8 +10,8 @@ _SUBDIRS += psxhdrs psx01 psx02 psx03 psx04 psx05 psx06 psx07 psx08 psx09 \ psxcancel psxcancel01 psxclassic01 psxcleanup psxcleanup01 \ psxconcurrency01 psxcond01 psxcond02 psxconfig01 psxenosys \ psxitimer psxmsgq01 psxmsgq02 psxmsgq03 psxmsgq04 \ - psxmutexattr01 psxobj01 psxrwlock01 psxsem01 psxsignal01 psxsignal02 \ - psxsignal03 psxsignal04 psxsignal05 psxsignal06 \ + psxmutexattr01 psxobj01 psxrwlock01 psxsem01 psxshm01 psxshm02 \ + psxsignal01 psxsignal02 psxsignal03 psxsignal04 psxsignal05 psxsignal06 \ psxspin01 psxsysconf \ psxtime psxtimer01 psxtimer02 psxualarm psxusleep psxfatal01 psxfatal02 \ psxintrcritical01 psxstack01 psxstack02 \ diff --git a/testsuites/psxtests/configure.ac b/testsuites/psxtests/configure.ac index 7401258871..77af14ed47 100644 --- a/testsuites/psxtests/configure.ac +++ b/testsuites/psxtests/configure.ac @@ -188,6 +188,8 @@ psxreaddir/Makefile psxrdwrv/Makefile psxrwlock01/Makefile psxsem01/Makefile +psxshm01/Makefile +psxshm02/Makefile psxsignal01/Makefile psxsignal02/Makefile psxsignal03/Makefile diff --git a/testsuites/psxtests/psxshm01/Makefile.am b/testsuites/psxtests/psxshm01/Makefile.am new file mode 100644 index 0000000000..7082a50167 --- /dev/null +++ b/testsuites/psxtests/psxshm01/Makefile.am @@ -0,0 +1,22 @@ + +rtems_tests_PROGRAMS = psxshm01 +psxshm01_SOURCES = init.c system.h + +dist_rtems_tests_DATA = psxshm01.scn + +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)/include +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(psxshm01_OBJECTS) +LINK_LIBS = $(psxshm01_LDLIBS) + +psxshm01$(EXEEXT): $(psxshm01_OBJECTS) $(psxshm01_DEPENDENCIES) + @rm -f psxshm01$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/psxtests/psxshm01/init.c b/testsuites/psxtests/psxshm01/init.c new file mode 100644 index 0000000000..24c9b9629f --- /dev/null +++ b/testsuites/psxtests/psxshm01/init.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2016 Gedare Bloom. + * + * 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. + */ + +/* + * From http://pubs.opengroup.org/onlinepubs/9699919799/functions/shm_open.html + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define CONFIGURE_INIT +#include "system.h" +#include "pritime.h" + +#include <sys/mman.h> + +#include <errno.h> +#include <fcntl.h> +#include <string.h> + +const char rtems_test_name[] = "PSX SHM01"; + +#define MAX_LEN 10000 +struct region { /* Defines "structure" of shared memory */ + int len; + char buf[MAX_LEN]; +}; + +void *POSIX_Init( + void *argument +) +{ + struct region *p; + int fd; + int err; + char *name = "/shm"; + + TEST_BEGIN(); + + puts( "Init: shm_open" ); + fd = shm_open( name, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR ); + if ( fd == -1 ) { + printf ( "Error: %s\n", strerror(errno) ); + rtems_test_assert( fd != -1 ); + } + + puts( "Init: ftruncate" ); + err = ftruncate( fd, sizeof( struct region ) ); + if ( err == -1 ) { + printf ( "Error: %s\n", strerror(errno) ); + rtems_test_assert( err != -1 ); + } + + puts( "Init: mmap" ); + p = mmap( + NULL, + sizeof( struct region ), + PROT_READ | PROT_WRITE, MAP_SHARED, + fd, + 0 + ); + rtems_test_assert( p != MAP_FAILED ); + + puts( "Init: write to mapped region" ); + p->len = MAX_LEN; + + puts( "Init: munmap" ); + err = munmap( p, sizeof( struct region ) ); + if ( err == -1 ) { + printf ( "Error: %s\n", strerror(errno) ); + rtems_test_assert( err != -1 ); + } + + puts( "Init: close" ); + err = close( fd ); + if ( err == -1 ) { + printf ( "Error: %s\n", strerror(errno) ); + rtems_test_assert( err != -1 ); + } + + TEST_END(); + + rtems_test_exit(0); + return 0; +} diff --git a/testsuites/psxtests/psxshm01/psxshm01.scn b/testsuites/psxtests/psxshm01/psxshm01.scn new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/testsuites/psxtests/psxshm01/psxshm01.scn diff --git a/testsuites/psxtests/psxshm01/system.h b/testsuites/psxtests/psxshm01/system.h new file mode 100644 index 0000000000..531a9261ba --- /dev/null +++ b/testsuites/psxtests/psxshm01/system.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2016 Gedare Bloom. + * + * 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 <pmacros.h> +#include <unistd.h> +#include <errno.h> + +void *POSIX_Init( + void *argument +); + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER + +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION + +#define CONFIGURE_MAXIMUM_POSIX_THREADS 1 +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 10 +#define CONFIGURE_MAXIMUM_POSIX_SHMS 1 +#define CONFIGURE_MEMORY_OVERHEAD 10 + +#define CONFIGURE_POSIX_INIT_THREAD_TABLE + +#include <rtems/confdefs.h> diff --git a/testsuites/psxtests/psxshm02/Makefile.am b/testsuites/psxtests/psxshm02/Makefile.am new file mode 100644 index 0000000000..c174b0ccf5 --- /dev/null +++ b/testsuites/psxtests/psxshm02/Makefile.am @@ -0,0 +1,22 @@ + +rtems_tests_PROGRAMS = psxshm02 +psxshm02_SOURCES = init.c system.h + +dist_rtems_tests_DATA = psxshm02.scn + +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)/include +AM_CPPFLAGS += -I$(top_srcdir)/../support/include + +LINK_OBJS = $(psxshm02_OBJECTS) +LINK_LIBS = $(psxshm02_LDLIBS) + +psxshm02$(EXEEXT): $(psxshm02_OBJECTS) $(psxshm02_DEPENDENCIES) + @rm -f psxshm02$(EXEEXT) + $(make-exe) + +include $(top_srcdir)/../automake/local.am diff --git a/testsuites/psxtests/psxshm02/init.c b/testsuites/psxtests/psxshm02/init.c new file mode 100644 index 0000000000..29dea97f7c --- /dev/null +++ b/testsuites/psxtests/psxshm02/init.c @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2016 Gedare Bloom. + * + * 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. + */ + +/* + * From http://pubs.opengroup.org/onlinepubs/9699919799/functions/shm_open.html + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#define CONFIGURE_INIT +#include "system.h" +#include "pritime.h" + +#include <sys/mman.h> + +#include <errno.h> +#include <fcntl.h> +#include <string.h> + +const char rtems_test_name[] = "PSX SHM02"; + +#define MAX_LEN 10000 +struct region { /* Defines "structure" of shared memory */ + int len; + char buf[MAX_LEN]; +}; + +void *POSIX_Init( + void *argument +) +{ + struct region *p; + int fd; + int err; + char *name = "/shm"; + + TEST_BEGIN(); + + puts( "Init: shm_open" ); + fd = shm_open( name, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR ); + if ( fd == -1 ) { + printf ( "Error: %s\n", strerror(errno) ); + rtems_test_assert( fd != -1 ); + } + + puts( "Init: ftruncate" ); + err = ftruncate( fd, sizeof( struct region ) ); + if ( err == -1 ) { + printf ( "Error: %s\n", strerror(errno) ); + rtems_test_assert( err != -1 ); + } + + puts( "Init: mmap" ); + p = mmap( + NULL, + sizeof( struct region ), + PROT_READ | PROT_WRITE, MAP_SHARED, + fd, + 0 + ); + rtems_test_assert( p != MAP_FAILED ); + + puts( "Init: write to mapped region" ); + p->len = MAX_LEN; + + puts( "Init: munmap" ); + err = munmap( p, sizeof( struct region ) ); + if ( err == -1 ) { + printf ( "Error: %s\n", strerror(errno) ); + rtems_test_assert( err != -1 ); + } + + puts( "Init: close" ); + err = close( fd ); + if ( err == -1 ) { + printf ( "Error: %s\n", strerror(errno) ); + rtems_test_assert( err != -1 ); + } + + TEST_END(); + + rtems_test_exit(0); + return 0; +} diff --git a/testsuites/psxtests/psxshm02/psxshm02.scn b/testsuites/psxtests/psxshm02/psxshm02.scn new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/testsuites/psxtests/psxshm02/psxshm02.scn diff --git a/testsuites/psxtests/psxshm02/system.h b/testsuites/psxtests/psxshm02/system.h new file mode 100644 index 0000000000..d02c87f62c --- /dev/null +++ b/testsuites/psxtests/psxshm02/system.h @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2016 Gedare Bloom. + * + * 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 <pmacros.h> +#include <unistd.h> +#include <errno.h> + +void *POSIX_Init( + void *argument +); + +#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER +#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER + +#define CONFIGURE_INITIAL_EXTENSIONS RTEMS_TEST_INITIAL_EXTENSION + +#define CONFIGURE_MAXIMUM_POSIX_THREADS 1 +#define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 10 +#define CONFIGURE_MAXIMUM_POSIX_SHMS 1 +#define CONFIGURE_MEMORY_OVERHEAD 10 + +#define CONFIGURE_POSIX_INIT_THREAD_TABLE + +#include <rtems/posix/shm.h> +const POSIX_Shm_Object_operations _POSIX_Shm_Object_operations = { + _POSIX_Shm_Object_create_from_heap, + _POSIX_Shm_Object_resize_from_heap, + _POSIX_Shm_Object_delete_from_heap, + _POSIX_Shm_Object_read_from_heap +}; +#define CONFIGURE_HAS_OWN_POSIX_SHM_OBJECT_OPERATIONS + +#include <rtems/confdefs.h> diff --git a/testsuites/sptests/spsysinit01/init.c b/testsuites/sptests/spsysinit01/init.c index b81fbabbac..15072c3d20 100644 --- a/testsuites/sptests/spsysinit01/init.c +++ b/testsuites/sptests/spsysinit01/init.c @@ -43,6 +43,7 @@ #include <rtems/posix/pthreadimpl.h> #include <rtems/posix/rwlockimpl.h> #include <rtems/posix/semaphoreimpl.h> +#include <rtems/posix/shmimpl.h> #include <rtems/posix/timerimpl.h> #endif /* RTEMS_POSIX_API */ #include <rtems/posix/keyimpl.h> @@ -117,6 +118,8 @@ typedef enum { POSIX_BARRIER_POST, POSIX_RWLOCK_PRE, POSIX_RWLOCK_POST, + POSIX_SHM_PRE, + POSIX_SHM_POST, POSIX_CLEANUP_PRE, POSIX_CLEANUP_POST, #endif /* RTEMS_POSIX_API */ @@ -524,6 +527,18 @@ LAST(RTEMS_SYSINIT_POSIX_RWLOCK) next_step(POSIX_RWLOCK_POST); } +FIRST(RTEMS_SYSINIT_POSIX_SHM) +{ + assert(_POSIX_Shm_Information.maximum == 0); + next_step(POSIX_SHM_PRE); +} + +LAST(RTEMS_SYSINIT_POSIX_SHM) +{ + assert(_POSIX_Shm_Information.maximum != 0); + next_step(POSIX_SHM_POST); +} + static size_t user_extensions_pre_posix_cleanup; FIRST(RTEMS_SYSINIT_POSIX_CLEANUP) @@ -752,6 +767,8 @@ static void *POSIX_Init(void *arg) #define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 1 +#define CONFIGURE_MAXIMUM_POSIX_SHMS 1 + #define CONFIGURE_MAXIMUM_POSIX_TIMERS 1 #define CONFIGURE_MAXIMUM_POSIX_THREADS 1 |