2 * SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (C) 2020-2023 EfficiOS, inc.
7 #include "common/assert.h"
8 #include "cpp-common/bt2/component-class-dev.hpp"
9 #include "cpp-common/bt2/component-class.hpp"
10 #include "cpp-common/bt2/graph.hpp"
11 #include "cpp-common/bt2/plugin-load.hpp"
12 #include "cpp-common/bt2/plugin.hpp"
13 #include "cpp-common/bt2/query-executor.hpp"
14 #include "cpp-common/bt2c/call.hpp"
18 void RunIn::onQuery(bt2::SelfComponentClass
)
22 void RunIn::onCompInit(bt2::SelfComponent
)
26 void RunIn::onMsgIterInit(bt2::SelfMessageIterator
)
30 void RunIn::onMsgIterNext(bt2::SelfMessageIterator
, bt2::ConstMessageArray
&)
38 class RunInSourceMsgIter final
: public bt2::UserMessageIterator
<RunInSourceMsgIter
, RunInSource
>
41 explicit RunInSourceMsgIter(const bt2::SelfMessageIterator self
,
42 bt2::SelfMessageIteratorConfiguration
,
43 const bt2::SelfComponentOutputPort port
) :
44 bt2::UserMessageIterator
<RunInSourceMsgIter
, RunInSource
> {self
, "RUN-IN-SRC-MSG-ITER"},
45 _mRunIn
{&port
.data
<RunIn
>()}, _mSelf
{self
}
47 _mRunIn
->onMsgIterInit(self
);
50 void _next(bt2::ConstMessageArray
& msgs
)
52 _mRunIn
->onMsgIterNext(_mSelf
, msgs
);
57 bt2::SelfMessageIterator _mSelf
;
60 class RunInSource final
:
61 public bt2::UserSourceComponent
<RunInSource
, RunInSourceMsgIter
, RunIn
, RunIn
>
64 static constexpr auto name
= "run-in-src";
66 explicit RunInSource(const bt2::SelfSourceComponent self
, bt2::ConstMapValue
,
67 RunIn
* const runIn
) :
68 bt2::UserSourceComponent
<RunInSource
, RunInSourceMsgIter
, RunIn
, RunIn
> {self
,
72 this->_addOutputPort("out", *runIn
);
73 _mRunIn
->onCompInit(self
);
76 static bt2::Value::Shared
_query(const bt2::SelfComponentClass self
, bt2::PrivateQueryExecutor
,
77 bt2c::CStringView
, bt2::ConstValue
, RunIn
*data
)
80 return bt2::NullValue
{}.shared();
89 void runIn(RunIn
& runIn
)
91 const auto srcCompCls
= bt2::SourceComponentClass::create
<RunInSource
>();
94 bt2::QueryExecutor::create(*srcCompCls
, "object-name", runIn
)->query();
97 const auto graph
= bt2::Graph::create(0);
99 /* Add custom source component (executes `compCtxFunc`) */
100 const auto srcComp
= graph
->addComponent(*srcCompCls
, "the-source", runIn
);
102 /* Add dummy sink component */
103 const auto sinkComp
= bt2c::call([&] {
104 const auto utilsPlugin
= bt2::findPlugin("utils");
106 BT_ASSERT(utilsPlugin
);
108 const auto dummySinkCompCls
= utilsPlugin
->sinkComponentClasses()["dummy"];
110 BT_ASSERT(dummySinkCompCls
);
112 return graph
->addComponent(*dummySinkCompCls
, "the-sink");
116 const auto outPort
= srcComp
.outputPorts()["out"];
119 const auto inPort
= sinkComp
.inputPorts()["in"];
122 graph
->connectPorts(*outPort
, *inPort
);
124 /* Run graph (executes `msgIterCtxFunc`) */