PLCnext API Documentation 23.0.2.9
SharedMemory.hpp
1#pragma once
3#include "Arp/System/Core/TypeName.hxx"
4#include "Arp/System/Core/AppDomainSingleton.hxx"
5#include "Arp/System/Commons/Logging.h"
6#include "Arp/System/Commons/Threading/Thread.hpp"
7#include "boost/interprocess/managed_shared_memory.hpp"
8#include <algorithm> // using std::replace
9#include <new> // using std::new(p)
10#include <iostream>
11
12namespace Arp { namespace System { namespace Commons { namespace Ipc
13{
14
17{
18public: // typedefs
19
20 typedef boost::interprocess::managed_shared_memory SharedMemoryImpl;
21 typedef SharedMemoryImpl::segment_manager SegmentManager;
22 typedef boost::interprocess::permissions SharedMemoryPermission;
23
25 template <class T>
26 using Ptr = boost::interprocess::offset_ptr<T>;
27
28public: // construction/destruction
29
33 SharedMemory(const char* name);
34
39 SharedMemory(const char* name, size_t memorySize);
40
42 ~SharedMemory(void) = default;
43
44public: // static operations
45
47 void Remove(void);
48
49public: // properties
50
54 const Arp::String& GetName(void)const;
55
59 size_t GetSize(void)const;
60
61public: // operation
62
68 byte* Allocate(size_t size);
69
73 void Deallocate(byte* pMemory);
74
78 template<class T>
79 Ptr<T> Get(const char* name);
80
87 template<class T, typename ...TArgs>
88 Ptr<T> GetOrConstruct(const char* name, TArgs... args);
89
96 template<class T, typename ...TArgs>
97 Ptr<T> Construct(const char* name, TArgs... args);
98
102 template<class T>
103 void Destroy(const char* name);
104
110 template<class T, typename ...TArgs>
111 Ptr<T> ConstructUnnamed(TArgs... args);
112
116 template<class T>
118
122 size_t GetFreeMemory(void)const;
123
125 void ZeroFreeMemory(void);
126
130 bool AllMemoryDeallocated(void);
131
135 bool CheckSanity(void);
136
137private: // deleted copying/assignment
138 SharedMemory(const SharedMemory& arg) = delete;
139 SharedMemory& operator=(const SharedMemory& arg) = delete;
140
141protected: // fields
142
145
147 SharedMemoryImpl sharedMemoryImpl;
148
149private:
150
151};
152
154// inline methods of class SharedMemory
155
156inline SharedMemory::SharedMemory(const char* name)
157 : memoryName(name)
158{
159 this->sharedMemoryImpl = SharedMemoryImpl(boost::interprocess::open_only, this->memoryName);
160}
161
162inline const Arp::String& SharedMemory::GetName(void)const
163{
164 return this->memoryName;
165}
166
167inline size_t SharedMemory::GetSize(void)const
168{
169 return this->sharedMemoryImpl.get_size();
170}
171
172inline byte* SharedMemory::Allocate(size_t size)
173{
174 return (byte*)this->sharedMemoryImpl.allocate(size);
175}
176
177inline void SharedMemory::Deallocate(byte* pMemory)
178{
179 this->sharedMemoryImpl.deallocate(pMemory);
180}
181
182template<class T>
184{
185 return sharedMemoryImpl.find<T>(name).first;
186}
187
188template<class T, typename ...TArgs>
189inline SharedMemory::Ptr<T> SharedMemory::GetOrConstruct(const char* name, TArgs... args)
190{
191 Ptr<T> result = Get<T>(name);
192 if (!result)
193 {
194 return Construct<T>(name, args...);
195 }
196 return result;
197}
198
199template<class T, typename ...TArgs>
200inline SharedMemory::Ptr<T> SharedMemory::Construct(const char* name, TArgs... args)
201{
202 return this->sharedMemoryImpl.construct<T>(name)(args...);
203}
204
205template<class T>
206inline void SharedMemory::Destroy(const char* name)
207{
208 Ptr<T> pValue = this->Get<T>(name);
209 if (pValue != nullptr)
210 {
211 // free memory
212 this->sharedMemoryImpl.destroy<T>(name);
213 }
214}
215
216template<class T, typename ...TArgs>
218{
219 // allocate memory
220 void* pResult = this->sharedMemoryImpl.allocate(sizeof(T));
221 // call ctor using placement new operator with allocated memory pointer
222 return new (pResult) T(args...);
223}
224
225template<class T>
227{
228 if (ptr != nullptr)
229 {
230 // call dtor of object explicitly
231 ptr->~T();
232 // free memory
233 this->sharedMemoryImpl.deallocate(ptr.get());
234 }
235}
236
238{
239 (void)boost::interprocess::shared_memory_object::remove(this->GetName());
240}
241
242inline size_t SharedMemory::GetFreeMemory(void)const
243{
244 return this->sharedMemoryImpl.get_free_memory();
245}
246
248{
249 this->sharedMemoryImpl.zero_free_memory();
250}
251
253{
254 return this->sharedMemoryImpl.all_memory_deallocated();
255}
256
258{
259 return this->sharedMemoryImpl.check_sanity();
260}
261
263// Template specializations
264
265}}}} // end of namespace Arp::System::Commons::Ipc
API to manage and manipulate memory shared between different processes
Definition: SharedMemory.hpp:17
void DestroyUnnamed(SharedMemory::Ptr< T > ptr)
Deallocates the unnamed object in the shared memory, also calling the objects destructor.
Definition: SharedMemory.hpp:226
byte * Allocate(size_t size)
Tries to allocate size amount of bytes in the memory.
Definition: SharedMemory.hpp:172
Arp::String memoryName
Name of memory identifying the shared memory inside the operating system.
Definition: SharedMemory.hpp:144
void ZeroFreeMemory(void)
Writes zero in all bytes not yet allocated.
Definition: SharedMemory.hpp:247
Ptr< T > Get(const char *name)
Tries to find a previously allocated named object.
Definition: SharedMemory.hpp:183
SharedMemoryImpl sharedMemoryImpl
Actual implementation of the shared memory functionality.
Definition: SharedMemory.hpp:147
boost::interprocess::offset_ptr< T > Ptr
Returned pointer types are shared memory based offset pointer.
Definition: SharedMemory.hpp:26
Ptr< T > GetOrConstruct(const char *name, TArgs... args)
Tries to find object identified by name, creates a new one if the object does not exists yet.
Definition: SharedMemory.hpp:189
void Deallocate(byte *pMemory)
Marks the memory pointed to by pMemory available for new allocation requests.
Definition: SharedMemory.hpp:177
bool AllMemoryDeallocated(void)
Checks if all memory has been deallocated.
Definition: SharedMemory.hpp:252
SharedMemory(const char *name)
Opens an existing shared memory.
Definition: SharedMemory.hpp:156
size_t GetSize(void) const
Returns the capacity of the shared memory in bytes.
Definition: SharedMemory.hpp:167
~SharedMemory(void)=default
Deallocates the memory for this management object but not the memory shared between processes.
void Destroy(const char *name)
Deallocates the object in the shared memory, also calling the objects destructor.
Definition: SharedMemory.hpp:206
size_t GetFreeMemory(void) const
Obtain the number of free bytes in the shared memory.
Definition: SharedMemory.hpp:242
SharedMemory(const char *name, size_t memorySize)
Creates an non-existing instance, throws if yet exists.
const Arp::String & GetName(void) const
Returns the name of the memory object.
Definition: SharedMemory.hpp:162
void Remove(void)
Removes the shared memory from the system.
Definition: SharedMemory.hpp:237
Ptr< T > Construct(const char *name, TArgs... args)
Creates a named object in the shared memory.
Definition: SharedMemory.hpp:200
bool CheckSanity(void)
Performs a sanity check over the shared memory.
Definition: SharedMemory.hpp:257
Ptr< T > ConstructUnnamed(TArgs... args)
Creates an unnamed object in the shared memory.
Definition: SharedMemory.hpp:217
@ System
System components used by the System, Device, Plc or Io domains.
Root namespace for the PLCnext API