1
0
Fork 0
mirror of https://gitlab.com/niansa/cosched.git synced 2025-03-06 20:53:26 +01:00

Improved ScheduledThread::enqueue

This commit is contained in:
niansa 2023-05-04 19:49:36 +02:00
parent e53d6c2c7e
commit 19b29577a1
2 changed files with 15 additions and 8 deletions

View file

@ -12,9 +12,14 @@
namespace CoSched {
class ScheduledThread {
struct QueueEntry {
std::string task_name;
std::function<async::result<void> ()> task_fcn;
};
std::thread thread;
std::mutex queue_mutex;
std::queue<std::function<void (Scheduler&)>> queue;
std::queue<QueueEntry> queue;
std::mutex conditional_mutex;
std::condition_variable conditional_lock;
bool shutdown_requested = false;
@ -33,11 +38,11 @@ public:
}
// DO NOT call from within a task
void enqueue(const std::function<void (Scheduler&)>& f) {
void enqueue(const std::string& task_name, const std::function<async::result<void> ()>& task_fcn) {
// Enqueue function
{
std::scoped_lock L(queue_mutex);
queue.emplace(f);
queue.emplace(QueueEntry{task_name, task_fcn});
}
// Notify thread
@ -52,9 +57,10 @@ public:
// MUST already be running
void shutdown() {
enqueue([this] (Scheduler&) {
shutdown_requested = true;
});
enqueue("Shutdown Initiator", [this] () -> async::result<void> {
shutdown_requested = true;
co_return;
});
}
};
}

View file

@ -10,9 +10,10 @@ void CoSched::ScheduledThread::main_loop() {
// Start all new tasks enqueued
std::scoped_lock L(queue_mutex);
while (!queue.empty()) {
auto f = std::move(queue.front());
auto e = std::move(queue.front());
queue.pop();
f(sched);
sched.create_task(e.task_name);
async::detach(e.task_fcn());
}
// Run once
sched.run_once();