0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2025-01-13 16:33:53 +01:00

ircd:Ⓜ️:exec: Add options structure; add logging/detach related options.

This commit is contained in:
Jason Volk 2020-10-20 17:06:36 -07:00
parent e5b0fe25c7
commit 86a8509b26
2 changed files with 41 additions and 4 deletions

View file

@ -34,6 +34,7 @@ namespace boost::process
struct ircd::exec struct ircd::exec
:instance_list<ircd::exec> :instance_list<ircd::exec>
{ {
struct opts;
using args = vector_view<const string_view>; using args = vector_view<const string_view>;
using const_buffers = vector_view<const const_buffer>; using const_buffers = vector_view<const const_buffer>;
using mutable_buffers = vector_view<const mutable_buffer>; using mutable_buffers = vector_view<const mutable_buffer>;
@ -42,6 +43,7 @@ struct ircd::exec
static uint64_t id_ctr; static uint64_t id_ctr;
uint64_t id {0}; uint64_t id {0};
std::unique_ptr<opts> opt;
std::string path; std::string path;
std::vector<std::string> argv; std::vector<std::string> argv;
std::unique_ptr<pair<boost::process::async_pipe>> pipe; std::unique_ptr<pair<boost::process::async_pipe>> pipe;
@ -55,6 +57,7 @@ struct ircd::exec
bool signal(const int &sig); bool signal(const int &sig);
long join(const int &sig = 0); long join(const int &sig = 0);
exec(const args &, const opts &);
exec(const args &); exec(const args &);
exec(exec &&) = delete; exec(exec &&) = delete;
exec(const exec &) = delete; exec(const exec &) = delete;
@ -63,6 +66,29 @@ struct ircd::exec
~exec() noexcept; ~exec() noexcept;
}; };
/// Exec options
///
struct ircd::exec::opts
{
/// When false (default) the child is terminated by the dtor of
/// ircd::exec. Note setting this to true does not detach the boost
/// handles until destruction time; it also does not affect calling
/// the interface join() manually.
bool detach {false};
/// Child executions will be logged at this level (use DEBUG to quiet)
ircd::log::level exec_log_level = ircd::log::level::NOTICE;
/// Child exits will be logged at this level (use DEBUG to quiet); note
/// non-zero exits are still logged with level::ERROR.
ircd::log::level exit_log_level = ircd::log::level::INFO;
};
inline
ircd::exec::exec(const args &args)
:exec{args, opts{}}
{}
inline ircd::const_buffer inline ircd::const_buffer
ircd::write(exec &p, ircd::write(exec &p,
const const_buffer &buf) const const_buffer &buf)

View file

@ -30,11 +30,16 @@ ircd::util::instance_list<ircd::exec>::list
allocator allocator
}; };
ircd::exec::exec(const args &args) ircd::exec::exec(const args &args,
const opts &opt)
:id :id
{ {
++id_ctr ++id_ctr
} }
,opt
{
std::make_unique<opts>(opt)
}
,path ,path
( (
args.at(0) args.at(0)
@ -66,9 +71,10 @@ ircd::exec::exec(const args &args)
child->id() child->id()
} }
{ {
log::notice log::logf
{ {
log, "id:%lu pid:%ld `%s' exec argc:%zu", log, this->opt->exec_log_level,
"id:%lu pid:%ld `%s' exec argc:%zu",
id, id,
pid, pid,
path, path,
@ -79,6 +85,10 @@ ircd::exec::exec(const args &args)
ircd::exec::~exec() ircd::exec::~exec()
noexcept try noexcept try
{ {
assert(opt);
if(opt->detach)
return;
join(SIGKILL); join(SIGKILL);
} }
catch(const std::exception &e) catch(const std::exception &e)
@ -126,10 +136,11 @@ try
assert(!child->running()); assert(!child->running());
code = child->exit_code(); code = child->exit_code();
assert(opt);
const auto &level const auto &level
{ {
code == 0? code == 0?
log::level::INFO: opt->exit_log_level:
log::level::ERROR log::level::ERROR
}; };