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:
parent
5692c48ab7
commit
2c67bbf609
|
@ -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
|
||||||
|
|
Reference in New Issue