17constexpr std::size_t kMinimumWorkerCount = 1;
22 : slots_(std::max<std::size_t>(kMinimumWorkerCount, slots))
23 , available_(std::max<std::size_t>(kMinimumWorkerCount, slots))
29 std::unique_lock<std::mutex> lk(m_);
30 cv_.wait(lk, [&]() {
return available_ > 0; });
37 std::lock_guard<std::mutex> g(m_);
38 available_ = std::min(slots_, available_ + 1);
44 std::size_t workers, std::size_t queueCapacity,
45 std::shared_ptr<core::ports::diagnostics::IErrorReporter> errorReporter)
46 : cap_(std::max<std::size_t>(kMinimumWorkerCount, queueCapacity))
47 , errorReporter_(std::move(errorReporter))
49 workers = std::max<std::size_t>(kMinimumWorkerCount, workers);
50 workers_.reserve(workers);
51 for (std::size_t i = 0; i < workers; ++i) {
52 workers_.emplace_back([
this]() { workerLoop(); });
64 std::lock_guard<std::mutex> g(m_);
65 if (stopping_)
return;
69 cvNotEmpty_.notify_all();
70 cvNotFull_.notify_all();
72 for (
auto& w : workers_) {
74 if (w.joinable()) w.join();
78 "core::jobs::Scheduler::stop::join",
79 std::current_exception());
89 std::unique_lock<std::mutex> lk(m_);
90 cvNotFull_.wait(lk, [&]() {
return stopping_ || q_.size() < cap_; });
91 if (stopping_)
return;
92 q_.push_back(std::move(t));
94 cvNotEmpty_.notify_one();
97void Scheduler::workerLoop()
102 std::unique_lock<std::mutex> lk(m_);
103 cvNotEmpty_.wait(lk, [&]() {
return stopping_ || !q_.empty(); });
104 if (stopping_ && q_.empty())
return;
105 t = std::move(q_.front());
108 cvNotFull_.notify_one();
115 "core::jobs::Scheduler::workerLoop::task",
116 std::current_exception());
Provides shared helpers for reporting structured errors and exceptions.
Declares a bounded worker queue and a simple slot limiter for import tasks.
void enqueue(Task t)
Enqueue a task, blocking when the queue is full.
std::function< void()> Task
Scheduler(std::size_t workers, std::size_t queueCapacity, std::shared_ptr< core::ports::diagnostics::IErrorReporter > errorReporter)
Create a scheduler with bounded workers and queue capacity.
void stop()
Stop accepting new tasks and join all worker threads.
~Scheduler()
Stop workers and destroy the scheduler.
void release()
Release one acquired slot and wake a waiting caller.
SlotLimiter(std::size_t slots)
Create a limiter with at least one available slot.
void acquire()
Block until a slot is available and acquire it.
void reportException(core::ports::diagnostics::IErrorReporter *reporter, ErrorSeverity severity, const char *origin, std::exception_ptr exception)
Report an exception through the reporter's default exception handling.