[PATCH 4/5] posix: add user-facing hooks for shm object management

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


---
 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



More information about the devel mailing list