File indexing completed on 2025-05-11 08:24:22
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032 #ifdef HAVE_CONFIG_H
0033 #include "config.h"
0034 #endif
0035
0036 #include <errno.h>
0037 #include <string.h>
0038 #include <rtems/score/wkspace.h>
0039 #include <rtems/posix/shmimpl.h>
0040
0041 int _POSIX_Shm_Object_create_from_workspace(
0042 POSIX_Shm_Object *shm_obj,
0043 size_t size
0044 )
0045 {
0046 shm_obj->handle = _Workspace_Allocate( size );
0047 if ( shm_obj->handle == NULL ) {
0048 return ENOMEM;
0049 }
0050
0051 memset( shm_obj->handle, 0, size );
0052 shm_obj->size = size;
0053 return 0;
0054 }
0055
0056 int _POSIX_Shm_Object_delete_from_workspace( POSIX_Shm_Object *shm_obj )
0057 {
0058
0059 memset( shm_obj->handle, 0, shm_obj->size );
0060 _Workspace_Free( shm_obj->handle );
0061 shm_obj->handle = NULL;
0062 shm_obj->size = 0;
0063 return 0;
0064 }
0065
0066 int _POSIX_Shm_Object_resize_from_workspace(
0067 POSIX_Shm_Object *shm_obj,
0068 size_t size
0069 )
0070 {
0071 int err;
0072
0073 if ( size == 0 ) {
0074 err = _POSIX_Shm_Object_delete_from_workspace( shm_obj );
0075 } else if ( shm_obj->handle == NULL && shm_obj->size == 0 ) {
0076 err = _POSIX_Shm_Object_create_from_workspace( shm_obj, size );
0077 } else {
0078
0079 err = EIO;
0080 }
0081 return err;
0082 }
0083
0084 int _POSIX_Shm_Object_read_from_workspace(
0085 POSIX_Shm_Object *shm_obj,
0086 void *buf,
0087 size_t count
0088 )
0089 {
0090 if ( shm_obj == NULL || shm_obj->handle == NULL )
0091 return 0;
0092
0093 if ( shm_obj->size < count ) {
0094 count = shm_obj->size;
0095 }
0096
0097 memcpy( buf, shm_obj->handle, count );
0098
0099 return count;
0100 }
0101
0102 void * _POSIX_Shm_Object_mmap_from_workspace(
0103 POSIX_Shm_Object *shm_obj,
0104 size_t len,
0105 int prot,
0106 off_t off
0107 )
0108 {
0109 if ( shm_obj == NULL || shm_obj->handle == NULL )
0110 return 0;
0111
0112
0113 if ( shm_obj->size < len + off ) {
0114 return NULL;
0115 }
0116
0117 return (char*)shm_obj->handle + off;
0118 }
0119