MNE-CPP  0.1.9
A Framework for Electrophysiology
eventsharedmemmanager.h
Go to the documentation of this file.
1 //=============================================================================================================
36 #ifndef EVENTSHAREDMEMMANAGER_EVENTS_H
37 #define EVENTSHAREDMEMMANAGER_EVENTS_H
38 
39 
40 //=============================================================================================================
41 // STD INCLUDES
42 //=============================================================================================================
43 
44 #include <string>
45 #include <memory>
46 #include <chrono>
47 #include <thread>
48 #include <mutex>
49 #include <atomic>
50 
51 //=============================================================================================================
52 // Qt INCLUDES
53 //=============================================================================================================
54 
55 #include <QSharedMemory>
56 
57 //=============================================================================================================
58 // MNECPP INCLUDES
59 //=============================================================================================================
60 
61 #include "event.h"
62 #include "eventgroup.h"
63 
64 namespace EVENTSLIB {
65 
66 //=============================================================================================================
67 // EVENTSLIB FORWARD DECLARATIONS
68 //=============================================================================================================
69 
70 enum SharedMemoryMode { READ, WRITE, READWRITE };
71 class EventManager;
72 
73 namespace EVENTSINTERNAL {
74 
75 //=========================================================================================================
79 enum EventUpdateType{ NULL_EVENT, NEW_EVENT, DELETE_EVENT};
80 
81 //=========================================================================================================
85 const std::string EventUpdateTypeString[3] = {"Null Event", "New Event", "Delete Event"};
86 
92 {
93 public:
94  //=========================================================================================================
98  EventUpdate();
99 
100  //=========================================================================================================
107  EventUpdate(int sample, int creator, enum EventUpdateType t);
108 
109  //=========================================================================================================
114  long long getCreationTime() const;
115 
116  //=========================================================================================================
121  int getSample() const;
122 
123  //=========================================================================================================
128  int getCreatorId() const;
129 
130  //=========================================================================================================
135  enum EventUpdateType getType() const;
136 
137  //=========================================================================================================
142  void setType(enum EventUpdateType t);
143 
144  //=========================================================================================================
149  std::string eventTypeToText();
150 
151 protected:
154  long long m_CreationTime;
156 };
157 
162 {
163 public:
164  //=========================================================================================================
169  explicit EventSharedMemManager(EVENTSLIB::EventManager* parent = nullptr);
170 
171  //=========================================================================================================
176 
177  //=========================================================================================================
182  void init(EVENTSLIB::SharedMemoryMode mode);
183 
184  //=========================================================================================================
189  bool isInit() const;
190 
191  //=========================================================================================================
195  void stop();
196 
197  //=========================================================================================================
202  void addEvent(int sample);
203 
204  //=========================================================================================================
209  void deleteEvent(int sample);
210 
211  //=========================================================================================================
216  static long long getTimeNow();
217 
218  //=========================================================================================================
223  void processEvent(const EventUpdate& ne);
224 
225 private:
226  //=========================================================================================================
231  void attachToSharedSegment(QSharedMemory::AccessMode mode);
232 
233  //=========================================================================================================
240  bool createSharedSegment(int bufferSize, QSharedMemory::AccessMode mode);
241 
242  //=========================================================================================================
246  void launchSharedMemoryWatcherThread();
247 
248  //=========================================================================================================
253  void attachToOrCreateSharedSegment(QSharedMemory::AccessMode mode);
254 
255  //=========================================================================================================
259  void stopSharedMemoryWatcherThread();
260 
261  //=========================================================================================================
265  void detachFromSharedMemory();
266 
267  //=========================================================================================================
272  inline static int generateId();
273 
274  //=========================================================================================================
279  void processNewEvent(const EventUpdate& n);
280 
281  //=========================================================================================================
286  void processDeleteEvent(const EventUpdate& n);
287 
288  //=========================================================================================================
292  void printLocalBuffer();
293 
294  //=========================================================================================================
299  void copyNewUpdateToSharedMemory(EventUpdate& newUpdate);
300 
301  //=========================================================================================================
305  void initializeSharedMemory();
306 
307  //=========================================================================================================
311  void copySharedMemoryToLocalBuffer();
312 
313  //=========================================================================================================
317  void processLocalBuffer();
318 
319  //=========================================================================================================
323  void bufferWatcher();
324 
325  //=========================================================================================================
329  void createGroupIfNeeded();
330 
331  static int m_iLastUpdateIndex;
332  EVENTSLIB::EventManager* m_pEventManager;
333  QSharedMemory m_SharedMemory;
334  std::atomic_bool m_IsInit;
335  std::string m_sGroupName;
336  bool m_bGroupCreated;
337  idNum m_GroupId;
338  int m_SharedMemorySize;
339  int m_fTimerCheckBuffer;
340  std::thread m_BufferWatcherThread;
341  std::atomic_bool m_BufferWatcherThreadRunning;
342  std::atomic_bool m_WritingToSharedMemory;
343  long long m_lastCheckTime;
344  EventUpdate* m_LocalBuffer;
345  EventUpdate* m_SharedBuffer;
346  int m_Id;
347  enum EVENTSLIB::SharedMemoryMode m_Mode;
348 };
349 
350 //=========================================================================================================
355 inline int EventSharedMemManager::generateId()
356 {
357  auto t = static_cast<int>(EventSharedMemManager::getTimeNow());
358  return abs(t);
359 }
360 
361 } //namespace EVENTSINTERNAL
362 }//namespace EVENTSLIB
363 #endif // EVENTSHAREDMEMMANAGER_EVENTS_H
364 
EventGroup declaration.
Event declaration.
const std::string EventUpdateTypeString[3]