Skip to content

Commit ad4cc98

Browse files
authored
Add compatibility with std::pmr (#14379)
The move assign operator is deleted is std::pmr::polymorphic_allocator so we cannot iterate anymore at runtime on the headers in the stack and move them.
1 parent b9b561d commit ad4cc98

File tree

2 files changed

+38
-17
lines changed

2 files changed

+38
-17
lines changed

Utilities/DataSampling/include/DataSampling/Dispatcher.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ class Dispatcher : public framework::Task
6565

6666
private:
6767
DataSamplingHeader prepareDataSamplingHeader(const DataSamplingPolicy& policy, header::DataHeader const& original);
68-
header::Stack extractAdditionalHeaders(const char* inputHeaderStack) const;
6968
void reportStats(monitoring::Monitoring& monitoring) const;
7069
void send(framework::DataAllocator& dataAllocator, const framework::DataRef& inputData, const framework::Output& output) const;
7170

Utilities/DataSampling/src/Dispatcher.cxx

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929

3030
#include <Configuration/ConfigurationInterface.h>
3131
#include <Configuration/ConfigurationFactory.h>
32+
#include <stdexcept>
3233

3334
using namespace o2::configuration;
3435
using namespace o2::monitoring;
@@ -77,6 +78,42 @@ void Dispatcher::init(InitContext& ctx)
7778
mDeviceID.runtimeInit(spec.id.substr(0, DataSamplingHeader::deviceIDTypeSize).c_str());
7879
}
7980

81+
header::Stack extractAdditionalHeaders(const char* inputHeaderStack)
82+
{
83+
std::array<header::BaseHeader const*, 5> headers;
84+
int count = 0;
85+
const auto* first = header::BaseHeader::get(reinterpret_cast<const std::byte*>(inputHeaderStack));
86+
for (const auto* current = first; current != nullptr; current = current->next()) {
87+
if (current->description != header::DataHeader::sHeaderType && current->description != DataProcessingHeader::sHeaderType) {
88+
headers[count++] = current;
89+
}
90+
}
91+
92+
// Poor man runtime pack expansion.
93+
switch (count) {
94+
case 0:
95+
return header::Stack{};
96+
case 1:
97+
return header::Stack{*headers[0]};
98+
case 2:
99+
return header::Stack{*headers[0], *headers[1]};
100+
case 3:
101+
return header::Stack{*headers[0], *headers[1], *headers[2]};
102+
case 4:
103+
return header::Stack{*headers[0], *headers[1], *headers[2], *headers[3]};
104+
case 5:
105+
return header::Stack{*headers[0], *headers[1], *headers[2], *headers[3], *headers[4]};
106+
case 6:
107+
return header::Stack{*headers[0], *headers[1], *headers[2], *headers[3], *headers[4], *headers[5]};
108+
case 7:
109+
return header::Stack{*headers[0], *headers[1], *headers[2], *headers[3], *headers[4], *headers[5], *headers[6]};
110+
case 8:
111+
return header::Stack{*headers[0], *headers[1], *headers[2], *headers[3], *headers[4], *headers[5], *headers[6], *headers[7]};
112+
default:
113+
throw std::runtime_error(fmt::format("Too many headers to copy {}", count));
114+
}
115+
}
116+
80117
void Dispatcher::run(ProcessingContext& ctx)
81118
{
82119
// todo: consider matching (and deciding) in completion policy to save some time
@@ -106,7 +143,7 @@ void Dispatcher::run(ProcessingContext& ctx)
106143
// so that custom data-dependent headers are passed forward,
107144
// and we add a DataSamplingHeader.
108145
header::Stack headerStack{
109-
std::move(extractAdditionalHeaders(part.header)),
146+
extractAdditionalHeaders(part.header),
110147
dsheader};
111148
const auto* partInputHeader = DataRefUtils::getHeader<header::DataHeader*>(part);
112149

@@ -156,21 +193,6 @@ DataSamplingHeader Dispatcher::prepareDataSamplingHeader(const DataSamplingPolic
156193
original};
157194
}
158195

159-
header::Stack Dispatcher::extractAdditionalHeaders(const char* inputHeaderStack) const
160-
{
161-
header::Stack headerStack;
162-
163-
const auto* first = header::BaseHeader::get(reinterpret_cast<const std::byte*>(inputHeaderStack));
164-
for (const auto* current = first; current != nullptr; current = current->next()) {
165-
if (current->description != header::DataHeader::sHeaderType &&
166-
current->description != DataProcessingHeader::sHeaderType) {
167-
headerStack = std::move(header::Stack{std::move(headerStack), *current});
168-
}
169-
}
170-
171-
return headerStack;
172-
}
173-
174196
void Dispatcher::send(DataAllocator& dataAllocator, const DataRef& inputData, const Output& output) const
175197
{
176198
const auto* inputHeader = DataRefUtils::getHeader<header::DataHeader*>(inputData);

0 commit comments

Comments
 (0)