mirror of
https://github.com/matrix-construct/construct
synced 2024-11-16 06:51:08 +01:00
ircd::ctx: Use iteration closure rather than exposing ctx::list.
This commit is contained in:
parent
bf3a23b8d2
commit
4db52804cb
3 changed files with 43 additions and 27 deletions
|
@ -44,7 +44,6 @@ namespace ircd::ctx
|
||||||
IRCD_OVERLOAD(threadsafe)
|
IRCD_OVERLOAD(threadsafe)
|
||||||
|
|
||||||
extern log::log log;
|
extern log::log log;
|
||||||
extern const std::list<ctx *> &ctxs; // List of all ctx instances
|
|
||||||
|
|
||||||
const uint64_t &id(const ctx &); // Unique ID for context
|
const uint64_t &id(const ctx &); // Unique ID for context
|
||||||
string_view name(const ctx &); // User's optional label for context
|
string_view name(const ctx &); // User's optional label for context
|
||||||
|
@ -68,6 +67,8 @@ namespace ircd::ctx
|
||||||
void notify(ctx &, threadsafe_t); // Notify context with threadsafety.
|
void notify(ctx &, threadsafe_t); // Notify context with threadsafety.
|
||||||
bool notify(ctx &); // Queue a context switch to arg
|
bool notify(ctx &); // Queue a context switch to arg
|
||||||
void yield(ctx &); // Direct context switch to arg
|
void yield(ctx &); // Direct context switch to arg
|
||||||
|
|
||||||
|
bool for_each(const std::function<bool (ctx &)> &);
|
||||||
}
|
}
|
||||||
|
|
||||||
#include "prof.h"
|
#include "prof.h"
|
||||||
|
|
17
ircd/ctx.cc
17
ircd/ctx.cc
|
@ -40,13 +40,6 @@ ircd::util::instance_list<ircd::ctx::ctx>::list
|
||||||
allocator
|
allocator
|
||||||
};
|
};
|
||||||
|
|
||||||
/// Public interface linkage for the list of all ctx instances
|
|
||||||
decltype(ircd::ctx::ctxs)
|
|
||||||
ircd::ctx::ctxs
|
|
||||||
{
|
|
||||||
reinterpret_cast<const decltype(ircd::ctx::ctxs) &>(ctx::ctx::list)
|
|
||||||
};
|
|
||||||
|
|
||||||
decltype(ircd::ctx::log)
|
decltype(ircd::ctx::log)
|
||||||
ircd::ctx::log
|
ircd::ctx::log
|
||||||
{
|
{
|
||||||
|
@ -350,6 +343,16 @@ const
|
||||||
// ctx/ctx.h
|
// ctx/ctx.h
|
||||||
//
|
//
|
||||||
|
|
||||||
|
bool
|
||||||
|
ircd::ctx::for_each(const std::function<bool (ctx &)> &closure)
|
||||||
|
{
|
||||||
|
for(auto &ctx : ctx::list)
|
||||||
|
if(!closure(*ctx))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/// Yield to context `ctx`.
|
/// Yield to context `ctx`.
|
||||||
///
|
///
|
||||||
///
|
///
|
||||||
|
|
|
@ -1575,13 +1575,17 @@ console_cmd__ctx__interrupt(opt &out, const string_view &line)
|
||||||
"id", "[id]..."
|
"id", "[id]..."
|
||||||
}};
|
}};
|
||||||
|
|
||||||
for(size_t i(0); i < param.count(); ++i)
|
bool cont{true};
|
||||||
for(auto *const &ctx : ctx::ctxs)
|
for(size_t i(0); i < param.count() && cont; ++i)
|
||||||
if(id(*ctx) == param.at<uint64_t>(i))
|
cont = ctx::for_each([&](auto &ctx)
|
||||||
|
{
|
||||||
|
if(id(ctx) == param.at<uint64_t>(i))
|
||||||
{
|
{
|
||||||
interrupt(*ctx);
|
interrupt(ctx);
|
||||||
break;
|
return false;
|
||||||
}
|
}
|
||||||
|
else return true;
|
||||||
|
});
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1615,16 +1619,20 @@ console_cmd__ctx__prof(opt &out, const string_view &line)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(size_t i(0); i < param.count(); ++i)
|
bool cont{true};
|
||||||
for(auto *const &ctx : ctx::ctxs)
|
for(size_t i(0); i < param.count() && cont; ++i)
|
||||||
if(id(*ctx) == param.at<uint64_t>(i))
|
cont = ctx::for_each([&](auto &ctx)
|
||||||
|
{
|
||||||
|
if(id(ctx) == param.at<uint64_t>(i))
|
||||||
{
|
{
|
||||||
out << "Profile for ctx:" << id(*ctx) << " '" << name(*ctx) << "':\n"
|
out << "Profile for ctx:" << id(ctx) << " '" << name(ctx) << "':\n"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
|
||||||
display(ctx::prof::get(*ctx));
|
display(ctx::prof::get(ctx));
|
||||||
break;
|
return false;
|
||||||
}
|
}
|
||||||
|
else return true;
|
||||||
|
});
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1637,13 +1645,17 @@ console_cmd__ctx__term(opt &out, const string_view &line)
|
||||||
"id", "[id]..."
|
"id", "[id]..."
|
||||||
}};
|
}};
|
||||||
|
|
||||||
for(size_t i(0); i < param.count(); ++i)
|
bool cont {true};
|
||||||
for(auto *const &ctx : ctx::ctxs)
|
for(size_t i(0); i < param.count() && cont; ++i)
|
||||||
if(id(*ctx) == param.at<uint64_t>(i))
|
cont = ctx::for_each([&](auto &ctx)
|
||||||
|
{
|
||||||
|
if(id(ctx) == param.at<uint64_t>(i))
|
||||||
{
|
{
|
||||||
ctx::terminate(*ctx);
|
ctx::terminate(ctx);
|
||||||
break;
|
return false;
|
||||||
}
|
}
|
||||||
|
else return true;
|
||||||
|
});
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1682,9 +1694,8 @@ console_cmd__ctx__list(opt &out, const string_view &line)
|
||||||
<< ":NAME"
|
<< ":NAME"
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
|
|
||||||
for(const auto *const &ctxp : ctx::ctxs)
|
ctx::for_each([&out](auto &ctx)
|
||||||
{
|
{
|
||||||
const auto &ctx{*ctxp};
|
|
||||||
out << std::setw(5) << std::right << id(ctx);
|
out << std::setw(5) << std::right << id(ctx);
|
||||||
out << " "
|
out << " "
|
||||||
<< (started(ctx)? 'A' : '-')
|
<< (started(ctx)? 'A' : '-')
|
||||||
|
@ -1736,7 +1747,8 @@ console_cmd__ctx__list(opt &out, const string_view &line)
|
||||||
<< name(ctx);
|
<< name(ctx);
|
||||||
|
|
||||||
out << std::endl;
|
out << std::endl;
|
||||||
}
|
return true;
|
||||||
|
});
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue