Skip to content
Tsukini edited this page Oct 4, 2026 · 1 revision

Note

Section _System (group _Tools) · Namespace utils::system · Headers utils/system/

Tools for the program itself: id distribution, delayed tasks and a pool of workers.

Table of Contents

IdHandler

IdHandler<T> (T integer) gives unique ids, starting at 1 (0 is reserved as "no id"), and reuses the freed ones first. Every method takes safe_mode = true (lock, thread safe).

Method Description
allocate() / allocate(T& id) Give a free id (and store it in id)
free(id) Give back an id (DoubleFree, UnknownId for an id never given)
use(id) Force an id as used (DoubleUse when already used)
preview() Next id allocate would give
id() / actual() Counter / last id given
clear() / free() Free every id

Warning

When the type limit is reached, allocate throws FatalException(IdOverflow) (ends the program), preview an ErrorException(IdOverflow).

Scheduler

Runs a function after a delay, each task on its own thread.

Method Description
schedule(delay, fn) Run fn() after delay (std::chrono::milliseconds), returns the task id
cancel(id) Cancel one task (UnknownId when finished / unknown)
cancel() Cancel every pending task (also done by the destructor)
utils::system::Scheduler scheduler;
std::size_t id = scheduler.schedule(std::chrono::milliseconds{500}, [](void) {std::cout << "later" << std::endl;});
scheduler.cancel(id);

LoadBalancer

LoadBalancer<T>(limit = 1, lifespan = 0ms) keeps a pool of workers (T is a utils::type::Worker or derives it, see Type) and gives a free one.

Method Description
spawn(n = 1) Add n workers (OutOfBounds over the limit, 0 = no limit)
getWorker() std::future<T&> resolved with a free worker, marked working (waits until one is free)
kill() / kill(n) Remove the free workers / n workers (the free ones first)
kill<true>() / kill<true>(n) Same, also removing the working ones
setLimit(n) / getLimit() Maximum number of workers
setLifespan(ms) / getLifespan() A worker free for longer is removed (0 = never)
size() Number of workers

The worker is given back with worker.setWorkingStatus(false). A getWorker still waiting when the balancer is destroyed throws PromiseCanceled from future.get().

utils::system::LoadBalancer<utils::type::Worker> balancer(4, std::chrono::seconds{30});
balancer.spawn(2);
utils::type::Worker& worker = balancer.getWorker().get();
// ... work ...
worker.setWorkingStatus(false);

Clone this wiki locally