Skip to content

Commit 890e422

Browse files
committed
eb2: counter fixes and report sums of discards + output hits
Also mutex guard the counters.
1 parent 25973c3 commit 890e422

File tree

1 file changed

+42
-13
lines changed

1 file changed

+42
-13
lines changed

src/mesytec-mvlc/event_builder2.cc

+42-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#include "event_builder2.hpp"
2+
23
#include <deque>
4+
#include <mesytec-mvlc/util/ticketmutex.h>
35
#include <spdlog/spdlog.h>
46

57
namespace mesytec::mvlc::event_builder2
@@ -150,9 +152,15 @@ inline bool record_module_data(const ModuleData *moduleDataList, unsigned module
150152
++counters.emptyInputs[mi];
151153

152154
if (ts.has_value())
155+
{
153156
*ts = add_offset_to_timestamp(*ts, mcfg.offset);
154-
else
157+
}
158+
else if (!mcfg.ignored && mdata.data.size > 0)
159+
{
155160
++counters.stampFailed[mi];
161+
//spdlog::warn("record_module_data: failed timestamp extraction, module{}, data.size={}, data={:#010x}",
162+
// mi, mdata.data.size, fmt::join(mdata.data.data, mdata.data.data + mdata.data.size, ", "));
163+
}
156164

157165
dest[mi].emplace_back(ModuleStorage(mdata, ts));
158166

@@ -169,17 +177,23 @@ std::string dump_counters(const EventCounters &counters)
169177
{
170178
std::ostringstream oss;
171179

172-
oss << fmt::format("inputHits: {}\n", fmt::join(counters.inputHits, ", "));
173-
oss << fmt::format("outputHits: {}\n", fmt::join(counters.outputHits, ", "));
174-
oss << fmt::format("emptyInputs: {}\n", fmt::join(counters.emptyInputs, ", "));
175-
oss << fmt::format("discardsAge: {}\n", fmt::join(counters.discardsAge, ", "));
176-
oss << fmt::format("stampFailed: {}\n", fmt::join(counters.stampFailed, ", "));
180+
std::vector<size_t> sumOutputsDiscards(counters.outputHits.size());
181+
std::transform(std::begin(counters.outputHits), std::end(counters.outputHits),
182+
std::begin(counters.discardsAge), std::begin(sumOutputsDiscards),
183+
std::plus<size_t>());
184+
185+
oss << fmt::format("inputHits: {}\n", fmt::join(counters.inputHits, ", "));
186+
oss << fmt::format("discardsAge: {}\n", fmt::join(counters.discardsAge, ", "));
187+
oss << fmt::format("outputHits: {}\n", fmt::join(counters.outputHits, ", "));
188+
oss << fmt::format("sumOutputsDiscards: {}\n", fmt::join(sumOutputsDiscards, ", "));
189+
oss << fmt::format("emptyInputs: {}\n", fmt::join(counters.emptyInputs, ", "));
190+
oss << fmt::format("stampFailed: {}\n", fmt::join(counters.stampFailed, ", "));
177191

178-
oss << fmt::format("currentEvents: {}\n", fmt::join(counters.currentEvents, ", "));
179-
oss << fmt::format("maxEvents: {}\n", fmt::join(counters.maxEvents, ", "));
192+
oss << fmt::format("currentEvents: {}\n", fmt::join(counters.currentEvents, ", "));
193+
oss << fmt::format("maxEvents: {}\n", fmt::join(counters.maxEvents, ", "));
180194

181-
oss << fmt::format("currentMem: {}\n", fmt::join(counters.currentMem, ", "));
182-
oss << fmt::format("maxMem: {}\n", fmt::join(counters.maxMem, ", "));
195+
oss << fmt::format("currentMem: {}\n", fmt::join(counters.currentMem, ", "));
196+
oss << fmt::format("maxMem: {}\n", fmt::join(counters.maxMem, ", "));
183197

184198
return oss.str();
185199
}
@@ -195,6 +209,7 @@ struct EventBuilder2::Private
195209
std::vector<ModuleStorage> outputModuleStorage_;
196210

197211
BuilderCounters counters_;
212+
mvlc::TicketMutex countersMutex_;
198213

199214
bool checkConsistency(int eventIndex, const ModuleData *moduleDataList, unsigned moduleCount)
200215
{
@@ -368,8 +383,10 @@ struct EventBuilder2::Private
368383

369384
if (matchResult.match == WindowMatch::too_old)
370385
{
371-
moduleDatas.pop_front();
372386
++eventCtrs.discardsAge[mi];
387+
--eventCtrs.currentEvents[mi];
388+
eventCtrs.currentMem[mi] -= moduleDatas.front().data.size() * sizeof(u32);
389+
moduleDatas.pop_front();
373390
}
374391
else
375392
{
@@ -439,6 +456,7 @@ struct EventBuilder2::Private
439456
size_t result = 0;
440457
const auto moduleCount = ed.moduleDatas.size();
441458
outputModuleData_.resize(moduleCount);
459+
auto &eventCtrs = counters_.eventCounters[eventIndex];
442460

443461
do
444462
{
@@ -452,9 +470,12 @@ struct EventBuilder2::Private
452470
continue;
453471
}
454472
// Move data to the output buffer. Needed for the linear ModuleData array.
455-
outputModuleStorage_[mi] = mds.front();
473+
outputModuleStorage_[mi] = std::move(mds.front());
456474
mds.pop_front();
457475
outputModuleData_[mi] = outputModuleStorage_[mi].to_module_data();
476+
++eventCtrs.outputHits[mi];
477+
--eventCtrs.currentEvents[mi];
478+
eventCtrs.currentMem[mi] -= outputModuleStorage_[mi].data.size() * sizeof(u32);
458479
haveData = true;
459480
}
460481
if (haveData)
@@ -521,6 +542,7 @@ void EventBuilder2::setCallbacks(const Callbacks &callbacks) { d->callbacks_ = c
521542
bool EventBuilder2::recordModuleData(int eventIndex, const ModuleData *moduleDataList,
522543
unsigned moduleCount)
523544
{
545+
std::unique_lock<mvlc::TicketMutex> guard(d->countersMutex_);
524546
if (0 > eventIndex || static_cast<size_t>(eventIndex) >= d->perEventData_.size())
525547
{
526548
// TODO: count EventIndexOutOfRange
@@ -533,11 +555,13 @@ bool EventBuilder2::recordModuleData(int eventIndex, const ModuleData *moduleDat
533555

534556
void EventBuilder2::handleSystemEvent(const u32 *header, u32 size)
535557
{
558+
std::unique_lock<mvlc::TicketMutex> guard(d->countersMutex_);
536559
d->callbacks_.systemEvent(d->userContext_, d->cfg_.outputCrateIndex, header, size);
537560
}
538561

539562
size_t EventBuilder2::flush(bool force)
540563
{
564+
std::unique_lock<mvlc::TicketMutex> guard(d->countersMutex_);
541565
size_t flushed = 0;
542566

543567
if (force)
@@ -567,6 +591,7 @@ size_t EventBuilder2::flush(bool force)
567591

568592
std::string EventBuilder2::debugDump() const
569593
{
594+
std::unique_lock<mvlc::TicketMutex> guard(d->countersMutex_);
570595
std::string result;
571596

572597
for (size_t ei = 0; ei < d->perEventData_.size(); ++ei)
@@ -616,6 +641,10 @@ bool EventBuilder2::isEnabledForAnyEvent() const
616641
return false;
617642
}
618643

619-
BuilderCounters EventBuilder2::getCounters() const { return d->counters_; }
644+
BuilderCounters EventBuilder2::getCounters() const
645+
{
646+
std::unique_lock<mvlc::TicketMutex> guard(d->countersMutex_);
647+
return d->counters_;
648+
}
620649

621650
} // namespace mesytec::mvlc::event_builder2

0 commit comments

Comments
 (0)