summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorReinUsesLisp <reinuseslisp@airmail.cc>2020-07-21 04:40:28 -0300
committerReinUsesLisp <reinuseslisp@airmail.cc>2020-07-28 01:47:03 -0300
commit2c67bbf6091477a09d280c322539cbaf1b6e4a8e (patch)
tree1128e37d5d397e3cb1d89aa01381463a5014842d /src
parent5692c48ab7103a2051f351e08fd012fc9022d951 (diff)
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.
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/sockets/blocking_worker.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/core/hle/service/sockets/blocking_worker.h b/src/core/hle/service/sockets/blocking_worker.h
index 7bd486530..31ef6b821 100644
--- a/src/core/hle/service/sockets/blocking_worker.h
+++ b/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