[PATCH 2/5] posix: shared memory support

Gedare Bloom gedare at rtems.org
Wed Aug 17 20:02:38 UTC 2016


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



More information about the devel mailing list