2 #define TRACE_NAME "SharedMemoryFragmentManager"
3 #include "artdaq-core/Core/SharedMemoryFragmentManager.hh"
14 TLOG(12) <<
"ReadyForWrite: active_buffer is " << active_buffer_;
15 if (active_buffer_ != -1)
19 active_buffer_ = GetBufferForWriting(overwrite);
21 return active_buffer_ != -1;
26 if (!IsValid() || IsEndOfData())
28 TLOG(TLVL_WARNING) <<
"WriteFragment: Shared memory is not connected! Attempting reconnect...";
29 auto sts = Attach(timeout_us);
34 TLOG(TLVL_INFO) <<
"WriteFragment: Shared memory was successfully reconnected";
37 auto waitStart = std::chrono::steady_clock::now();
42 if (!ReadyForWrite(overwrite))
44 int64_t loopCount = 0;
45 size_t sleepTime = 1000;
46 int64_t nloops = (timeout_us - 1000) / sleepTime;
48 while (!ReadyForWrite(overwrite) && (!overwrite || timeout_us == 0 || loopCount < nloops))
50 if (!IsValid() || IsEndOfData())
52 TLOG(TLVL_WARNING) <<
"WriteFragment: Shared memory is not connected! Attempting reconnect...";
53 auto sts = Attach(timeout_us);
58 TLOG(TLVL_INFO) <<
"WriteFragment: Shared memory was successfully reconnected";
64 if (!ReadyForWrite(overwrite))
70 TLOG(13) <<
"Sending fragment with seqID=" << fragment.sequenceID() <<
" using buffer " << active_buffer_;
74 auto sts = Write(active_buffer_, fragAddr, fragSize);
77 TLOG(13) <<
"Done sending Fragment with seqID=" << fragment.sequenceID() <<
" using buffer " << active_buffer_;
78 MarkBufferFull(active_buffer_);
83 TLOG(TLVL_ERROR) <<
"Unexpected status from SharedMemory Write call!";
91 TLOG(14) <<
"ReadFragment BEGIN";
94 TLOG(14) <<
"Reading Fragment Header";
95 auto sts = ReadFragmentHeader(tmpHdr);
102 TLOG(14) <<
"Reading Fragment Body - of frag w/ seqID=" << tmpHdr.
sequence_id;
110 TLOG(22) <<
"ReadFragmentHeader: !IsValid(), returning -3";
115 active_buffer_ = GetBufferForReading();
117 if (active_buffer_ == -1)
119 TLOG(22) <<
"ReadFragmentHeader: active_buffer==-1, returning -1";
123 auto sts = Read(active_buffer_, &header, hdrSize);
126 TLOG(TLVL_ERROR) <<
"ReadFragmentHeader: Buffer " << active_buffer_ <<
" returned bad status code from Read";
127 MarkBufferEmpty(active_buffer_);
132 TLOG(22) <<
"ReadFragmentHeader: read active_buffer_=" << active_buffer_ <<
" sequence_id=" << header.
sequence_id;
138 if (!IsValid() || active_buffer_ == -1 || !CheckBuffer(active_buffer_, BufferSemaphoreFlags::Reading))
140 TLOG(TLVL_ERROR) <<
"ReadFragmentData: Buffer " << active_buffer_ <<
" failed status checks: IsValid()=" << std::boolalpha << IsValid() <<
", CheckBuffer=" << CheckBuffer(active_buffer_, BufferSemaphoreFlags::Reading);
144 auto sts = Read(active_buffer_, destination, words *
sizeof(
RawDataType));
147 TLOG(TLVL_ERROR) <<
"ReadFragmentData: Buffer " << active_buffer_ <<
" returned bad status code from Read";
148 MarkBufferEmpty(active_buffer_);
153 MarkBufferEmpty(active_buffer_);
constexpr size_t GetElapsedTimeMicroseconds(std::chrono::steady_clock::time_point then, std::chrono::steady_clock::time_point now=std::chrono::steady_clock::now())
Gets the number of microseconds in the given time interval
void resize(std::size_t sz)
Resize the data payload to hold sz RawDataType words.
SharedMemoryFragmentManager(uint32_t shm_key, size_t buffer_count=0, size_t max_buffer_size=0, size_t buffer_timeout_us=100 *1000000)
SharedMemoryFragmentManager Constructor.
The SharedMemoryManager creates a Shared Memory area which is divided into a number of fixed-size buf...
int WriteFragment(Fragment &&fragment, bool overwrite, size_t timeout_us)
Write a Fragment to the Shared Memory.
detail::RawFragmentHeader::RawDataType RawDataType
The RawDataType (currently a 64-bit integer) is the basic unit of data representation within artdaq ...
int ReadFragmentHeader(detail::RawFragmentHeader &header)
Read a Fragment Header from the Shared Memory.
int ReadFragment(Fragment &fragment)
Read a Fragment from the Shared Memory.
bool ReadyForWrite(bool overwrite) override
Check if a buffer is ready for writing, and if so, reserves it for use.
A Fragment contains the data from one piece of the DAQ system for one event The artdaq::Fragment is t...
int ReadFragmentData(RawDataType *destination, size_t words)
Read Fragment Data from the Shared Memory.
RawDataType * headerAddress()
Gets the address of the header.