17 #ifndef CYBER_CROUTINE_CROUTINE_H_ 18 #define CYBER_CROUTINE_CROUTINE_H_ 48 static void SetMainContext(
const std::shared_ptr<RoutineContext> &context);
49 static CRoutine *GetCurrentRoutine();
50 static char **GetMainStack();
71 void Sleep(
const Duration &sleep_duration);
78 void set_id(uint64_t
id);
80 const std::string &name()
const;
81 void set_name(
const std::string &name);
83 int processor_id()
const;
84 void set_processor_id(
int processor_id);
86 uint32_t priority()
const;
87 void set_priority(uint32_t priority);
89 std::chrono::steady_clock::time_point wake_time()
const;
92 group_name_ = group_name;
102 std::chrono::steady_clock::time_point wake_time_ =
103 std::chrono::steady_clock::now();
108 std::shared_ptr<RoutineContext> context_;
110 std::atomic_flag lock_ = ATOMIC_FLAG_INIT;
111 std::atomic_flag updated_ = ATOMIC_FLAG_INIT;
113 bool force_stop_ =
false;
115 int processor_id_ = -1;
116 uint32_t priority_ = 0;
119 std::string group_name_;
121 static thread_local
CRoutine *current_routine_;
122 static thread_local
char *main_stack_;
126 auto routine = GetCurrentRoutine();
127 routine->set_state(state);
128 SwapContext(GetCurrentRoutine()->GetStack(), GetMainStack());
132 SwapContext(GetCurrentRoutine()->GetStack(), GetMainStack());
158 wake_time_ = std::chrono::steady_clock::now() + sleep_duration;
173 processor_id_ = processor_id;
179 std::chrono::steady_clock::now() > wake_time_) {
185 if (!updated_.test_and_set(std::memory_order_release)) {
198 return !lock_.test_and_set(std::memory_order_acquire);
202 return lock_.clear(std::memory_order_release);
206 updated_.clear(std::memory_order_release);
213 #endif // CYBER_CROUTINE_CROUTINE_H_ char ** GetStack()
Definition: croutine.h:141
void set_id(uint64_t id)
Definition: croutine.h:164
uint64_t id() const
Definition: croutine.h:162
void(* func)(void *)
Definition: routine_context.h:41
void Run()
Definition: croutine.h:143
Definition: croutine.h:40
int processor_id() const
Definition: croutine.h:170
RoutineState state() const
Definition: croutine.h:147
void SetUpdateFlag()
Definition: croutine.h:205
void Sleep(const Duration &sleep_duration)
Definition: croutine.h:157
void set_name(const std::string &name)
Definition: croutine.h:168
PlanningContext is the runtime context in planning. It is persistent across multiple frames...
Definition: atomic_hash_map.h:25
const std::string & group_name()
Definition: croutine.h:95
static CRoutine * GetCurrentRoutine()
Definition: croutine.h:135
std::function< void()> RoutineFunc
Definition: croutine.h:35
void set_group_name(const std::string &group_name)
Definition: croutine.h:91
void HangUp()
Definition: croutine.h:155
std::chrono::steady_clock::time_point wake_time() const
Definition: croutine.h:149
bool Acquire()
Definition: croutine.h:197
void set_priority(uint32_t priority)
Definition: croutine.h:195
RoutineContext * GetContext()
Definition: croutine.h:139
static void Yield()
Definition: croutine.h:131
void set_state(const RoutineState &state)
Definition: croutine.h:145
Definition: routine_context.h:42
RoutineState
Definition: croutine.h:38
void set_processor_id(int processor_id)
Definition: croutine.h:172
void Release()
Definition: croutine.h:201
static char ** GetMainStack()
Definition: croutine.h:137
std::chrono::microseconds Duration
Definition: croutine.h:36
void SwapContext(char **src_sp, char **dest_sp)
Definition: routine_context.h:53
void Wake()
Definition: croutine.h:153
uint32_t priority() const
Definition: croutine.h:193
RoutineState UpdateState()
Definition: croutine.h:176
const std::string & name() const
Definition: croutine.h:166