| | #pragma once
|
| |
|
| | #include "server-task.h"
|
| |
|
| | #include <condition_variable>
|
| | #include <deque>
|
| | #include <mutex>
|
| | #include <vector>
|
| | #include <unordered_set>
|
| |
|
| |
|
| |
|
| | struct server_queue {
|
| | private:
|
| | int id = 0;
|
| | bool running = false;
|
| | bool sleeping = false;
|
| | bool req_stop_sleeping = false;
|
| | int64_t time_last_task = 0;
|
| |
|
| |
|
| | std::deque<server_task> queue_tasks;
|
| | std::deque<server_task> queue_tasks_deferred;
|
| |
|
| | std::mutex mutex_tasks;
|
| | std::condition_variable condition_tasks;
|
| |
|
| |
|
| | std::function<void(server_task &&)> callback_new_task;
|
| | std::function<void(void)> callback_update_slots;
|
| | std::function<void(bool)> callback_sleeping_state;
|
| |
|
| | public:
|
| |
|
| | int post(server_task && task, bool front = false);
|
| |
|
| |
|
| | int post(std::vector<server_task> && tasks, bool front = false);
|
| |
|
| |
|
| | void defer(server_task && task);
|
| |
|
| |
|
| | int get_new_id();
|
| |
|
| |
|
| |
|
| | void pop_deferred_task(int id_slot);
|
| |
|
| |
|
| |
|
| | void wait_until_no_sleep();
|
| |
|
| | bool is_sleeping() {
|
| | std::unique_lock<std::mutex> lock(mutex_tasks);
|
| | return sleeping;
|
| | }
|
| |
|
| |
|
| | void terminate();
|
| |
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | void start_loop(int64_t idle_sleep_ms = -1);
|
| |
|
| |
|
| | size_t queue_tasks_deferred_size() {
|
| | std::unique_lock<std::mutex> lock(mutex_tasks);
|
| | return queue_tasks_deferred.size();
|
| | }
|
| |
|
| |
|
| |
|
| |
|
| |
|
| |
|
| | void on_new_task(std::function<void(server_task &&)> callback) {
|
| | callback_new_task = std::move(callback);
|
| | }
|
| |
|
| |
|
| | void on_update_slots(std::function<void(void)> callback) {
|
| | callback_update_slots = std::move(callback);
|
| | }
|
| |
|
| |
|
| |
|
| |
|
| | void on_sleeping_state(std::function<void(bool)> callback) {
|
| | callback_sleeping_state = std::move(callback);
|
| | }
|
| |
|
| | private:
|
| | void cleanup_pending_task(int id_target);
|
| | };
|
| |
|
| |
|
| |
|
| | struct server_response {
|
| | private:
|
| | bool running = true;
|
| |
|
| |
|
| | std::unordered_set<int> waiting_task_ids;
|
| |
|
| |
|
| | std::vector<server_task_result_ptr> queue_results;
|
| |
|
| | std::mutex mutex_results;
|
| | std::condition_variable condition_results;
|
| |
|
| | public:
|
| |
|
| | void add_waiting_task_id(int id_task);
|
| |
|
| | void add_waiting_task_ids(const std::unordered_set<int> & id_tasks);
|
| |
|
| |
|
| | void remove_waiting_task_id(int id_task);
|
| |
|
| |
|
| | void remove_waiting_task_ids(const std::unordered_set<int> & id_tasks);
|
| |
|
| |
|
| | server_task_result_ptr recv(const std::unordered_set<int> & id_tasks);
|
| |
|
| |
|
| |
|
| | server_task_result_ptr recv_with_timeout(const std::unordered_set<int> & id_tasks, int timeout);
|
| |
|
| |
|
| | server_task_result_ptr recv(int id_task);
|
| |
|
| |
|
| | void send(server_task_result_ptr && result);
|
| |
|
| |
|
| | void terminate();
|
| | };
|
| |
|
| |
|
| |
|
| |
|
| | struct server_response_reader {
|
| | std::unordered_set<int> id_tasks;
|
| | server_queue & queue_tasks;
|
| | server_response & queue_results;
|
| | size_t received_count = 0;
|
| | bool cancelled = false;
|
| | int polling_interval_seconds;
|
| |
|
| |
|
| |
|
| | std::vector<task_result_state> states;
|
| |
|
| |
|
| | server_response_reader(server_queue & queue_tasks, server_response & queue_results, int polling_interval_seconds)
|
| | : queue_tasks(queue_tasks), queue_results(queue_results), polling_interval_seconds(polling_interval_seconds) {}
|
| | ~server_response_reader() {
|
| | stop();
|
| | }
|
| |
|
| | int get_new_id() {
|
| | return queue_tasks.get_new_id();
|
| | }
|
| |
|
| |
|
| | void post_task(server_task && task, bool front = false);
|
| | void post_tasks(std::vector<server_task> && tasks, bool front = false);
|
| | bool has_next() const;
|
| |
|
| |
|
| |
|
| | server_task_result_ptr next(const std::function<bool()> & should_stop);
|
| |
|
| | struct batch_response {
|
| | bool is_terminated = false;
|
| | std::vector<server_task_result_ptr> results;
|
| | server_task_result_ptr error;
|
| | };
|
| |
|
| | batch_response wait_for_all(const std::function<bool()> & should_stop);
|
| |
|
| | void stop();
|
| | };
|
| |
|