Belle II Software  release-05-02-19
RingBuffer.h
Go to the documentation of this file.
1 
6 #pragma once
7 
8 #include <sys/ipc.h>
9 #include <string>
10 
11 namespace Belle2 {
18  struct RingBufInfo {
19  int size;
20  int remain;
21  int wptr;
22  int prevwptr;
23  int rptr;
24  int nbuf;
25  int semid;
26  int nattached;
27  int nbusy;
28  int __readbuf;
29  int errtype;
31  int ninsq;
32  int nremq;
33  };
34 
36  class RingBuffer {
37  public:
39  const static int c_DefaultSize = 15000000;
40 
45  explicit RingBuffer(int nwords = c_DefaultSize);
47  explicit RingBuffer(const std::string& name, unsigned int nwords = 0); // Create / Attach Ring buffer
49  ~RingBuffer();
51  void openSHM(int nwords);
53  void cleanup();
54 
56  int insq(const int* buf, int size, bool checkTx = false);
58  int remq(int* buf);
60  int spyq(int* buf) const;
62  int numq() const;
63 
65  void txAttached();
67  void txDetached();
69  void kill();
70 
72  bool isDead() const;
77  bool allRxWaiting() const;
78 
80  int clear();
82  void forceClear();
83 
85  int tryClear();
86 
88  int shmid() const;
89 
90  // Debugging functions
92  void dump_db();
94  int ninsq() const;
96  int nremq() const;
97 
99  int insq_counter() const;
101  int remq_counter() const;
102 
104  void dumpInfo() const;
105 
106  private:
107  bool m_new{true};
108  bool m_file{false};
109  std::string m_pathname{""};
110  int m_pathfd{ -1};
111  key_t m_shmkey{IPC_PRIVATE};
112  key_t m_semkey{IPC_PRIVATE};
114  std::string m_semshmFileName{""};
115 
121  bool m_procIsBusy{false};
122 
123  int m_shmid{ -1};
124  int* m_shmadr{nullptr};
125  int m_shmsize{ -1};
126  struct RingBufInfo* m_bufinfo {nullptr};
127  int* m_buftop{nullptr};
128  int m_semid{ -1};
129  int m_remq_counter{0};
130  int m_insq_counter{0};
131  };
132 
134 }
Belle2::RingBuffer::isDead
bool isDead() const
If True, the ring buffer is empty and has no attached Tx modules (i.e.
Definition: RingBuffer.cc:397
Belle2::RingBuffer::m_shmsize
int m_shmsize
Size of shared memory segment, in bytes.
Definition: RingBuffer.h:125
Belle2::RingBuffer::m_semid
int m_semid
Semaphore ID.
Definition: RingBuffer.h:128
Belle2::RingBuffer::clear
int clear()
Clear the RingBuffer.
Definition: RingBuffer.cc:429
Belle2::RingBufInfo::prevwptr
int prevwptr
Previous state of wptr (for error recovery).
Definition: RingBuffer.h:22
Belle2::RingBufInfo::size
int size
ring buffer size (integers), minus this header.
Definition: RingBuffer.h:19
Belle2::RingBuffer::m_insq_counter
int m_insq_counter
count insq() calls.
Definition: RingBuffer.h:130
Belle2::RingBuffer::txAttached
void txAttached()
Increase the number of attached Tx counter.
Definition: RingBuffer.cc:376
Belle2::RingBufInfo::nremq
int nremq
Count remq() calls for this buffer.
Definition: RingBuffer.h:32
Belle2::RingBufInfo::errtype
int errtype
Error state? 0: Normal, 1: buffer full and wptr>rptr, others are complicated.
Definition: RingBuffer.h:29
Belle2::RingBufInfo::semid
int semid
Semaphore ID.
Definition: RingBuffer.h:25
Belle2::RingBufInfo::numAttachedTx
int numAttachedTx
number of attached sending processes.
Definition: RingBuffer.h:30
Belle2::RingBufInfo::nattached
int nattached
Number of RingBuffer instances currently attached to this buffer.
Definition: RingBuffer.h:26
Belle2::RingBuffer::m_new
bool m_new
True if we created the ring buffer ourselves (and need to clean it).
Definition: RingBuffer.h:107
Belle2::RingBuffer::RingBuffer
RingBuffer(int nwords=c_DefaultSize)
Constructor to create a new shared memory in private space.
Definition: RingBuffer.cc:36
Belle2::RingBuffer::cleanup
void cleanup()
Function to detach and remove shared memory.
Definition: RingBuffer.cc:165
Belle2::RingBuffer::m_pathfd
int m_pathfd
Associated file descriptor.
Definition: RingBuffer.h:110
Belle2::RingBuffer::tryClear
int tryClear()
Clear the RingBuffer, if the semaphore isn't locked at the moment.
Definition: RingBuffer.cc:453
Belle2::RingBuffer::m_semkey
key_t m_semkey
Semaphore key, see semget(2).
Definition: RingBuffer.h:112
Belle2::RingBuffer::allRxWaiting
bool allRxWaiting() const
True if and only if buffer is empty and nbusy == 0.
Definition: RingBuffer.cc:403
Belle2::RingBuffer::openSHM
void openSHM(int nwords)
open shared memory
Definition: RingBuffer.cc:88
Belle2::RingBuffer::insq_counter
int insq_counter() const
Return number of insq() calls.
Definition: RingBuffer.cc:419
Belle2::RingBuffer::numq
int numq() const
Returns number of entries/buffers in the RingBuffer.
Definition: RingBuffer.cc:371
Belle2::RingBuffer::nremq
int nremq() const
Return number of remq() calls for current buffer.
Definition: RingBuffer.cc:414
Belle2::RingBufInfo::nbuf
int nbuf
Number of entries in ring buffer.
Definition: RingBuffer.h:24
Belle2::RingBuffer::m_shmkey
key_t m_shmkey
SHM key, see shmget(2).
Definition: RingBuffer.h:111
Belle2::RingBuffer::m_remq_counter
int m_remq_counter
count remq() calls.
Definition: RingBuffer.h:129
Belle2::RingBuffer
Class to manage a Ring Buffer placed in an IPC shared memory.
Definition: RingBuffer.h:36
Belle2::RingBuffer::m_bufinfo
struct RingBufInfo * m_bufinfo
structure to manage ring buffer.
Definition: RingBuffer.h:126
Belle2::RingBufInfo
Internal metadata structure for RingBuffer.
Definition: RingBuffer.h:18
Belle2::RingBuffer::m_shmadr
int * m_shmadr
Address of attached shared memory segment.
Definition: RingBuffer.h:124
Belle2::RingBuffer::ninsq
int ninsq() const
Return number of insq() calls for current buffer.
Definition: RingBuffer.cc:409
Belle2::RingBuffer::m_pathname
std::string m_pathname
Path for identifying shared memory if named ring buffer is created.
Definition: RingBuffer.h:109
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::RingBuffer::txDetached
void txDetached()
Decrease the number of attached Tx counter.
Definition: RingBuffer.cc:384
Belle2::RingBuffer::m_buftop
int * m_buftop
Points to memory after the end of m_bufinfo.
Definition: RingBuffer.h:127
Belle2::RingBuffer::kill
void kill()
Cause termination of reading processes (if they use isDead()).
Definition: RingBuffer.cc:392
Belle2::RingBufInfo::remain
int remain
Unsure, always equal to size.
Definition: RingBuffer.h:20
Belle2::RingBufInfo::wptr
int wptr
Pointer for writing entries.
Definition: RingBuffer.h:21
Belle2::RingBuffer::c_DefaultSize
const static int c_DefaultSize
Standard size of buffer, in integers (~60MB).
Definition: RingBuffer.h:39
Belle2::RingBufInfo::__readbuf
int __readbuf
Unused.
Definition: RingBuffer.h:28
Belle2::RingBufInfo::ninsq
int ninsq
Count insq() calls for this buffer.
Definition: RingBuffer.h:31
Belle2::RingBuffer::m_semshmFileName
std::string m_semshmFileName
file path containing ids of shm and sema for private shared mem, used for easier cleanup if we fail t...
Definition: RingBuffer.h:114
Belle2::RingBuffer::forceClear
void forceClear()
Forcefully clear the RingBuffer with resetting semaphore.
Definition: RingBuffer.cc:444
Belle2::RingBuffer::m_shmid
int m_shmid
ID of shared memory segment.
Definition: RingBuffer.h:123
Belle2::RingBufInfo::rptr
int rptr
Pointer for reading entries.
Definition: RingBuffer.h:23
Belle2::RingBuffer::dumpInfo
void dumpInfo() const
Dump contents of RingBufInfo metadata.
Definition: RingBuffer.cc:466
Belle2::RingBuffer::~RingBuffer
~RingBuffer()
Destructor.
Definition: RingBuffer.cc:83
Belle2::RingBuffer::dump_db
void dump_db()
Print some info on the RingBufInfo structure.
Definition: RingBuffer.cc:185
Belle2::RingBuffer::spyq
int spyq(int *buf) const
Prefetch a buffer from the RingBuffer w/o removing it.
Definition: RingBuffer.cc:351
Belle2::RingBuffer::remq
int remq(int *buf)
Pick up a buffer from the RingBuffer.
Definition: RingBuffer.cc:311
Belle2::RingBuffer::m_file
bool m_file
True if m_pathfd needs to be closed.
Definition: RingBuffer.h:108
Belle2::RingBuffer::m_procIsBusy
bool m_procIsBusy
Is this process currently processing events from this RingBuffer?
Definition: RingBuffer.h:121
Belle2::RingBuffer::insq
int insq(const int *buf, int size, bool checkTx=false)
Append a buffer to the RingBuffer.
Definition: RingBuffer.cc:192
Belle2::RingBufInfo::nbusy
int nbusy
Number of attached reading processes currently processing events.
Definition: RingBuffer.h:27
Belle2::RingBuffer::shmid
int shmid() const
Return ID of the shared memory.
Definition: RingBuffer.cc:461
Belle2::RingBuffer::remq_counter
int remq_counter() const
Return number of remq() calls.
Definition: RingBuffer.cc:424