6#include "dawn/prog/redirect.hxx"
10#include "dawn/debug.hxx"
11#include "dawn/io/common.hxx"
12#include "dawn/io/ddata.hxx"
16int CProgRedirect::ioNotifierCb(
void *priv,
io_ddata_t *data)
18 SRedirectBind *bind =
static_cast<SRedirectBind *
>(priv);
21 if (bind ==
nullptr || !bind->active)
26 ret = bind->dst->setData(*data);
29 DAWNERR(
"redirect: dst 0x%" PRIx32
" setData failed: %d\n", bind->dst->getIdV(), ret);
36int CProgRedirect::configureDesc(
const CDescObject &desc)
47 DAWNERR(
"redirect: unsupported cfg 0x%08" PRIx32
"\n", item->
cfgid.
v);
53 case PROG_REDIRECT_CFG_IOBIND:
55 const size_t wpe =
sizeof(SProgRedirectIOBind) / 4;
56 const SProgRedirectIOBind *tmp;
63 DAWNERR(
"redirect: invalid IOBIND size %d\n", item->
cfgid.
s.
size);
68 tmp =
reinterpret_cast<const SProgRedirectIOBind *
>(item->
data);
70 for (i = 0; i < nbinds; i++)
72 ret = allocObject(&tmp[i]);
84 DAWNERR(
"redirect: unsupported cfg 0x%08" PRIx32
"\n", item->
cfgid.
v);
93int CProgRedirect::allocObject(
const SProgRedirectIOBind *cfg)
97 DAWNINFO(
"allocate redirect 0x%" PRIx32
" -> 0x%" PRIx32
"\n", cfg->src.v, cfg->dst.v);
99 b =
new (std::nothrow) SRedirectBind();
117CProgRedirect::~CProgRedirect()
124 int ret = configureDesc(
getDesc());
127 DAWNERR(
"redirect configure failed: %d\n", ret);
133 DAWNERR(
"redirect: no bindings configured\n");
142 for (
auto bind : binds)
146 bind->src =
getIO(bind->cfg.src.v);
149 DAWNERR(
"redirect: src 0x%" PRIx32
" not found\n", bind->cfg.src.v);
153 bind->dst =
getIO(bind->cfg.dst.v);
156 DAWNERR(
"redirect: dst 0x%" PRIx32
" not found\n", bind->cfg.dst.v);
160 if (!bind->src->isNotify())
162 DAWNERR(
"redirect: src 0x%" PRIx32
" has no notify support\n", bind->src->getIdV());
166 if (bind->src->getDtype() != bind->dst->getDtype() ||
167 bind->src->getDataDim() != bind->dst->getDataDim() ||
168 bind->src->isTimestamp() != bind->dst->isTimestamp() ||
169 bind->src->getDataSize() != bind->dst->getDataSize())
171 DAWNERR(
"redirect: incompatible src/dst IO types 0x%" PRIx32
" -> 0x%" PRIx32
"\n",
173 bind->dst->getIdV());
177 ret = prepareWritableTarget(bind->dst, bind->src->getDataDim(),
true);
181 "redirect: target prepare failed for 0x%" PRIx32
": %d\n", bind->dst->getIdV(), ret);
193 for (
auto bind : binds)
206 for (
auto bind : binds)
211 ret = bind->src->setNotifier(ioNotifierCb, 0, bind);
214 DAWNERR(
"redirect: setNotifier failed for 0x%" PRIx32
": %d\n", bind->src->getIdV(), ret);
224 for (
auto bind : binds)
226 if (bind->src !=
nullptr)
228 bind->src->setNotifier(
nullptr, 0,
nullptr);
231 bind->active =
false;
CIOCommon * getIO(SObjectId::ObjectId id)
Get an I/O object by ID.
void setObjectMapItem(SObjectId::ObjectId id, CObject *obj)
Set an item in the object map.
Descriptor wrapper for individual object configuration.
size_t getSize() const
Get number of configuration items for this object.
SObjectCfg::SObjectCfgItem * objectCfgItemNext(size_t &offset) const
Get config item at current offset and advance past it.
CDescObject & getDesc()
Get descriptor object for this object.
@ PROG_CLASS_REDIRECT
Generic input-to-output routing bridge.
bool hasThread() const
Check if a background thread is active.
int deinit()
De-initialize object.
int init()
One-time initialize object after bindings are resolved.
int doStop()
Stop implementation hook.
int configure()
Configure object from descriptor data.
int doStart()
Start implementation hook.
Out-of-tree user-extension hooks for Dawn.
Single configuration item within object.
ObjectCfgData_t data[]
Configuration data array (flexible, size from cfgid.s.size).
UObjectCfgId cfgid
Configuration ID header (type, class, id, size, rw, dtype).
Heap-allocated dynamic I/O data buffer.
ObjectCfgId v
Raw 32-bit ConfigID value (for storage, comparison).
uint32_t cls
Object class (bits 21-29, max 511).
uint32_t id
Configuration identifier (bits 0-4, max 31).
uint32_t size
Configuration data size in 32-bit words (bits 5-14, max 1023).
struct dawn::SObjectCfg::UObjectCfgId::@10 s
Bit-field structure for named member access.