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/psxtests/psxshm01/init.c | |
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/psxtests/psxshm01/init.c')
-rw-r--r-- | testsuites/psxtests/psxshm01/init.c | 91 |
1 files changed, 91 insertions, 0 deletions
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; +} |