1
1
#include " event_builder2.hpp"
2
+
2
3
#include < deque>
4
+ #include < mesytec-mvlc/util/ticketmutex.h>
3
5
#include < spdlog/spdlog.h>
4
6
5
7
namespace mesytec ::mvlc::event_builder2
@@ -150,9 +152,15 @@ inline bool record_module_data(const ModuleData *moduleDataList, unsigned module
150
152
++counters.emptyInputs [mi];
151
153
152
154
if (ts.has_value ())
155
+ {
153
156
*ts = add_offset_to_timestamp (*ts, mcfg.offset );
154
- else
157
+ }
158
+ else if (!mcfg.ignored && mdata.data .size > 0 )
159
+ {
155
160
++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
+ }
156
164
157
165
dest[mi].emplace_back (ModuleStorage (mdata, ts));
158
166
@@ -169,17 +177,23 @@ std::string dump_counters(const EventCounters &counters)
169
177
{
170
178
std::ostringstream oss;
171
179
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 , " , " ));
177
191
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 , " , " ));
180
194
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 , " , " ));
183
197
184
198
return oss.str ();
185
199
}
@@ -195,6 +209,7 @@ struct EventBuilder2::Private
195
209
std::vector<ModuleStorage> outputModuleStorage_;
196
210
197
211
BuilderCounters counters_;
212
+ mvlc::TicketMutex countersMutex_;
198
213
199
214
bool checkConsistency (int eventIndex, const ModuleData *moduleDataList, unsigned moduleCount)
200
215
{
@@ -368,8 +383,10 @@ struct EventBuilder2::Private
368
383
369
384
if (matchResult.match == WindowMatch::too_old)
370
385
{
371
- moduleDatas.pop_front ();
372
386
++eventCtrs.discardsAge [mi];
387
+ --eventCtrs.currentEvents [mi];
388
+ eventCtrs.currentMem [mi] -= moduleDatas.front ().data .size () * sizeof (u32);
389
+ moduleDatas.pop_front ();
373
390
}
374
391
else
375
392
{
@@ -439,6 +456,7 @@ struct EventBuilder2::Private
439
456
size_t result = 0 ;
440
457
const auto moduleCount = ed.moduleDatas .size ();
441
458
outputModuleData_.resize (moduleCount);
459
+ auto &eventCtrs = counters_.eventCounters [eventIndex];
442
460
443
461
do
444
462
{
@@ -452,9 +470,12 @@ struct EventBuilder2::Private
452
470
continue ;
453
471
}
454
472
// Move data to the output buffer. Needed for the linear ModuleData array.
455
- outputModuleStorage_[mi] = mds.front ();
473
+ outputModuleStorage_[mi] = std::move ( mds.front () );
456
474
mds.pop_front ();
457
475
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);
458
479
haveData = true ;
459
480
}
460
481
if (haveData)
@@ -521,6 +542,7 @@ void EventBuilder2::setCallbacks(const Callbacks &callbacks) { d->callbacks_ = c
521
542
bool EventBuilder2::recordModuleData (int eventIndex, const ModuleData *moduleDataList,
522
543
unsigned moduleCount)
523
544
{
545
+ std::unique_lock<mvlc::TicketMutex> guard (d->countersMutex_ );
524
546
if (0 > eventIndex || static_cast <size_t >(eventIndex) >= d->perEventData_ .size ())
525
547
{
526
548
// TODO: count EventIndexOutOfRange
@@ -533,11 +555,13 @@ bool EventBuilder2::recordModuleData(int eventIndex, const ModuleData *moduleDat
533
555
534
556
void EventBuilder2::handleSystemEvent (const u32 *header, u32 size)
535
557
{
558
+ std::unique_lock<mvlc::TicketMutex> guard (d->countersMutex_ );
536
559
d->callbacks_ .systemEvent (d->userContext_ , d->cfg_ .outputCrateIndex , header, size);
537
560
}
538
561
539
562
size_t EventBuilder2::flush (bool force)
540
563
{
564
+ std::unique_lock<mvlc::TicketMutex> guard (d->countersMutex_ );
541
565
size_t flushed = 0 ;
542
566
543
567
if (force)
@@ -567,6 +591,7 @@ size_t EventBuilder2::flush(bool force)
567
591
568
592
std::string EventBuilder2::debugDump () const
569
593
{
594
+ std::unique_lock<mvlc::TicketMutex> guard (d->countersMutex_ );
570
595
std::string result;
571
596
572
597
for (size_t ei = 0 ; ei < d->perEventData_ .size (); ++ei)
@@ -616,6 +641,10 @@ bool EventBuilder2::isEnabledForAnyEvent() const
616
641
return false ;
617
642
}
618
643
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
+ }
620
649
621
650
} // namespace mesytec::mvlc::event_builder2
0 commit comments