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/plugin-load.hpp"
14 #include "cpp-common/bt2/plugin.hpp"
15 #include "cpp-common/bt2/query-executor.hpp"
16 #include "cpp-common/bt2c/call.hpp"
22 struct RunInData final
24 RunInCompClsQueryFunc compClsCtxFunc
;
25 RunInCompClsInitFunc compCtxFunc
;
26 RunInMsgIterClsInitFunc msgIterCtxFunc
;
31 class RunInSourceMsgIter final
: public bt2::UserMessageIterator
<RunInSourceMsgIter
, RunInSource
>
34 explicit RunInSourceMsgIter(const bt2::SelfMessageIterator self
,
35 bt2::SelfMessageIteratorConfiguration
,
36 const bt2::SelfComponentOutputPort port
) :
37 bt2::UserMessageIterator
<RunInSourceMsgIter
, RunInSource
> {self
, "RUN-IN-SRC-MSG-ITER"}
39 const auto& data
= port
.data
<const RunInData
>();
41 if (data
.msgIterCtxFunc
) {
42 data
.msgIterCtxFunc(self
);
46 void _next(bt2::ConstMessageArray
&)
51 class RunInSource final
:
52 public bt2::UserSourceComponent
<RunInSource
, RunInSourceMsgIter
, const RunInData
,
56 static constexpr auto name
= "run-in-src";
58 explicit RunInSource(const bt2::SelfSourceComponent self
, bt2::ConstMapValue
,
59 const RunInData
* const runInData
) :
60 bt2::UserSourceComponent
<RunInSource
, RunInSourceMsgIter
, const RunInData
,
61 const RunInData
> {self
, "RUN-IN-SRC"},
62 _mRunInData
{runInData
}
64 this->_addOutputPort("out", *runInData
);
66 if (_mRunInData
->compCtxFunc
) {
67 _mRunInData
->compCtxFunc(self
);
71 static bt2::Value::Shared
_query(const bt2::SelfComponentClass self
, bt2::PrivateQueryExecutor
,
72 bt2c::CStringView
, bt2::ConstValue
,
73 const RunInData
* const data
)
75 if (data
->compClsCtxFunc
) {
76 data
->compClsCtxFunc(self
);
79 return bt2::NullValue
{}.shared();
83 const RunInData
*_mRunInData
;
88 void runIn(RunInCompClsQueryFunc compClsCtxFunc
, RunInCompClsInitFunc compCtxFunc
,
89 RunInMsgIterClsInitFunc msgIterCtxFunc
)
91 RunInData data
{std::move(compClsCtxFunc
), std::move(compCtxFunc
), std::move(msgIterCtxFunc
)};
92 const auto srcCompCls
= bt2::SourceComponentClass::create
<RunInSource
>();
94 /* Execute a query (executes `compClsCtxFunc`) */
95 bt2::QueryExecutor::create(*srcCompCls
, "object-name", data
)->query();
98 const auto graph
= bt2::Graph::create(0);
100 /* Add custom source component (executes `compCtxFunc`) */
101 const auto srcComp
= graph
->addComponent(*srcCompCls
, "the-source", data
);
103 /* Add dummy sink component */
104 const auto sinkComp
= bt2c::call([&] {
105 const auto utilsPlugin
= bt2::findPlugin("utils");
107 BT_ASSERT(utilsPlugin
);
109 const auto dummySinkCompCls
= utilsPlugin
->sinkComponentClasses()["dummy"];
111 BT_ASSERT(dummySinkCompCls
);
113 return graph
->addComponent(*dummySinkCompCls
, "the-sink");
117 const auto outPort
= srcComp
.outputPorts()["out"];
120 const auto inPort
= sinkComp
.inputPorts()["in"];
123 graph
->connectPorts(*outPort
, *inPort
);
125 /* Run graph (executes `msgIterCtxFunc`) */
129 void runInCompClsQuery(RunInCompClsQueryFunc func
)
131 runIn(std::move(func
), nullptr, nullptr);
134 void runInCompClsInit(RunInCompClsInitFunc func
)
136 runIn(nullptr, std::move(func
), nullptr);
139 void runInMsgIterClsInit(RunInMsgIterClsInitFunc func
)
141 runIn(nullptr, nullptr, std::move(func
));