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:
parent
e53d6c2c7e
commit
19b29577a1
2 changed files with 15 additions and 8 deletions
|
@ -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;
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Add table
Reference in a new issue