librf
scheduler.h
1 #pragma once
2 
3 namespace resumef
4 {
10  struct scheduler_t : public std::enable_shared_from_this<scheduler_t>
11  {
12  private:
14  using state_vector = std::vector<state_sptr>;
15  using lock_type = spinlock;
16  using task_dictionary_type = std::unordered_map<state_base_t*, std::unique_ptr<task_base_t>>;
17 
18  mutable spinlock _lock_running;
19  state_vector _runing_states;
20  state_vector _cached_states;
21 
22  mutable spinlock _lock_ready;
23  task_dictionary_type _ready_task;
24 
25  timer_mgr_ptr _timer;
26 
27  void new_task(task_base_t* task);
28  //void cancel_all_task_();
29  public:
35  void run_one_batch();
36 
41  void run_until_notask();
42 
43  //void break_all();
44 
52  template<class _Ty
53 #ifndef DOXYGEN_SKIP_PROPERTY
54  COMMA_RESUMEF_ENABLE_IF(traits::is_callable_v<_Ty> || traits::is_future_v<_Ty> || traits::is_generator_v<_Ty>)
55 #endif //DOXYGEN_SKIP_PROPERTY
56  >
57 #ifndef DOXYGEN_SKIP_PROPERTY
58  RESUMEF_REQUIRES(traits::is_callable_v<_Ty> || traits::is_future_v<_Ty> || traits::is_generator_v<_Ty>)
59 #endif //DOXYGEN_SKIP_PROPERTY
60  void operator + (_Ty&& coro)
61  {
62  if constexpr (traits::is_callable_v<_Ty>)
63  new_task(new ctx_task_t<_Ty>(coro));
64  else
65  new_task(new task_t<_Ty>(coro));
66  }
67 
75  bool empty() const
76  {
77  scoped_lock<spinlock, spinlock> __guard(_lock_ready, _lock_running);
78  return _ready_task.empty() && _runing_states.empty() && _timer->empty();
79  }
80 
84  timer_manager* timer() const noexcept
85  {
86  return _timer.get();
87  }
88 
89 #ifndef DOXYGEN_SKIP_PROPERTY
90  void add_generator(state_base_t* sptr);
91  void del_final(state_base_t* sptr);
92  std::unique_ptr<task_base_t> del_switch(state_base_t* sptr);
93  void add_switch(std::unique_ptr<task_base_t> task);
94 
95  friend struct local_scheduler_t;
96  protected:
97  scheduler_t();
98  public:
99  ~scheduler_t();
100 
101  scheduler_t(scheduler_t&& right_) = delete;
102  scheduler_t& operator = (scheduler_t&& right_) = delete;
103  scheduler_t(const scheduler_t&) = delete;
104  scheduler_t& operator = (const scheduler_t&) = delete;
105 
106  static scheduler_t g_scheduler;
107 #endif //DOXYGEN_SKIP_PROPERTY
108  };
109 
118  {
123 
128 
133 
134  local_scheduler_t(local_scheduler_t&& right_) = delete;
135  local_scheduler_t& operator = (local_scheduler_t&& right_) = delete;
136  local_scheduler_t(const local_scheduler_t&) = delete;
137  local_scheduler_t& operator = (const local_scheduler_t&) = delete;
138  private:
139  scheduler_t* _scheduler_ptr;
140  };
141 }
resumef::timer_manager
定时器管理器。
Definition: timer.h:84
resumef::scheduler_t
协程调度器。
Definition: scheduler.h:10
resumef::local_scheduler_t::~local_scheduler_t
~local_scheduler_t()
如果当前线程绑定的调度器由local_scheduler_t所创建,则会销毁调度器,并解绑线程。
resumef::scheduler_t::empty
bool empty() const
判断所有协程是否运行完毕。
Definition: scheduler.h:75
resumef::scheduler_t::run_one_batch
void run_one_batch()
运行一批准备妥当的协程。
resumef::scheduler_t::run_until_notask
void run_until_notask()
循环运行所有的协程,直到所有协程都运行完成。
resumef::state_base_t
state基类,state用于在协程的promise和future之间共享数据。
Definition: state.h:8
resumef::scheduler_t::timer
timer_manager * timer() const noexcept
获得定时管理器。
Definition: scheduler.h:84
resumef::counted_ptr
专用与state的智能计数指针,通过管理state内嵌的引用计数来管理state的生存期。
Definition: counted_ptr.h:9
resumef::spinlock
一个自旋锁实现。
Definition: spinlock.h:14
resumef::local_scheduler_t
创建一个线程相关的调度器。
Definition: scheduler.h:117
resumef::local_scheduler_t::local_scheduler_t
local_scheduler_t()
尽可能的创建一个线程相关的调度器。
resumef::scheduler_t::operator+
void operator+(_Ty &&coro)
将一个协程加入到调度器里开始运行。
Definition: scheduler.h:60
resumef::task_t
协程任务类。
Definition: rf_task.h:34