--- cpukit/posix/Makefile.am | 2 + cpukit/posix/include/rtems/posix/shm.h | 65 ++++++++++++++++++++++++----- cpukit/posix/include/rtems/posix/shmimpl.h | 11 +++++ cpukit/posix/src/shmheap.c | 60 ++++++++++++++++++++++++++ cpukit/posix/src/shmopen.c | 56 +++++-------------------- cpukit/posix/src/shmwkspace.c | 67 ++++++++++++++++++++++++++++++ cpukit/sapi/include/confdefs.h | 13 +++++- testsuites/psxtests/Makefile.am | 2 +- testsuites/psxtests/configure.ac | 1 + 9 files changed, 219 insertions(+), 58 deletions(-) create mode 100644 cpukit/posix/src/shmheap.c create mode 100644 cpukit/posix/src/shmwkspace.c
diff --git a/cpukit/posix/Makefile.am b/cpukit/posix/Makefile.am index 5490401..1851535 100644 --- a/cpukit/posix/Makefile.am +++ b/cpukit/posix/Makefile.am @@ -103,8 +103,10 @@ libposix_a_SOURCES += src/munlock.c libposix_a_SOURCES += src/munmap.c libposix_a_SOURCES += src/posix_madvise.c libposix_a_SOURCES += src/shm.c +libposix_a_SOURCES += src/shmheap.c libposix_a_SOURCES += src/shmopen.c libposix_a_SOURCES += src/shmunlink.c +libposix_a_SOURCES += src/shmwkspace.c ## MESSAGE_QUEUE_C_FILES libposix_a_SOURCES += src/mqueue.c src/mqueueclose.c \ diff --git a/cpukit/posix/include/rtems/posix/shm.h b/cpukit/posix/include/rtems/posix/shm.h index f3d7a91..eae0dcf 100644 --- a/cpukit/posix/include/rtems/posix/shm.h +++ b/cpukit/posix/include/rtems/posix/shm.h @@ -30,6 +30,13 @@ extern "C" { * Internal implementation support for POSIX shared memory. * @{ */ +typedef struct POSIX_Shm_Object_operations POSIX_Shm_Object_operations; +extern const POSIX_Shm_Object_operations _POSIX_Shm_Object_operations; +typedef struct { + void *handle; + size_t size; + const POSIX_Shm_Object_operations *ops; +} POSIX_Shm_Object; typedef struct { Objects_Control Object; @@ -37,15 +44,7 @@ typedef struct { int reference_count; - void *shm_object; - size_t shm_object_size; - void *( *shm_object_allocate )( size_t size ); - void *( *shm_object_reallocate )( - void *ptr, - size_t curr_size, - size_t new_size - ); - void ( *shm_object_free ) ( void *ptr ); + POSIX_Shm_Object shm_object; uid_t uid; gid_t gid; @@ -54,9 +53,55 @@ typedef struct { time_t atime; time_t mtime; time_t ctime; - } POSIX_Shm_Control; +struct POSIX_Shm_Object_operations { + int ( *object_create ) ( POSIX_Shm_Control *shm, size_t size ); + int ( *object_resize ) ( POSIX_Shm_Control *shm, size_t size ); + int ( *object_delete ) ( POSIX_Shm_Control *shm ); + void *( *object_mmap ) ( POSIX_Shm_Control *shm, size_t len, int prot, int flags, off_t off ); +}; + +extern int _POSIX_Shm_Object_create_from_workspace( + POSIX_Shm_Control *shm, + size_t size +); + +extern int _POSIX_Shm_Object_delete_from_workspace( POSIX_Shm_Control *shm ); + +extern int _POSIX_Shm_Object_resize_from_workspace( + POSIX_Shm_Control *shm, + size_t size +); + +extern void *_POSIX_Shm_Object_mmap_from_workspace( + POSIX_Shm_Control *shm, + size_t len, + int prot, + int flags, + off_t off +); + +extern int _POSIX_Shm_Object_create_from_heap( + POSIX_Shm_Control *shm, + size_t size +); + +extern int _POSIX_Shm_Object_delete_from_heap( POSIX_Shm_Control *shm ); + +extern int _POSIX_Shm_Object_resize_from_heap( + POSIX_Shm_Control *shm, + size_t size +); + +extern void *_POSIX_Shm_Object_mmap_from_heap( + POSIX_Shm_Control *shm, + size_t len, + int prot, + int flags, + off_t off +); + /** @} */ #ifdef __cplusplus diff --git a/cpukit/posix/include/rtems/posix/shmimpl.h b/cpukit/posix/include/rtems/posix/shmimpl.h index 2df4bd3..c012771 100644 --- a/cpukit/posix/include/rtems/posix/shmimpl.h +++ b/cpukit/posix/include/rtems/posix/shmimpl.h @@ -81,6 +81,17 @@ RTEMS_INLINE_ROUTINE POSIX_Shm_Control *_POSIX_Shm_Get_by_name( error ); } + +RTEMS_INLINE_ROUTINE void _POSIX_Shm_Update_mtime_ctime( + POSIX_Shm_Control *shm +) +{ + struct timeval now; + gettimeofday( &now, 0 ); + shm->mtime = now.tv_sec; + shm->ctime = now.tv_sec; +} + /** @} */ #ifdef __cplusplus diff --git a/cpukit/posix/src/shmheap.c b/cpukit/posix/src/shmheap.c new file mode 100644 index 0000000..4f6f105 --- /dev/null +++ b/cpukit/posix/src/shmheap.c @@ -0,0 +1,60 @@ +/** + * @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 <errno.h> +#include <stdlib.h> +#include <rtems/posix/shmimpl.h> + +int _POSIX_Shm_Object_create_from_heap( + POSIX_Shm_Control *shm, + size_t size +) +{ + shm->shm_object.handle = malloc( size ); + shm->shm_object.size = size; + return 0; +} + +int _POSIX_Shm_Object_delete_from_heap( POSIX_Shm_Control *shm ) +{ + free( shm->shm_object.handle ); + shm->shm_object.handle = NULL; + shm->shm_object.size = 0; + return 0; +} + +int _POSIX_Shm_Object_resize_from_heap( + POSIX_Shm_Control *shm, + size_t size +) +{ + shm->shm_object.handle = realloc( shm->shm_object.handle, size ); + shm->shm_object.size = size; + return 0; +} + +void *_POSIX_Shm_Object_mmap_from_heap( + POSIX_Shm_Control *shm, + size_t len, + int prot, + int flags, + off_t off +) +{ + return NULL; +} + + diff --git a/cpukit/posix/src/shmopen.c b/cpukit/posix/src/shmopen.c index c8284e6..7823785 100644 --- a/cpukit/posix/src/shmopen.c +++ b/cpukit/posix/src/shmopen.c @@ -28,55 +28,21 @@ static const rtems_filesystem_file_handlers_r shm_handlers; -static void* shm_reallocate_from_workspace( - void *ptr, - size_t curr_size, - size_t new_size -) -{ - char *new_ptr; - char *old_ptr = (char*) ptr; - int i; - - if ( new_size == 0 ) { - _Workspace_Free( ptr ); - return NULL; - } - - new_ptr = _Workspace_Allocate_or_fatal_error( new_size ); - /* memcpy ... */ - for ( i = 0; i < curr_size && i < new_size; i++ ) { - new_ptr[i] = old_ptr[i]; - } - _Workspace_Free(ptr); - - return new_ptr; -} - -static inline void shm_mtime_ctime_update( POSIX_Shm_Control *shm ) -{ - struct timeval now; - - gettimeofday( &now, 0 ); - shm->mtime = now.tv_sec; - shm->ctime = now.tv_sec; -} - static int shm_ftruncate( rtems_libio_t *iop, off_t length ) { Thread_queue_Context queue_context; POSIX_Shm_Control *shm = (POSIX_Shm_Control *) iop->data1; + int err; _POSIX_Shm_Acquire_critical( shm, &queue_context ); - shm->shm_object = (*shm->shm_object_reallocate)( - shm->shm_object, - shm->shm_object_size, - length - ); - shm->shm_object_size = length; + err = (*shm->shm_object.ops->object_resize)( shm, length ); - shm_mtime_ctime_update( shm ); + if ( err != 0 ) { + rtems_set_errno_and_return_minus_one( err ); + } + + _POSIX_Shm_Update_mtime_ctime( shm ); _POSIX_Shm_Release( shm, &queue_context ); return 0; @@ -110,11 +76,9 @@ static inline POSIX_Shm_Control *shm_allocate( gettimeofday( &tv, 0 ); shm->reference_count = 1; - shm->shm_object = NULL; - shm->shm_object_allocate = _Workspace_Allocate_or_fatal_error; - shm->shm_object_reallocate = shm_reallocate_from_workspace; - shm->shm_object_free = _Workspace_Free; - shm->shm_object_size = 0; + shm->shm_object.handle = NULL; + shm->shm_object.size = 0; + shm->shm_object.ops = &_POSIX_Shm_Object_operations; shm->mode = mode & ~rtems_filesystem_umask; shm->uid = geteuid(); shm->gid = getegid(); diff --git a/cpukit/posix/src/shmwkspace.c b/cpukit/posix/src/shmwkspace.c new file mode 100644 index 0000000..f4f79a1 --- /dev/null +++ b/cpukit/posix/src/shmwkspace.c @@ -0,0 +1,67 @@ +/** + * @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 <errno.h> +#include <rtems/score/wkspace.h> +#include <rtems/posix/shmimpl.h> + +int _POSIX_Shm_Object_create_from_workspace( + POSIX_Shm_Control *shm, + size_t size +) +{ + shm->shm_object.handle = _Workspace_Allocate_or_fatal_error( size ); + shm->shm_object.size = size; + return 0; +} + +int _POSIX_Shm_Object_delete_from_workspace( POSIX_Shm_Control *shm ) +{ + _Workspace_Free( shm->shm_object.handle ); + shm->shm_object.handle = NULL; + shm->shm_object.size = 0; + return 0; +} + +int _POSIX_Shm_Object_resize_from_workspace( + POSIX_Shm_Control *shm, + size_t size +) +{ + int err; + + if ( size == 0 ) { + err = _POSIX_Shm_Object_delete_from_workspace( shm ); + } else if ( shm->shm_object.handle == NULL && shm->shm_object.size == 0 ) { + err = _POSIX_Shm_Object_create_from_workspace( shm, size ); + } else { + err = EIO; + } + return err; +} + +void *_POSIX_Shm_Object_mmap_from_workspace( + POSIX_Shm_Control *shm, + size_t len, + int prot, + int flags, + off_t off +) +{ + return NULL; +} + + diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h index 385bf62..597c2f3 100644 --- a/cpukit/sapi/include/confdefs.h +++ b/cpukit/sapi/include/confdefs.h @@ -2658,6 +2658,17 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; */ #if !defined(CONFIGURE_MAXIMUM_POSIX_SHMS) #define CONFIGURE_MAXIMUM_POSIX_SHMS 0 + #else + #ifdef CONFIGURE_INIT + #if !defined(CONFIGURE_HAS_OWN_POSIX_SHM_OBJECT_OPERATIONS) + const POSIX_Shm_Object_operations _POSIX_Shm_Object_operations = { + _POSIX_Shm_Object_create_from_workspace, + _POSIX_Shm_Object_resize_from_workspace, + _POSIX_Shm_Object_delete_from_workspace, + _POSIX_Shm_Object_mmap_from_workspace + }; + #endif + #endif #endif /** @@ -2667,7 +2678,7 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; * This is an internal parameter. */ #define CONFIGURE_MEMORY_FOR_POSIX_SHMS(_shms) \ - _Configure_Object_RAM(_shms, sizeof(POSIX_Shm_Control) ) + _Configure_POSIX_Named_Object_RAM(_shms, sizeof(POSIX_Shm_Control) ) #ifdef CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/psxtests/Makefile.am b/testsuites/psxtests/Makefile.am index 206c450..bc76339 100644 --- a/testsuites/psxtests/Makefile.am +++ b/testsuites/psxtests/Makefile.am @@ -9,7 +9,7 @@ _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 psxshm01 \ + psxmutexattr01 psxobj01 psxrwlock01 psxsem01 psxshm01 psxshm02 \ psxsignal01 psxsignal02 psxsignal03 psxsignal04 psxsignal05 psxsignal06 \ psxspin01 psxspin02 psxsysconf \ psxtime psxtimer01 psxtimer02 psxualarm psxusleep psxfatal01 psxfatal02 \ diff --git a/testsuites/psxtests/configure.ac b/testsuites/psxtests/configure.ac index e150fc0..fa730da 100644 --- a/testsuites/psxtests/configure.ac +++ b/testsuites/psxtests/configure.ac @@ -191,6 +191,7 @@ psxrdwrv/Makefile psxrwlock01/Makefile psxsem01/Makefile psxshm01/Makefile +psxshm02/Makefile psxsignal01/Makefile psxsignal02/Makefile psxsignal03/Makefile -- 1.9.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel