|
|
@@ -10,6 +10,7 @@
|
|
|
#include <string_view>
|
|
|
#include <thread>
|
|
|
#include <variant>
|
|
|
+#include <vector>
|
|
|
|
|
|
#include <fmt/format.h>
|
|
|
|
|
|
@@ -129,4 +130,33 @@ private:
|
|
|
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
|