diff --git a/services/lib/src/Worker.h b/services/lib/src/Worker.h new file mode 100644 --- /dev/null +++ b/services/lib/src/Worker.h @@ -0,0 +1,49 @@ +#pragma once + +#include "GlobalTools.h" + +#include <boost/asio.hpp> +#include <boost/asio/thread_pool.hpp> + +#include <atomic> +#include <memory> + +typedef std::function<void()> Task; +typedef std::function<void(std::unique_ptr<std::string>)> Callback; + +namespace comm { +namespace network { + +class Worker { + std::unique_ptr<boost::asio::thread_pool> pool; + + Worker() { + this->pool = + std::make_unique<boost::asio::thread_pool>(tools::getNumberOfCpus()); + } + + virtual ~Worker() { + this->pool->join(); + } + +public: + static Worker &getInstance() { + static Worker instance; + return instance; + } + + void schedule(Task task, Callback callback) { + boost::asio::post(*this->pool, [task, callback]() { + std::unique_ptr<std::string> err = nullptr; + try { + task(); + } catch (std::exception &e) { + err = std::make_unique<std::string>(e.what()); + } + callback(std::move(err)); + }); + } +}; + +} // namespace network +} // namespace comm \ No newline at end of file