46 size_t instanceIdHash,
const std::string& mapFileName,
const std::string& dataConsistencyKeyDescriptor =
"");
54 void read(uint64_t bar, uint64_t address, int32_t* data,
size_t sizeInBytes)
override;
55 void write(uint64_t bar, uint64_t address, int32_t
const* data,
size_t sizeInBytes)
override;
60 std::string address, std::map<std::string, std::string> parameters);
70 std::map<uint64_t, SharedMemoryVector*> _barContents;
73 std::map<uint64_t, size_t> _barSizesInBytes;
76 const char* SHARED_MEMORY_BAR_PREFIX =
"BAR_";
78 class InterruptDispatcherInterface;
82 class SharedMemoryManager {
86 SharedMemoryManager(
SharedDummyBackend&, std::size_t instanceIdHash,
const std::string&);
87 ~SharedMemoryManager();
99 std::pair<size_t, size_t> getInfoOnMemory();
105 static const size_t SHARED_MEMORY_CONST_OVERHEAD = 1000;
106 static const size_t SHARED_MEMORY_OVERHEAD_PER_VECTOR = 160;
108 const char* SHARED_MEMORY_PID_SET_NAME =
"PidSet";
109 const char* SHARED_MEMORY_REQUIRED_VERSION_NAME =
"RequiredVersion";
117 boost::interprocess::managed_shared_memory segment;
127 unsigned* requiredVersion{
nullptr};
129 size_t getRequiredMemoryWithOverhead();
137 bool checkPidSetConsistency();
140 std::vector<std::string> listNamedElements();
144 boost::interprocess::named_mutex interprocessMutex;
146 boost::movelib::unique_ptr<InterruptDispatcherInterface> intDispatcherIf;
150 std::unique_ptr<SharedMemoryManager> sharedMemoryManager;
153 void setupBarContents();
156 size_t getTotalRegisterSizeInBytes()
const;
158 static void checkSizeIsMultipleOfWordSize(
size_t sizeInBytes);
169 using SemId = std::uint32_t;
173 SemEntry() =
default;
174 boost::interprocess::interprocess_semaphore s{0};
182 struct InterruptEntry {
183 int _controllerId{0};
185 std::uint32_t _counter = 0;
190 static const int maxInterruptEntries = 1000;
204 using Sem = boost::interprocess::interprocess_semaphore;
206 ShmForSems() =
default;
207 ShmForSems(
const ShmForSems&) =
delete;
210 Sem* addSem(SemId semId);
211 bool removeSem(SemId semId);
213 void cleanup(
PidSet* pidSet);
217 void addInterrupt(uint32_t interruptNumber);
222 std::list<Sem*> findSems(uint32_t interruptNumber = {},
bool update =
false);
228 InterruptEntry interruptEntries[maxInterruptEntries];
231 struct InterruptDispatcherThread;
233 class InterruptDispatcherInterface {
239 InterruptDispatcherInterface(
SharedDummyBackend& backend, boost::interprocess::managed_shared_memory& shm,
240 boost::interprocess::named_mutex& shmMutex);
243 ~InterruptDispatcherInterface();
247 static void cleanupShm(boost::interprocess::managed_shared_memory& shm);
248 static void cleanupShm(boost::interprocess::managed_shared_memory& shm,
PidSet* pidSet);
251 void triggerInterrupt(uint32_t intNumber);
252 boost::interprocess::named_mutex& _shmMutex;
255 boost::movelib::unique_ptr<InterruptDispatcherThread> _dispatcherThread;
259 struct InterruptDispatcherThread {
261 explicit InterruptDispatcherThread(InterruptDispatcherInterface* dispatcherInterf);
262 InterruptDispatcherThread(
const InterruptDispatcherThread&) =
delete;
264 ~InterruptDispatcherThread();
267 void stop()
noexcept;
269 void handleInterrupt(uint32_t interruptNumber);
273 InterruptDispatcherInterface* _dispatcherInterf;
276 ShmForSems::Sem* _sem =
nullptr;
282 std::atomic_bool _started{
false};
283 std::atomic_bool _stop{
false};