implement emitting from DLL in Node/DLL
This commit is contained in:
parent
c8feba19c0
commit
0e50b539e5
@ -29,8 +29,11 @@ typedef struct nf7_vtable_t {
|
|||||||
|
|
||||||
// ---- context methods ----
|
// ---- context methods ----
|
||||||
struct {
|
struct {
|
||||||
|
void (*emit)(nf7_ctx_t*, const char* name, nf7_value_t*);
|
||||||
|
|
||||||
// thread-safe
|
// thread-safe
|
||||||
void (*exec_async)(nf7_ctx_t*, void (*f)(nf7_ctx_t*));
|
void (*exec_async)(nf7_ctx_t*, void (*f)(nf7_ctx_t*), uint64_t ms);
|
||||||
|
void (*exec_sub) (nf7_ctx_t*, void (*f)(nf7_ctx_t*), uint64_t ms);
|
||||||
} ctx;
|
} ctx;
|
||||||
|
|
||||||
// ---- value accessor/mutator ----
|
// ---- value accessor/mutator ----
|
||||||
@ -69,6 +72,7 @@ typedef struct nf7_init_t {
|
|||||||
} nf7_init_t;
|
} nf7_init_t;
|
||||||
|
|
||||||
typedef struct nf7_ctx_t {
|
typedef struct nf7_ctx_t {
|
||||||
|
nf7_value_t* value;
|
||||||
void* ptr;
|
void* ptr;
|
||||||
} nf7_ctx_t;
|
} nf7_ctx_t;
|
||||||
|
|
||||||
@ -87,7 +91,6 @@ typedef struct nf7_node_msg_t {
|
|||||||
const char* name;
|
const char* name;
|
||||||
nf7_value_t* value;
|
nf7_value_t* value;
|
||||||
nf7_ctx_t* ctx;
|
nf7_ctx_t* ctx;
|
||||||
void* ptr;
|
|
||||||
} nf7_node_msg_t;
|
} nf7_node_msg_t;
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,8 +38,10 @@ struct InitParam {
|
|||||||
std::shared_ptr<nf7::DLL> dll;
|
std::shared_ptr<nf7::DLL> dll;
|
||||||
std::vector<const nf7_node_t*> nodes;
|
std::vector<const nf7_node_t*> nodes;
|
||||||
};
|
};
|
||||||
struct NodeMsg {
|
struct Context {
|
||||||
nf7_node_msg_t base;
|
nf7_ctx_t base;
|
||||||
|
std::shared_ptr<nf7::Node::Lambda> caller;
|
||||||
|
std::shared_ptr<nf7::Node::Lambda> callee;
|
||||||
};
|
};
|
||||||
} // namespace adaptor
|
} // namespace adaptor
|
||||||
|
|
||||||
@ -51,7 +53,12 @@ static const nf7_vtable_t kVtable = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
.ctx = {
|
.ctx = {
|
||||||
|
.emit = [](nf7_ctx_t* ptr, const char* name, nf7_value_t* v) {
|
||||||
|
auto& p = *reinterpret_cast<adaptor::Context*>(ptr);
|
||||||
|
p.caller->Handle(name, *reinterpret_cast<nf7::Value*>(v), p.callee);
|
||||||
|
},
|
||||||
.exec_async = nullptr, // TODO
|
.exec_async = nullptr, // TODO
|
||||||
|
.exec_sub = nullptr, // TODO
|
||||||
},
|
},
|
||||||
.value = {
|
.value = {
|
||||||
.get_type = [](nf7_value_t* vptr) {
|
.get_type = [](nf7_value_t* vptr) {
|
||||||
@ -210,27 +217,36 @@ class Loader::Node final : public nf7::File, public nf7::DirItem, public nf7::No
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class Loader::Node::Lambda final : public nf7::Node::Lambda {
|
class Loader::Node::Lambda final : public nf7::Node::Lambda,
|
||||||
|
public std::enable_shared_from_this<Loader::Node::Lambda> {
|
||||||
public:
|
public:
|
||||||
Lambda(Loader::Node& f, const std::shared_ptr<nf7::Node::Lambda>& parent) noexcept :
|
Lambda(Loader::Node& f, const std::shared_ptr<nf7::Node::Lambda>& parent) noexcept :
|
||||||
nf7::Node::Lambda(f, parent),
|
nf7::Node::Lambda(f, parent),
|
||||||
dll_(f.dll_), meta_(f.meta_), ptr_(meta_.init()) {
|
dll_(f.dll_), meta_(f.meta_), ptr_(meta_.init? meta_.init(): nullptr) {
|
||||||
}
|
}
|
||||||
~Lambda() noexcept {
|
~Lambda() noexcept {
|
||||||
|
if (meta_.deinit) {
|
||||||
meta_.deinit(ptr_);
|
meta_.deinit(ptr_);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
void Handle(const nf7::Node::Lambda::Msg& in) noexcept override {
|
void Handle(const nf7::Node::Lambda::Msg& in) noexcept override {
|
||||||
nf7::Value v = in.value;
|
nf7::Value v = in.value;
|
||||||
|
nf7::Value temp;
|
||||||
|
|
||||||
const adaptor::NodeMsg msg = {
|
adaptor::Context ctx = {
|
||||||
.base = {
|
.base = {
|
||||||
.name = in.name.c_str(),
|
.value = reinterpret_cast<nf7_value_t*>(&temp),
|
||||||
.value = reinterpret_cast<nf7_value_t*>(&v),
|
|
||||||
.ctx = reinterpret_cast<nf7_ctx_t*>(this),
|
|
||||||
.ptr = ptr_,
|
.ptr = ptr_,
|
||||||
},
|
},
|
||||||
|
.caller = in.sender,
|
||||||
|
.callee = shared_from_this(),
|
||||||
};
|
};
|
||||||
meta_.handle(&msg.base);
|
const nf7_node_msg_t msg = {
|
||||||
|
.name = in.name.c_str(),
|
||||||
|
.value = reinterpret_cast<nf7_value_t*>(&v),
|
||||||
|
.ctx = &ctx.base,
|
||||||
|
};
|
||||||
|
meta_.handle(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user