Просмотр исходного кода

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.
ReinUsesLisp 6 лет назад
Родитель
Сommit
2c67bbf609
1 измененных файлов с 30 добавлено и 0 удалено
  1. 30 0
      src/core/hle/service/sockets/blocking_worker.h

+ 30 - 0
src/core/hle/service/sockets/blocking_worker.h

@@ -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