File indexing completed on 2024-05-31 04:19:42
0001 #include "FWCore/Utilities/interface/Exception.h"
0002 #include "IOPool/Streamer/interface/EventMsgBuilder.h"
0003 #include "IOPool/Streamer/interface/EventMessage.h"
0004 #include "IOPool/Streamer/interface/MsgHeader.h"
0005 #include <cassert>
0006 #include <cstring>
0007
0008 static constexpr int MAX_HOSTNAME_LEN = 25;
0009
0010 using namespace edm::streamer;
0011
0012 EventMsgBuilder::EventMsgBuilder(void* buf,
0013 uint32 size,
0014 uint32 run,
0015 uint64 event,
0016 uint32 lumi,
0017 uint32 outModId,
0018 uint32 droppedEventsCount,
0019 std::vector<bool>& l1_bits,
0020 uint8* hlt_bits,
0021 uint32 hlt_bit_count,
0022 uint32 adler_chksum,
0023 const char* host_name)
0024 : buf_((uint8*)buf), size_(size) {
0025 uint32 expectedHeaderSize = computeHeaderSize(l1_bits.size(), hlt_bit_count);
0026 if (expectedHeaderSize > size_) {
0027 throw cms::Exception("EventMsgBuilder")
0028 << "The buffer used to build the event message (" << size_
0029 << " bytes) is not large enough to holde the event header (" << expectedHeaderSize << " bytes)";
0030 }
0031
0032
0033 uint8* pos = buf_;
0034
0035
0036 EventHeader* h = (EventHeader*)pos;
0037 h->protocolVersion_ = 11;
0038 convert(run, h->run_);
0039 convert(event, h->event_);
0040 convert(lumi, h->lumi_);
0041 convert(outModId, h->outModId_);
0042 convert(droppedEventsCount, h->droppedEventsCount_);
0043 pos += sizeof(EventHeader);
0044
0045
0046 uint32 l1_count = l1_bits.size();
0047 convert(l1_count, pos);
0048 pos += sizeof(uint32);
0049
0050
0051 uint32 l1_sz = (l1_bits.size() + 8 - 1) / 8;
0052 memset(pos, 0x00, l1_sz);
0053 for (std::vector<bool>::size_type i = 0; i < l1_bits.size(); ++i) {
0054 uint8 v = l1_bits[i] ? 1 : 0;
0055 pos[i / 8] |= (v << (i & 0x07));
0056 }
0057 pos += l1_sz;
0058
0059
0060 convert(hlt_bit_count, pos);
0061 pos += sizeof(uint32);
0062
0063
0064 uint32 hlt_sz = (hlt_bit_count + 4 - 1) / 4;
0065 pos = std::copy(hlt_bits, hlt_bits + hlt_sz, pos);
0066
0067
0068 convert(adler_chksum, pos);
0069 pos += sizeof(uint32);
0070
0071
0072
0073
0074
0075
0076
0077 assert(MAX_HOSTNAME_LEN < 0x00ff);
0078 *pos++ = MAX_HOSTNAME_LEN;
0079
0080
0081
0082 memset(pos, '\0', MAX_HOSTNAME_LEN);
0083 strncpy((char*)pos, host_name, MAX_HOSTNAME_LEN - 1);
0084 pos += MAX_HOSTNAME_LEN;
0085
0086 event_addr_ = pos + sizeof(char_uint32);
0087 setEventLength(0);
0088
0089
0090 if (headerSize() != expectedHeaderSize) {
0091 throw cms::Exception("EventMsgBuilder")
0092 << "The event message header size (" << headerSize() << " bytes) does not match the computed value ("
0093 << expectedHeaderSize << " bytes)";
0094 }
0095 }
0096
0097 void EventMsgBuilder::setOrigDataSize(uint32 value) {
0098 EventHeader* h = (EventHeader*)buf_;
0099 convert(value, h->origDataSize_);
0100 }
0101
0102 void EventMsgBuilder::setEventLength(uint32 len) {
0103 convert(len, event_addr_ - sizeof(char_uint32));
0104 EventHeader* h = (EventHeader*)buf_;
0105 new (&h->header_) Header(Header::EVENT, event_addr_ - buf_ + len);
0106 }
0107
0108 uint32 EventMsgBuilder::size() const {
0109 HeaderView v(buf_);
0110 return v.size();
0111 }
0112
0113 uint32 EventMsgBuilder::computeHeaderSize(uint32 l1t_bit_count, uint32 hlt_bit_count) {
0114 uint32 size = sizeof(EventHeader);
0115 size += sizeof(uint32);
0116 size += (l1t_bit_count + 8 - 1) / 8;
0117 size += sizeof(uint32);
0118 size += (hlt_bit_count + 4 - 1) / 4;
0119 size += sizeof(uint32);
0120 size += 1;
0121 size += MAX_HOSTNAME_LEN;
0122 size += sizeof(char_uint32);
0123 return size;
0124 }