service/sockets: Add worker pool abstraction

Manage worker threads with an easy to use abstraction.
We can expand this to support thread deletion in the future.
This commit is contained in:
ReinUsesLisp 2020-07-21 04:40:28 -03:00
parent 5692c48ab7
commit 2c67bbf609

View file

@ -10,6 +10,7 @@
#include <string_view> #include <string_view>
#include <thread> #include <thread>
#include <variant> #include <variant>
#include <vector>
#include <fmt/format.h> #include <fmt/format.h>
@ -129,4 +130,33 @@ private:
std::atomic_bool is_available{true}; std::atomic_bool is_available{true};
}; };
template <class Service, class... Types>
class BlockingWorkerPool {
using Worker = BlockingWorker<Service, Types...>;
public:
explicit BlockingWorkerPool(Core::System& system_, Service* service_)
: system{system_}, service{service_} {}
/// Returns a captured worker thread, creating new ones if necessary
Worker* CaptureWorker() {
for (auto& worker : workers) {
if (worker->TryCapture()) {
return worker.get();
}
}
auto new_worker = Worker::Create(system, service, fmt::format("BSD:{}", workers.size()));
[[maybe_unused]] const bool success = new_worker->TryCapture();
ASSERT(success);
return workers.emplace_back(std::move(new_worker)).get();
}
private:
Core::System& system;
Service* const service;
std::vector<std::unique_ptr<Worker>> workers;
};
} // namespace Service::Sockets } // namespace Service::Sockets