mirror of
https://github.com/matrix-construct/construct
synced 2024-12-28 00:14:07 +01:00
modules/vm: Asynchronous post_hook sequencing.
This commit is contained in:
parent
a6ae9a7c90
commit
d61d443a4c
1 changed files with 66 additions and 2 deletions
|
@ -36,6 +36,10 @@ namespace ircd::m::vm
|
||||||
extern conf::item<bool> log_commit_debug;
|
extern conf::item<bool> log_commit_debug;
|
||||||
extern conf::item<bool> log_accept_debug;
|
extern conf::item<bool> log_accept_debug;
|
||||||
extern conf::item<bool> log_accept_info;
|
extern conf::item<bool> log_accept_info;
|
||||||
|
|
||||||
|
extern conf::item<size_t> pool_size;
|
||||||
|
extern const ctx::pool::opts pool_opts;
|
||||||
|
extern ctx::pool pool;
|
||||||
}
|
}
|
||||||
|
|
||||||
ircd::mapi::header
|
ircd::mapi::header
|
||||||
|
@ -108,6 +112,29 @@ ircd::m::vm::effect_hook
|
||||||
{ "name", "vm.effect" }
|
{ "name", "vm.effect" }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
decltype(ircd::m::vm::pool_size)
|
||||||
|
ircd::m::vm::pool_size
|
||||||
|
{
|
||||||
|
{ "name", "ircd.m.vm.pool.size" },
|
||||||
|
{ "default", 16L },
|
||||||
|
};
|
||||||
|
|
||||||
|
decltype(ircd::m::vm::pool_opts)
|
||||||
|
ircd::m::vm::pool_opts
|
||||||
|
{
|
||||||
|
ctx::DEFAULT_STACK_SIZE,
|
||||||
|
0,
|
||||||
|
-1,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
|
||||||
|
decltype(ircd::m::vm::pool)
|
||||||
|
ircd::m::vm::pool
|
||||||
|
{
|
||||||
|
"vm", pool_opts
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// init
|
// init
|
||||||
//
|
//
|
||||||
|
@ -115,6 +142,8 @@ ircd::m::vm::effect_hook
|
||||||
void
|
void
|
||||||
ircd::m::vm::init()
|
ircd::m::vm::init()
|
||||||
{
|
{
|
||||||
|
pool.min(size_t(pool_size));
|
||||||
|
|
||||||
id::event::buf event_id;
|
id::event::buf event_id;
|
||||||
sequence::retired = sequence::get(event_id);
|
sequence::retired = sequence::get(event_id);
|
||||||
sequence::committed = sequence::retired;
|
sequence::committed = sequence::retired;
|
||||||
|
@ -132,6 +161,9 @@ ircd::m::vm::init()
|
||||||
void
|
void
|
||||||
ircd::m::vm::fini()
|
ircd::m::vm::fini()
|
||||||
{
|
{
|
||||||
|
pool.terminate();
|
||||||
|
pool.join();
|
||||||
|
|
||||||
assert(eval::list.empty());
|
assert(eval::list.empty());
|
||||||
|
|
||||||
event::id::buf event_id;
|
event::id::buf event_id;
|
||||||
|
@ -711,7 +743,24 @@ ircd::m::vm::_eval_pdu(eval &eval,
|
||||||
};
|
};
|
||||||
|
|
||||||
_write(eval, event);
|
_write(eval, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
// pre-notify effect hooks
|
||||||
|
bool post_hook_complete{false};
|
||||||
|
if(opts.post)
|
||||||
|
pool([&event, &eval, &post_hook_complete]
|
||||||
|
{
|
||||||
|
const unwind notify{[&post_hook_complete]
|
||||||
|
{
|
||||||
|
post_hook_complete = true;
|
||||||
|
sequence::dock.notify_all();
|
||||||
|
}};
|
||||||
|
|
||||||
|
post_hook(event, eval);
|
||||||
|
});
|
||||||
|
|
||||||
|
if(opts.write)
|
||||||
|
{
|
||||||
sequence::dock.wait([&eval]
|
sequence::dock.wait([&eval]
|
||||||
{
|
{
|
||||||
return eval::seqnext(sequence::retired) == &eval;
|
return eval::seqnext(sequence::retired) == &eval;
|
||||||
|
@ -733,9 +782,24 @@ ircd::m::vm::_eval_pdu(eval &eval,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// pre-notify effect hooks
|
|
||||||
if(opts.post)
|
if(opts.post)
|
||||||
post_hook(event, eval);
|
{
|
||||||
|
sequence::dock.wait([&post_hook_complete]
|
||||||
|
{
|
||||||
|
return post_hook_complete;
|
||||||
|
});
|
||||||
|
|
||||||
|
log::debug
|
||||||
|
{
|
||||||
|
log, "vm seq %lu:%lu|%lu[%lu|%lu]%lu | accept",
|
||||||
|
vm::sequence::max(),
|
||||||
|
vm::sequence::uncommitted,
|
||||||
|
vm::sequence::committed,
|
||||||
|
vm::sequence::retired,
|
||||||
|
sequence::get(eval),
|
||||||
|
vm::sequence::min(),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
return fault::ACCEPT;
|
return fault::ACCEPT;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue