implement emitting from DLL in Node/DLL

This commit is contained in:
falsycat 2022-12-18 20:25:52 +09:00
parent c8feba19c0
commit 0e50b539e5
2 changed files with 33 additions and 14 deletions

View File

@ -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;

View File

@ -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: