2 * SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (C) 2020-2023 EfficiOS, inc.
9 #include "common/assert.h"
10 #include "cpp-common/bt2/component-class-dev.hpp"
11 #include "cpp-common/bt2/component-class.hpp"
12 #include "cpp-common/bt2/graph.hpp"
13 #include "cpp-common/bt2/query-executor.hpp"
19 struct RunInData final
21 RunInCompClsQueryFunc compClsCtxFunc
;
22 RunInCompClsInitFunc compCtxFunc
;
23 RunInMsgIterClsInitFunc msgIterCtxFunc
;
28 class RunInSourceMsgIter final
: public bt2::UserMessageIterator
<RunInSourceMsgIter
, RunInSource
>
31 explicit RunInSourceMsgIter(const bt2::SelfMessageIterator self
,
32 bt2::SelfMessageIteratorConfiguration
,
33 const bt2::SelfComponentOutputPort port
) :
34 bt2::UserMessageIterator
<RunInSourceMsgIter
, RunInSource
> {self
, "RUN-IN-SRC-MSG-ITER"}
36 const auto& data
= port
.data
<const RunInData
>();
38 if (data
.msgIterCtxFunc
) {
39 data
.msgIterCtxFunc(self
);
43 void _next(bt2::ConstMessageArray
&)
48 class RunInSource final
:
49 public bt2::UserSourceComponent
<RunInSource
, RunInSourceMsgIter
, const RunInData
,
53 static constexpr auto name
= "run-in-src";
55 explicit RunInSource(const bt2::SelfSourceComponent self
, bt2::ConstMapValue
,
56 const RunInData
* const runInData
) :
57 bt2::UserSourceComponent
<RunInSource
, RunInSourceMsgIter
, const RunInData
,
58 const RunInData
> {self
, "RUN-IN-SRC"},
59 _mRunInData
{runInData
}
61 this->_addOutputPort("out", *runInData
);
63 if (_mRunInData
->compCtxFunc
) {
64 _mRunInData
->compCtxFunc(self
);
68 static bt2::Value::Shared
_query(const bt2::SelfComponentClass self
, bt2::PrivateQueryExecutor
,
69 bt2c::CStringView
, bt2::ConstValue
,
70 const RunInData
* const data
)
72 if (data
->compClsCtxFunc
) {
73 data
->compClsCtxFunc(self
);
76 return bt2::NullValue
{}.shared();
80 const RunInData
*_mRunInData
;
83 class DummySink
: public bt2::UserSinkComponent
<DummySink
>
86 static constexpr auto name
= "dummy";
88 explicit DummySink(const bt2::SelfSinkComponent self
, bt2::ConstMapValue
, void *) :
89 bt2::UserSinkComponent
<DummySink
>(self
, "DUMMY-SINK")
91 this->_addInputPort("in");
94 void _graphIsConfigured()
96 _mMsgIter
= this->_createMessageIterator(this->_inputPorts()["in"]);
101 return _mMsgIter
->next().has_value();
105 bt2::MessageIterator::Shared _mMsgIter
;
110 void runIn(RunInCompClsQueryFunc compClsCtxFunc
, RunInCompClsInitFunc compCtxFunc
,
111 RunInMsgIterClsInitFunc msgIterCtxFunc
)
113 RunInData data
{std::move(compClsCtxFunc
), std::move(compCtxFunc
), std::move(msgIterCtxFunc
)};
114 const auto srcCompCls
= bt2::SourceComponentClass::create
<RunInSource
>();
116 /* Execute a query (executes `compClsCtxFunc`) */
117 bt2::QueryExecutor::create(*srcCompCls
, "object-name", data
)->query();
120 const auto graph
= bt2::Graph::create(0);
122 /* Add custom source component (executes `compCtxFunc`) */
123 const auto srcComp
= graph
->addComponent(*srcCompCls
, "the-source", data
);
125 /* Add dummy sink component */
126 const auto sinkComp
=
127 graph
->addComponent(*bt2::SinkComponentClass::create
<DummySink
>(), "the-sink");
130 const auto outPort
= srcComp
.outputPorts()["out"];
133 const auto inPort
= sinkComp
.inputPorts()["in"];
136 graph
->connectPorts(*outPort
, *inPort
);
138 /* Run graph (executes `msgIterCtxFunc`) */
142 void runInCompClsQuery(RunInCompClsQueryFunc func
)
144 runIn(std::move(func
), nullptr, nullptr);
147 void runInCompClsInit(RunInCompClsInitFunc func
)
149 runIn(nullptr, std::move(func
), nullptr);
152 void runInMsgIterClsInit(RunInMsgIterClsInitFunc func
)
154 runIn(nullptr, nullptr, std::move(func
));