From ba77628250ae7158db363fc0d7886ebd43e9cb69 Mon Sep 17 00:00:00 2001 From: Gedare Bloom Date: Fri, 12 Aug 2016 15:25:10 -0400 Subject: 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. --- cpukit/posix/src/shmwkspace.c | 78 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 cpukit/posix/src/shmwkspace.c (limited to 'cpukit/posix/src/shmwkspace.c') diff --git a/cpukit/posix/src/shmwkspace.c b/cpukit/posix/src/shmwkspace.c new file mode 100644 index 0000000000..6d6cd211a5 --- /dev/null +++ b/cpukit/posix/src/shmwkspace.c @@ -0,0 +1,78 @@ +/** + * @file + */ + +/* + * 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. + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +int _POSIX_Shm_Object_create_from_workspace( + POSIX_Shm_Object *shm_obj, + size_t size +) +{ + shm_obj->handle = _Workspace_Allocate_or_fatal_error( size ); + memset( shm_obj->handle, 0, size ); + shm_obj->size = size; + return 0; +} + +int _POSIX_Shm_Object_delete_from_workspace( POSIX_Shm_Object *shm_obj ) +{ + /* zero out memory before releasing it. */ + memset( shm_obj->handle, 0, shm_obj->size ); + _Workspace_Free( shm_obj->handle ); + shm_obj->handle = NULL; + shm_obj->size = 0; + return 0; +} + +int _POSIX_Shm_Object_resize_from_workspace( + POSIX_Shm_Object *shm_obj, + size_t size +) +{ + int err; + + if ( size == 0 ) { + err = _POSIX_Shm_Object_delete_from_workspace( shm_obj ); + } else if ( shm_obj->handle == NULL && shm_obj->size == 0 ) { + err = _POSIX_Shm_Object_create_from_workspace( shm_obj, size ); + } else { + /* Refuse to resize a workspace object. */ + err = EIO; + } + return err; +} + +int _POSIX_Shm_Object_read_from_workspace( + POSIX_Shm_Object *shm_obj, + void *buf, + size_t count +) +{ + if ( shm_obj == NULL || shm_obj->handle == NULL ) + return 0; + + if ( shm_obj->size < count ) { + count = shm_obj->size; + } + + memcpy( buf, shm_obj->handle, count ); + + return count; +} + + -- cgit v1.2.3