1 #include "artdaq-core/Core/SharedMemoryFragmentManager.hh"
14 if (!IsValid()) {
return -1; }
16 TLOG_ARB(13,
"SharedMemoryFragmentManager") <<
"Sending fragment with seqID=" << fragment.sequenceID() << TLOG_ENDL;
20 auto buf = GetBufferForWriting(overwrite);
21 auto sts = Write(buf, fragAddr, fragSize);
24 TLOG_ARB(13,
"SharedMemoryFragmentManager") <<
"Done sending Fragment with seqID=" << fragment.sequenceID() << TLOG_ENDL;
28 TLOG_ERROR(
"SharedMemoryFragmentManager") <<
"Unexpected status from SharedMemory Write call!" << TLOG_ENDL;
34 TLOG_ARB(13,
"SharedMemoryFragmentManager") <<
"ReadFragment BEGIN" << TLOG_ENDL;
37 TLOG_ARB(13,
"SharedMemoryFragmentManager") <<
"Reading Fragment Header" << TLOG_ENDL;
38 auto sts = ReadFragmentHeader(tmpHdr);
39 if (sts != 0)
return sts;
42 TLOG_ARB(13,
"SharedMemoryFragmentManager") <<
"Reading Fragment Body" << TLOG_ENDL;
48 if (!IsValid())
return -3;
51 active_buffer_ = GetBufferForReading();
53 if (active_buffer_ == -1)
return -1;
55 auto sts = Read(active_buffer_, &header, hdrSize);
63 if (!IsValid() || active_buffer_ == -1 || !CheckBuffer(active_buffer_, BufferSemaphoreFlags::Reading)) {
64 TLOG_ERROR(
"SharedMemoryFragmentManager") <<
"ReadFragmentData: Buffer " << active_buffer_ <<
" failed status checks: IsValid()=" << std::boolalpha << IsValid() <<
", CheckBuffer=" << CheckBuffer(active_buffer_, BufferSemaphoreFlags::Reading) << TLOG_ENDL;
68 auto sts = Read(active_buffer_, destination, words *
sizeof(
RawDataType));
70 TLOG_ERROR(
"SharedMemoryFragmentManager") <<
"ReadFragmentData: Buffer " << active_buffer_ <<
" returned bad status code from Read" << TLOG_ENDL;
74 MarkBufferEmpty(active_buffer_);
int WriteFragment(Fragment &&fragment, bool overwrite)
Write a Fragment to the Shared Memory.
void resize(std::size_t sz)
Resize the data payload to hold sz RawDataType words.
SharedMemoryFragmentManager(uint32_t shm_key, size_t buffer_count, size_t max_buffer_size, 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...
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.
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.