CCF
Loading...
Searching...
No Matches
ordered_tasks.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
5#include "tasks/job_board.h"
6
7#include <memory>
8#include <mutex>
9
10namespace ccf::tasks
11{
13 {
14 virtual ~ITaskAction() = default;
15
16 virtual void do_action() = 0;
17
18 [[nodiscard]] virtual const std::string& get_name() const = 0;
19 };
20
21 using TaskAction = std::shared_ptr<ITaskAction>;
22
24 {
25 using Fn = std::function<void()>;
26
28 const std::string name;
29
30 BasicTaskAction(Fn fn_, std::string name_ = "[Anon]") :
31 fn(std::move(fn_)),
32 name(std::move(name_))
33 {}
34
35 void do_action() override
36 {
37 fn();
38 }
39
40 [[nodiscard]] const std::string& get_name() const override
41 {
42 return name;
43 }
44 };
45
46 template <typename... Ts>
48 {
49 return std::make_shared<BasicTaskAction>(std::forward<Ts>(ts)...);
50 }
51
52 // Self-scheduling collection of in-order tasks. Tasks
53 // will be executed in the order they are added. To self-schedule, this
54 // instance will ensure that it is posted to the given JobBoard whenever more
55 // sub-tasks are available for execution.
56 class OrderedTasks : public BaseTask,
57 public std::enable_shared_from_this<OrderedTasks>
58 {
59 protected:
60 struct PImpl;
61 std::unique_ptr<PImpl> pimpl = nullptr;
62
63 struct ResumeOrderedTasks;
64
65 void enqueue_on_board();
66 void do_task_implementation() override;
67
68 // Non-public constructor argument type, so this can only be constructed by
69 // this class (ensuring shared ptr ownership)
70 struct Private
71 {
72 explicit Private() = default;
73 };
74
75 public:
77 Private force_private_constructor,
78 JobBoard& job_board,
79 const std::string& name);
80 ~OrderedTasks() override;
81
82 static std::shared_ptr<OrderedTasks> create(
83 JobBoard& job_board_, const std::string& name_ = "[Ordered]");
84
86 const std::string& get_name() const override;
87
88 void add_action(TaskAction&& action);
89
90 void get_queue_summary(size_t& num_pending, bool& is_active);
91 };
92}
Definition job_board.h:15
Definition ordered_tasks.h:58
void enqueue_on_board()
Definition ordered_tasks.cpp:34
ccf::tasks::Resumable pause() override
Definition ordered_tasks.cpp:57
std::unique_ptr< PImpl > pimpl
Definition ordered_tasks.h:61
void get_queue_summary(size_t &num_pending, bool &is_active)
Definition ordered_tasks.cpp:77
void do_task_implementation() override
Definition ordered_tasks.cpp:48
const std::string & get_name() const override
Definition ordered_tasks.cpp:64
static std::shared_ptr< OrderedTasks > create(JobBoard &job_board_, const std::string &name_="[Ordered]")
Definition ordered_tasks.cpp:82
void add_action(TaskAction &&action)
Definition ordered_tasks.cpp:69
Definition basic_task.h:8
std::shared_ptr< ITaskAction > TaskAction
Definition ordered_tasks.h:21
TaskAction make_basic_action(Ts &&... ts)
Definition ordered_tasks.h:47
std::unique_ptr< IResumable > Resumable
Definition resumable.h:24
STL namespace.
Definition task.h:15
Definition ordered_tasks.h:24
const std::string name
Definition ordered_tasks.h:28
Fn fn
Definition ordered_tasks.h:27
std::function< void()> Fn
Definition ordered_tasks.h:25
const std::string & get_name() const override
Definition ordered_tasks.h:40
void do_action() override
Definition ordered_tasks.h:35
BasicTaskAction(Fn fn_, std::string name_="[Anon]")
Definition ordered_tasks.h:30
Definition ordered_tasks.h:13
virtual ~ITaskAction()=default
virtual const std::string & get_name() const =0
virtual void do_action()=0
Definition ordered_tasks.cpp:11
Definition ordered_tasks.h:71
Definition ordered_tasks.cpp:18