Add POSIX shared memory manager (Shm). --- cpukit/posix/Makefile.am | 3 + cpukit/posix/include/rtems/posix/config.h | 5 + cpukit/posix/include/rtems/posix/shm.h | 61 ++++++++ cpukit/posix/include/rtems/posix/shmimpl.h | 90 ++++++++++++ cpukit/posix/preinstall.am | 8 ++ cpukit/posix/src/shm.c | 48 +++++++ cpukit/posix/src/shmopen.c | 197 +++++++++++++++++++++++++- cpukit/rtems/src/rtemsobjectgetapiclassname.c | 1 + cpukit/sapi/include/confdefs.h | 28 ++++ cpukit/score/include/rtems/score/objectimpl.h | 5 +- cpukit/score/include/rtems/sysinit.h | 1 + testsuites/psxtests/psxshm01/system.h | 2 +- testsuites/sptests/spsysinit01/init.c | 17 +++ 13 files changed, 459 insertions(+), 7 deletions(-) create mode 100644 cpukit/posix/include/rtems/posix/shm.h create mode 100644 cpukit/posix/include/rtems/posix/shmimpl.h create mode 100644 cpukit/posix/src/shm.c
diff --git a/cpukit/posix/Makefile.am b/cpukit/posix/Makefile.am index c7620df..5490401 100644 --- a/cpukit/posix/Makefile.am +++ b/cpukit/posix/Makefile.am @@ -43,6 +43,8 @@ include_rtems_posix_HEADERS += include/rtems/posix/psignalimpl.h include_rtems_posix_HEADERS += include/rtems/posix/pthread.h include_rtems_posix_HEADERS += include/rtems/posix/pthreadimpl.h include_rtems_posix_HEADERS += include/rtems/posix/ptimer.h +include_rtems_posix_HEADERS += include/rtems/posix/shm.h +include_rtems_posix_HEADERS += include/rtems/posix/shmimpl.h include_rtems_posix_HEADERS += include/rtems/posix/semaphore.h include_rtems_posix_HEADERS += include/rtems/posix/semaphoreimpl.h include_rtems_posix_HEADERS += include/rtems/posix/threadsup.h @@ -100,6 +102,7 @@ libposix_a_SOURCES += src/munlockall.c 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/shmopen.c libposix_a_SOURCES += src/shmunlink.c diff --git a/cpukit/posix/include/rtems/posix/config.h b/cpukit/posix/include/rtems/posix/config.h index 636f1e7..0a1c4e0 100644 --- a/cpukit/posix/include/rtems/posix/config.h +++ b/cpukit/posix/include/rtems/posix/config.h @@ -111,6 +111,11 @@ typedef struct { uint32_t maximum_rwlocks; /** + * Maximum configured number of POSIX Shared memory objects. + */ + uint32_t maximum_shms; + + /** * This field contains the maximum number of POSIX API * spinlocks which are configured for this application. */ diff --git a/cpukit/posix/include/rtems/posix/shm.h b/cpukit/posix/include/rtems/posix/shm.h new file mode 100644 index 0000000..41557b1 --- /dev/null +++ b/cpukit/posix/include/rtems/posix/shm.h @@ -0,0 +1,61 @@ +/** + * @file + * + * @brief Internal Support for POSIX Shared Memory + */ + +/* + * 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. + */ + +#ifndef _RTEMS_POSIX_SHM_H +#define _RTEMS_POSIX_SHM_H + +#include <rtems/score/object.h> +#include <rtems/score/threadq.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @defgroup POSIXShmPrivate POSIX Shared Memory Private Support + * + * @ingroup POSIXAPI + * + * Internal implementation support for POSIX shared memory. + * @{ + */ + +typedef struct { + Objects_Control Object; + Thread_queue_Control Wait_queue; + + int reference_count; + + void *shm_object; + size_t shm_object_size; + void *( *shm_object_allocate )( size_t size ); + void ( *shm_object_free ) ( void *ptr ); + + uid_t uid; + gid_t gid; + mode_t mode; + + time_t atime; + time_t mtime; + time_t ctime; + +} POSIX_Shm_Control; + +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/cpukit/posix/include/rtems/posix/shmimpl.h b/cpukit/posix/include/rtems/posix/shmimpl.h new file mode 100644 index 0000000..2df4bd3 --- /dev/null +++ b/cpukit/posix/include/rtems/posix/shmimpl.h @@ -0,0 +1,90 @@ +/** + * @file + * + * @brief Private Support Information for POSIX Shared Memory + * + */ + +/* + * 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. + */ + +#ifndef _RTEMS_POSIX_SHMIMPL_H +#define _RTEMS_POSIX_SHMIMPL_H + +#include <rtems/posix/posixapi.h> +#include <rtems/posix/shm.h> +#include <rtems/score/objectimpl.h> + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @ingroup POSIXShmPrivate + * @{ + */ + +extern Objects_Information _POSIX_Shm_Information; + +RTEMS_INLINE_ROUTINE void _POSIX_Shm_Acquire_critical( + POSIX_Shm_Control *the_shm, + Thread_queue_Context *queue_context +) +{ + _Thread_queue_Acquire_critical( + &the_shm->Wait_queue, + &queue_context->Lock_context + ); +} + +RTEMS_INLINE_ROUTINE void _POSIX_Shm_Release( + POSIX_Shm_Control *the_shm, + Thread_queue_Context *queue_context +) +{ + _Thread_queue_Release( &the_shm->Wait_queue, &queue_context->Lock_context ); +} + +RTEMS_INLINE_ROUTINE POSIX_Shm_Control *_POSIX_Shm_Allocate_unprotected( void ) +{ + return (POSIX_Shm_Control *) + _Objects_Allocate_unprotected( &_POSIX_Shm_Information ); +} + +/** + * @brief POSIX Shared Memory Free + * + * This routine frees a shm control block. + */ +RTEMS_INLINE_ROUTINE void _POSIX_Shm_Free ( + POSIX_Shm_Control *the_shm +) +{ + _Objects_Free( &_POSIX_Shm_Information, &the_shm->Object ); +} + +RTEMS_INLINE_ROUTINE POSIX_Shm_Control *_POSIX_Shm_Get_by_name( + const char *name, + size_t *name_length_p, + Objects_Get_by_name_error *error +) +{ + return (POSIX_Shm_Control *) _Objects_Get_by_name( + &_POSIX_Shm_Information, + name, + name_length_p, + error + ); +} +/** @} */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/cpukit/posix/preinstall.am b/cpukit/posix/preinstall.am index 1d035e7..5863860 100644 --- a/cpukit/posix/preinstall.am +++ b/cpukit/posix/preinstall.am @@ -109,6 +109,14 @@ $(PROJECT_INCLUDE)/rtems/posix/ptimer.h: include/rtems/posix/ptimer.h $(PROJECT_ $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/ptimer.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/ptimer.h +$(PROJECT_INCLUDE)/rtems/posix/shm.h: include/rtems/posix/shm.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/shm.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/shm.h + +$(PROJECT_INCLUDE)/rtems/posix/shmimpl.h: include/rtems/posix/shmimpl.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) + $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/shmimpl.h +PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/shmimpl.h + $(PROJECT_INCLUDE)/rtems/posix/semaphore.h: include/rtems/posix/semaphore.h $(PROJECT_INCLUDE)/rtems/posix/$(dirstamp) $(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/posix/semaphore.h PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/posix/semaphore.h diff --git a/cpukit/posix/src/shm.c b/cpukit/posix/src/shm.c new file mode 100644 index 0000000..7dca6bb --- /dev/null +++ b/cpukit/posix/src/shm.c @@ -0,0 +1,48 @@ +/** + * @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 <sys/stat.h> +#include <fcntl.h> + +#include <rtems/system.h> +#include <rtems/config.h> +#include <rtems/libio.h> +#include <rtems/sysinit.h> +#include <rtems/posix/shmimpl.h> + +Objects_Information _POSIX_Shm_Information; + +static void _POSIX_Shm_Manager_initialization( void ) +{ + _Objects_Initialize_information( + &_POSIX_Shm_Information, /* object information table */ + OBJECTS_POSIX_API, /* object API */ + OBJECTS_POSIX_SHMS, /* object class */ + Configuration_POSIX_API.maximum_shms, + /* maximum objects of this class */ + sizeof( POSIX_Shm_Control ), + /* size of this object's control block */ + true, /* true if names for this object are strings */ + _POSIX_PATH_MAX, /* maximum length of each object's name */ + NULL /* Proxy extraction support callout */ + ); +} + +RTEMS_SYSINIT_ITEM( + _POSIX_Shm_Manager_initialization, + RTEMS_SYSINIT_POSIX_SHM, + RTEMS_SYSINIT_ORDER_MIDDLE +); diff --git a/cpukit/posix/src/shmopen.c b/cpukit/posix/src/shmopen.c index abac3f4..bc4923f 100644 --- a/cpukit/posix/src/shmopen.c +++ b/cpukit/posix/src/shmopen.c @@ -16,13 +16,202 @@ #include <sys/mman.h> #include <errno.h> +#include <unistd.h> +#include <fcntl.h> +#include <sys/stat.h> + +#include <rtems/libio_.h> #include <rtems/seterr.h> +#include <rtems/posix/shmimpl.h> +#include <rtems/score/wkspace.h> + +static const rtems_filesystem_file_handlers_r shm_handlers; + +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; + + _POSIX_Shm_Acquire_critical( shm, &queue_context ); + + shm_mtime_ctime_update( shm ); + + _POSIX_Shm_Release( shm, &queue_context ); + return 0; +} + +static inline POSIX_Shm_Control *shm_allocate( + const char *name_arg, + size_t name_len, + int oflag, + mode_t mode, + int *error +) +{ + POSIX_Shm_Control *shm; + char *name; + struct timeval tv; + + name = _Workspace_String_duplicate( name_arg, name_len ); + if ( name == NULL ) { + *error = ENOSPC; + return NULL; + } + + shm = _POSIX_Shm_Allocate_unprotected(); + if ( shm == NULL ) { + _Workspace_Free( name ); + *error = ENFILE; + return NULL; + } + + gettimeofday( &tv, 0 ); + + shm->reference_count = 1; + shm->shm_object = NULL; + shm->shm_object_allocate = _Workspace_Allocate_or_fatal_error; + shm->shm_object_free = _Workspace_Free; + shm->shm_object_size = 0; + shm->mode = mode & ~rtems_filesystem_umask; + shm->uid = geteuid(); + shm->gid = getegid(); + shm->atime = (time_t) tv.tv_sec; + shm->mtime = (time_t) tv.tv_sec; + shm->ctime = (time_t) tv.tv_sec; + + _Objects_Open_string( &_POSIX_Shm_Information, &shm->Object, name ); + + return shm; +} + +static inline bool shm_access_ok( POSIX_Shm_Control *shm, int oflag ) +{ + int flags; + if ( oflag & O_RDONLY ) { + flags = RTEMS_FS_PERMS_READ; + } else { + flags = RTEMS_FS_PERMS_WRITE; + } + return rtems_filesystem_check_access( flags, shm->mode, shm->uid, shm->gid ); +} + int shm_open( const char *name, int oflag, mode_t mode ) { - (void) name; - (void) oflag; - (void) mode; + int err = 0; + int fd; + rtems_libio_t *iop; + POSIX_Shm_Control *shm; + size_t len; + Objects_Get_by_name_error obj_err; + Thread_queue_Context queue_context; + + if ( ( oflag & O_ACCMODE ) != O_RDONLY && ( oflag & O_ACCMODE ) != O_RDWR ) { + rtems_set_errno_and_return_minus_one( EACCES ); + } + + if ( ( oflag & ~( O_RDONLY | O_RDWR | O_CREAT | O_EXCL | O_TRUNC ) ) != 0 ) { + rtems_set_errno_and_return_minus_one( EACCES ); + } + + if ( ( oflag & O_TRUNC ) != 0 && ( oflag & O_ACCMODE ) != O_RDWR ) { + rtems_set_errno_and_return_minus_one( EACCES ); + } - rtems_set_errno_and_return_minus_one( EINVAL ); + /* TODO see if the object exists, shms available */ + + _Objects_Allocator_lock(); + shm = _POSIX_Shm_Get_by_name( name, &len, &obj_err ); + + if ( shm == NULL ) { + switch ( obj_err ) { + case OBJECTS_GET_BY_NAME_INVALID_NAME: + err = EINVAL; + break; + + case OBJECTS_GET_BY_NAME_NAME_TOO_LONG: + err = ENAMETOOLONG; + break; + + case OBJECTS_GET_BY_NAME_NO_OBJECT: + default: + /* Reject any name without a leading slash. */ + if ( name[0] != '/' ) { + err = EINVAL; + break; + } + + if ( ( oflag & O_CREAT ) != O_CREAT ) { + err = ENOENT; + break; + } + + shm = shm_allocate(name, len, oflag, mode, &err); + break; + } + _Objects_Allocator_unlock(); + if ( err != 0 ) { + rtems_set_errno_and_return_minus_one( err ); + } + } else { /* shm exists */ + _Objects_Allocator_unlock(); + if ( ( oflag & ( O_EXCL | O_CREAT ) ) == ( O_EXCL | O_CREAT ) ) { + rtems_set_errno_and_return_minus_one( EEXIST ); + } + if ( !shm_access_ok( shm, oflag ) ) { + rtems_set_errno_and_return_minus_one( EACCES ); + } + _POSIX_Shm_Acquire_critical( shm, &queue_context ); + ++shm->reference_count; + _POSIX_Shm_Release( shm, &queue_context ); + } + + iop = rtems_libio_allocate(); + if ( iop == NULL ) { + rtems_set_errno_and_return_minus_one( EMFILE ); + } + if ( oflag & O_TRUNC ) { + shm_ftruncate( iop, 0 ); + } + fd = rtems_libio_iop_to_descriptor( iop ); + iop->flags |= LIBIO_FLAGS_CLOSE_ON_EXEC; + if ( oflag & O_RDONLY ) { + iop->flags |= LIBIO_FLAGS_READ; + } else { + iop->flags |= LIBIO_FLAGS_READ_WRITE; + } + iop->data0 = fd; + iop->data1 = shm; + iop->pathinfo.handlers = &shm_handlers; + iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry; + rtems_filesystem_location_add_to_mt_entry( &iop->pathinfo ); + + return fd; } + +static const rtems_filesystem_file_handlers_r shm_handlers = { + .open_h = rtems_filesystem_default_open, + .close_h = rtems_filesystem_default_close, + .read_h = rtems_filesystem_default_read, + .write_h = rtems_filesystem_default_write, + .ioctl_h = rtems_filesystem_default_ioctl, + .lseek_h = rtems_filesystem_default_lseek, + .fstat_h = rtems_filesystem_default_fstat, + .ftruncate_h = shm_ftruncate, + .fsync_h = rtems_filesystem_default_fsync_or_fdatasync, + .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, + .fcntl_h = rtems_filesystem_default_fcntl, + .kqfilter_h = rtems_filesystem_default_kqfilter, + .poll_h = rtems_filesystem_default_poll, + .readv_h = rtems_filesystem_default_readv, + .writev_h = rtems_filesystem_default_writev +}; diff --git a/cpukit/rtems/src/rtemsobjectgetapiclassname.c b/cpukit/rtems/src/rtemsobjectgetapiclassname.c index dd92e6c..0923a89 100644 --- a/cpukit/rtems/src/rtemsobjectgetapiclassname.c +++ b/cpukit/rtems/src/rtemsobjectgetapiclassname.c @@ -56,6 +56,7 @@ static const rtems_assoc_t rtems_object_api_posix_assoc[] = { { "Barrier", OBJECTS_POSIX_BARRIERS, 0}, { "Spinlock", OBJECTS_POSIX_SPINLOCKS, 0}, { "RWLock", OBJECTS_POSIX_RWLOCKS, 0}, + { "Shared Memory", OBJECTS_POSIX_SHMS, 0}, { NULL, 0, 0} }; #endif diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h index b75839e..385bf62 100644 --- a/cpukit/sapi/include/confdefs.h +++ b/cpukit/sapi/include/confdefs.h @@ -2068,6 +2068,10 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; #define CONFIGURE_MAXIMUM_POSIX_RWLOCKS \ rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE) #endif + #if !defined(CONFIGURE_MAXIMUM_POSIX_SHMS) + #define CONFIGURE_MAXIMUM_POSIX_SHMS \ + rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE) + #endif #if !defined(CONFIGURE_MAXIMUM_POSIX_SPINLOCKS) #define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS \ rtems_resource_unlimited(CONFIGURE_UNLIMITED_ALLOCATION_SIZE) @@ -2468,6 +2472,7 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; #include <rtems/posix/pthread.h> #include <rtems/posix/rwlock.h> #include <rtems/posix/semaphore.h> + #include <rtems/posix/shm.h> #include <rtems/posix/spinlock.h> #include <rtems/posix/threadsup.h> #include <rtems/posix/timer.h> @@ -2648,6 +2653,23 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; #define CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS(_rwlocks) \ _Configure_Object_RAM(_rwlocks, sizeof(POSIX_RWLock_Control) ) + /** + * Configure the maximum number of POSIX shared memory objects. + */ + #if !defined(CONFIGURE_MAXIMUM_POSIX_SHMS) + #define CONFIGURE_MAXIMUM_POSIX_SHMS 0 + #endif + + /** + * This macro is calculated to specify the memory required for + * POSIX API shared memory. + * + * This is an internal parameter. + */ + #define CONFIGURE_MEMORY_FOR_POSIX_SHMS(_shms) \ + _Configure_Object_RAM(_shms, sizeof(POSIX_Shm_Control) ) + + #ifdef CONFIGURE_POSIX_INIT_THREAD_TABLE #ifdef CONFIGURE_POSIX_HAS_OWN_INIT_THREAD_TABLE @@ -2875,6 +2897,8 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; CONFIGURE_MAXIMUM_POSIX_SPINLOCKS) + \ CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS( \ CONFIGURE_MAXIMUM_POSIX_RWLOCKS) + \ + CONFIGURE_MEMORY_FOR_POSIX_SHMS( \ + CONFIGURE_MAXIMUM_POSIX_SHMS) + \ CONFIGURE_MEMORY_FOR_POSIX_TIMERS(CONFIGURE_MAXIMUM_POSIX_TIMERS)) #else /** @@ -3333,6 +3357,7 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; CONFIGURE_MAXIMUM_POSIX_SEMAPHORES, CONFIGURE_MAXIMUM_POSIX_BARRIERS, CONFIGURE_MAXIMUM_POSIX_RWLOCKS, + CONFIGURE_MAXIMUM_POSIX_SHMS, CONFIGURE_MAXIMUM_POSIX_SPINLOCKS, CONFIGURE_POSIX_INIT_THREAD_TABLE_SIZE, CONFIGURE_POSIX_INIT_THREAD_TABLE_NAME @@ -3550,6 +3575,7 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; uint32_t POSIX_BARRIERS; uint32_t POSIX_SPINLOCKS; uint32_t POSIX_RWLOCKS; + uint32_t POSIX_SHMS; #endif /* Stack space sizes */ @@ -3604,6 +3630,7 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; CONFIGURE_MEMORY_FOR_POSIX_BARRIERS( CONFIGURE_MAXIMUM_POSIX_BARRIERS ), CONFIGURE_MEMORY_FOR_POSIX_SPINLOCKS( CONFIGURE_MAXIMUM_POSIX_SPINLOCKS ), CONFIGURE_MEMORY_FOR_POSIX_RWLOCKS( CONFIGURE_MAXIMUM_POSIX_RWLOCKS ), + CONFIGURE_MEMORY_FOR_POSIX_SHMS( CONFIGURE_MAXIMUM_POSIX_SHMS ), CONFIGURE_MEMORY_FOR_POSIX_TIMERS( CONFIGURE_MAXIMUM_POSIX_TIMERS ), #endif @@ -3676,6 +3703,7 @@ extern rtems_initialization_tasks_table Initialization_tasks[]; (CONFIGURE_MAXIMUM_POSIX_BARRIERS != 0) || \ (CONFIGURE_MAXIMUM_POSIX_SPINLOCKS != 0) || \ (CONFIGURE_MAXIMUM_POSIX_RWLOCKS != 0) || \ + (CONFIGURE_MAXIMUM_POSIX_SHMS != 0) || \ defined(CONFIGURE_POSIX_INIT_THREAD_TABLE)) #error "CONFIGURATION ERROR: POSIX API support not configured!!" #endif diff --git a/cpukit/score/include/rtems/score/objectimpl.h b/cpukit/score/include/rtems/score/objectimpl.h index f5beb3b..13dd291 100644 --- a/cpukit/score/include/rtems/score/objectimpl.h +++ b/cpukit/score/include/rtems/score/objectimpl.h @@ -93,11 +93,12 @@ typedef enum { OBJECTS_POSIX_TIMERS = 9, OBJECTS_POSIX_BARRIERS = 10, OBJECTS_POSIX_SPINLOCKS = 11, - OBJECTS_POSIX_RWLOCKS = 12 + OBJECTS_POSIX_RWLOCKS = 12, + OBJECTS_POSIX_SHMS = 13 } Objects_POSIX_API; /** This macro is used to generically specify the last API index. */ -#define OBJECTS_POSIX_CLASSES_LAST OBJECTS_POSIX_RWLOCKS +#define OBJECTS_POSIX_CLASSES_LAST OBJECTS_POSIX_SHMS /* * For fake objects, which have an object identifier, but no objects diff --git a/cpukit/score/include/rtems/sysinit.h b/cpukit/score/include/rtems/sysinit.h index ad68c45..6a97d78 100644 --- a/cpukit/score/include/rtems/sysinit.h +++ b/cpukit/score/include/rtems/sysinit.h @@ -57,6 +57,7 @@ extern "C" { #define RTEMS_SYSINIT_POSIX_SPINLOCK 000369 #define RTEMS_SYSINIT_POSIX_CLEANUP 00036a #define RTEMS_SYSINIT_POSIX_KEYS 00036b +#define RTEMS_SYSINIT_POSIX_SHM 00036c #define RTEMS_SYSINIT_IDLE_THREADS 000380 #define RTEMS_SYSINIT_LIBIO 000400 #define RTEMS_SYSINIT_ROOT_FILESYSTEM 000401 diff --git a/testsuites/psxtests/psxshm01/system.h b/testsuites/psxtests/psxshm01/system.h index 9a55a8a..1dde70e 100644 --- a/testsuites/psxtests/psxshm01/system.h +++ b/testsuites/psxtests/psxshm01/system.h @@ -21,7 +21,7 @@ void *POSIX_Init( #define CONFIGURE_MAXIMUM_POSIX_THREADS 1 #define CONFIGURE_LIBIO_MAXIMUM_FILE_DESCRIPTORS 10 -#define CONFIGURE_MAXIMUM_SHMEMS 1 +#define CONFIGURE_MAXIMUM_POSIX_SHMS 1 #define CONFIGURE_POSIX_INIT_THREAD_TABLE diff --git a/testsuites/sptests/spsysinit01/init.c b/testsuites/sptests/spsysinit01/init.c index 1ce22d5..3f36842 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/spinlockimpl.h> #include <rtems/posix/timerimpl.h> #endif /* RTEMS_POSIX_API */ @@ -118,6 +119,8 @@ typedef enum { POSIX_BARRIER_POST, POSIX_RWLOCK_PRE, POSIX_RWLOCK_POST, + POSIX_SHM_PRE, + POSIX_SHM_POST, POSIX_SPINLOCK_PRE, POSIX_SPINLOCK_POST, POSIX_CLEANUP_PRE, @@ -527,6 +530,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); +} + FIRST(RTEMS_SYSINIT_POSIX_SPINLOCK) { assert(_POSIX_Spinlock_Information.maximum == 0); @@ -767,6 +782,8 @@ static void *POSIX_Init(void *arg) #define CONFIGURE_MAXIMUM_POSIX_SEMAPHORES 1 +#define CONFIGURE_MAXIMUM_POSIX_SHMS 1 + #define CONFIGURE_MAXIMUM_POSIX_SPINLOCKS 1 #define CONFIGURE_MAXIMUM_POSIX_TIMERS 1 -- 1.9.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel