14 #ifndef ECL_IPC_SHARED_MEMORY_RT_HPP_ 
   15 #define ECL_IPC_SHARED_MEMORY_RT_HPP_ 
   22 #if defined(ECL_IS_POSIX) 
   24 #if !defined(ECL_IS_APPLE) 
   25 #include <bits/posix_opt.h> 
   27 #ifdef _POSIX_SHARED_MEMORY_OBJECTS 
   28 #if _POSIX_SHARED_MEMORY_OBJECTS > 0 
   34 #ifndef ECL_HAS_POSIX_SHARED_MEMORY 
   35   #define ECL_HAS_POSIX_SHARED_MEMORY 
   37 #ifndef ECL_HAS_SHARED_MEMORY 
   38   #define ECL_HAS_SHARED_MEMORY 
   65 #ifndef ECL_DISABLE_EXCEPTIONS 
  104         SharedMemoryBase(
const std::string &name_id) :
 
  106                 shared_memory_manager(false)
 
  118         bool shared_memory_manager;
 
  137 template <
typename Storage>
 
  138 class ECL_PUBLIC SharedMemory : 
public ipc::SharedMemoryBase
 
  144         SharedMemory(
const std::string& string_id);
 
  145         virtual ~SharedMemory();
 
  147         Storage* data() { 
return storage; }         
 
  151         const int shared_memory_size;
 
  170 template <
typename Storage>
 
  171 SharedMemory<Storage>::SharedMemory(
const std::string& string_id ) :
 
  172         ipc::SharedMemoryBase(std::string(
"/")+string_id),
 
  173         shared_memory_size(sizeof(Storage)),
 
  176         int shm_descriptor = open();
 
  177     if ( shm_descriptor == -1) {
 
  178         ecl_throw( ipc::openSharedSectionException(LOC) );
 
  196     if ( (shm_address = mmap(0,shared_memory_size,PROT_READ|PROT_WRITE,MAP_SHARED,shm_descriptor,(
long) 0)) == MAP_FAILED )
 
  198         shared_memory_manager = 
false;
 
  199         close(shm_descriptor);
 
  201         ecl_throw( ipc::memoryMapException(LOC) );
 
  207     if ( ftruncate(shm_descriptor,shared_memory_size) < 0 )
 
  209         shared_memory_manager = 
false;
 
  210         close(shm_descriptor);
 
  212         ecl_throw(StandardException(LOC,OpenError,
"Shared memory created, but inflation to the desired size failed."));
 
  222     close(shm_descriptor);
 
  224     storage = (Storage*) shm_address;
 
  227     if ( shared_memory_manager ) {
 
  228         *storage = Storage();
 
  236 template <
typename Storage>
 
  237 SharedMemory<Storage>::~SharedMemory()
 
  240     munmap( (
void*) storage,shared_memory_size);
 
  243     if ( shared_memory_manager ) {