libcopp 2.3.1
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
task_impl.h
Go to the documentation of this file.
1// Copyright 2023 owent
2
3#pragma once
4
5#include <libcopp/utils/config/libcopp_build_features.h>
6
8
10
15
17
18// clang-format off
19#include <libcopp/utils/config/stl_include_prefix.h> // NOLINT(build/include_order)
20// clang-format on
21#include <stdint.h>
22#include <list>
23#include <memory>
24// clang-format off
25#include <libcopp/utils/config/stl_include_suffix.h> // NOLINT(build/include_order)
26// clang-format on
27
28LIBCOPP_COTASK_NAMESPACE_BEGIN
39
40namespace impl {
41
43 public:
44 using id_type = LIBCOPP_COPP_NAMESPACE_ID::util::uint64_id_allocator::value_type;
45 using id_allocator_type = LIBCOPP_COPP_NAMESPACE_ID::util::uint64_id_allocator;
46
47 // Compability with libcopp-1.x
48 using id_t = id_type;
50
51 protected:
53
54 // Compability with libcopp-1.x
56
57 struct LIBCOPP_COTASK_API ext_coroutine_flag_t {
58 enum type {
59 EN_ECFT_UNKNOWN = 0,
60 EN_ECFT_COTASK = 0x0100,
61 EN_ECFT_MASK = 0xFF00,
62 };
63 };
64
65 private:
66 task_impl(const task_impl &) = delete;
67 task_impl &operator=(const task_impl &) = delete;
68
69 task_impl(const task_impl &&) = delete;
70 task_impl &operator=(const task_impl &&) = delete;
71
72 public:
73 LIBCOPP_COTASK_API task_impl();
74 LIBCOPP_COTASK_API virtual ~task_impl() = 0;
75
76 LIBCOPP_UTIL_FORCEINLINE id_type get_id() const LIBCOPP_MACRO_NOEXCEPT { return id_; }
77
82 LIBCOPP_UTIL_FORCEINLINE EN_TASK_STATUS get_status() const LIBCOPP_MACRO_NOEXCEPT {
83 return static_cast<EN_TASK_STATUS>(status_.load(LIBCOPP_COPP_NAMESPACE_ID::util::lock::memory_order_acquire));
84 }
85
86 LIBCOPP_COTASK_API virtual bool is_canceled() const LIBCOPP_MACRO_NOEXCEPT;
87 LIBCOPP_COTASK_API virtual bool is_completed() const LIBCOPP_MACRO_NOEXCEPT;
88 LIBCOPP_COTASK_API virtual bool is_faulted() const LIBCOPP_MACRO_NOEXCEPT;
89 LIBCOPP_COTASK_API virtual bool is_timeout() const LIBCOPP_MACRO_NOEXCEPT;
97 LIBCOPP_COTASK_API bool is_exiting() const LIBCOPP_MACRO_NOEXCEPT;
98
99 public:
100 LIBCOPP_COTASK_API virtual int get_ret_code() const = 0;
101
102 virtual int start(void *priv_data, EN_TASK_STATUS expected_status = EN_TS_CREATED) = 0;
103 virtual int resume(void *priv_data, EN_TASK_STATUS expected_status = EN_TS_WAITING) = 0;
104 virtual int yield(void **priv_data) = 0;
105 virtual int cancel(void *priv_data) = 0;
106 virtual int kill(enum EN_TASK_STATUS status, void *priv_data) = 0;
107 LIBCOPP_UTIL_FORCEINLINE int kill(void *priv_data) { return kill(EN_TS_KILLED, priv_data); }
108
109 LIBCOPP_UTIL_FORCEINLINE int start() { return start(nullptr); }
110 LIBCOPP_UTIL_FORCEINLINE int resume() { return resume(nullptr); }
111 LIBCOPP_UTIL_FORCEINLINE int yield() { return yield(nullptr); }
112 LIBCOPP_UTIL_FORCEINLINE int cancel() { return cancel(nullptr); }
113 LIBCOPP_UTIL_FORCEINLINE int kill(enum EN_TASK_STATUS status) { return kill(status, nullptr); }
114 LIBCOPP_UTIL_FORCEINLINE int kill() { return kill(nullptr); }
115
116 LIBCOPP_COTASK_API virtual int on_finished();
117
118#if defined(LIBCOPP_MACRO_ENABLE_WIN_FIBER) && LIBCOPP_MACRO_ENABLE_WIN_FIBER
119 virtual bool is_fiber() const LIBCOPP_MACRO_NOEXCEPT = 0;
120#endif
121
126 static LIBCOPP_COTASK_API task_impl *this_task();
127
134 LIBCOPP_UTIL_FORCEINLINE action_ptr_type get_raw_action() const LIBCOPP_MACRO_NOEXCEPT { return action_; }
135
136 protected:
137 LIBCOPP_COTASK_API void _set_action(action_ptr_type action);
138 LIBCOPP_COTASK_API action_ptr_type _get_action();
139
140 LIBCOPP_COTASK_API bool _cas_status(EN_TASK_STATUS &expected, EN_TASK_STATUS desired);
141
142#if defined(LIBCOPP_MACRO_ENABLE_STD_EXCEPTION_PTR) && LIBCOPP_MACRO_ENABLE_STD_EXCEPTION_PTR
143 LIBCOPP_COTASK_API int _notify_finished(std::list<std::exception_ptr> &unhandled, void *priv_data);
144#else
145 LIBCOPP_COTASK_API int _notify_finished(void *priv_data);
146#endif
147
148 private:
151
152 protected:
154
155 private:
156#if LIBCOPP_MACRO_ENABLE_MULTI_THREAD
157 LIBCOPP_COPP_NAMESPACE_ID::util::lock::atomic_int_type<uint32_t> status_;
158#else
159 LIBCOPP_COPP_NAMESPACE_ID::util::lock::atomic_int_type<
160 LIBCOPP_COPP_NAMESPACE_ID::util::lock::unsafe_int_type<uint32_t> >
162#endif
163};
164} // namespace impl
165LIBCOPP_COTASK_NAMESPACE_END
atomic wrapper fo integers Licensed under the MIT licenses.
id_allocator_type id_allocator_t
Definition task_impl.h:49
LIBCOPP_UTIL_FORCEINLINE int kill(void *priv_data)
Definition task_impl.h:107
LIBCOPP_UTIL_FORCEINLINE int cancel()
Definition task_impl.h:112
LIBCOPP_COPP_NAMESPACE_ID::util::lock::atomic_int_type< LIBCOPP_COPP_NAMESPACE_ID::util::lock::unsafe_int_type< uint32_t > > status_
Definition task_impl.h:161
LIBCOPP_UTIL_FORCEINLINE EN_TASK_STATUS get_status() const LIBCOPP_MACRO_NOEXCEPT
Definition task_impl.h:82
LIBCOPP_COPP_NAMESPACE_ID::util::uint64_id_allocator id_allocator_type
Definition task_impl.h:45
LIBCOPP_UTIL_FORCEINLINE int yield()
Definition task_impl.h:111
task_impl(const task_impl &)=delete
LIBCOPP_UTIL_FORCEINLINE id_type get_id() const LIBCOPP_MACRO_NOEXCEPT
Definition task_impl.h:76
task_impl & operator=(const task_impl &)=delete
task_impl(const task_impl &&)=delete
LIBCOPP_UTIL_FORCEINLINE int kill(enum EN_TASK_STATUS status)
Definition task_impl.h:113
LIBCOPP_COPP_NAMESPACE_ID::util::uint64_id_allocator::value_type id_type
Definition task_impl.h:44
LIBCOPP_UTIL_FORCEINLINE action_ptr_type get_raw_action() const LIBCOPP_MACRO_NOEXCEPT
get raw action pointer
Definition task_impl.h:134
LIBCOPP_UTIL_FORCEINLINE int start()
Definition task_impl.h:109
void * finish_priv_data_
Definition task_impl.h:153
LIBCOPP_UTIL_FORCEINLINE int resume()
Definition task_impl.h:110
LIBCOPP_UTIL_FORCEINLINE int kill()
Definition task_impl.h:114
action_ptr_type action_
Definition task_impl.h:149
task_impl & operator=(const task_impl &&)=delete
#define LIBCOPP_UTIL_SYMBOL_VISIBLE
#define LIBCOPP_UTIL_FORCEINLINE
锁管理器 Licensed under the MIT licenses.
自旋锁 Licensed under the MIT licenses.
EN_TASK_STATUS
Definition task_impl.h:29
@ EN_TS_DONE
Definition task_impl.h:34
@ EN_TS_CREATED
Definition task_impl.h:31
@ EN_TS_TIMEOUT
Definition task_impl.h:37
@ EN_TS_KILLED
Definition task_impl.h:36
@ EN_TS_INVALID
Definition task_impl.h:30
@ EN_TS_WAITING
Definition task_impl.h:33
@ EN_TS_RUNNING
Definition task_impl.h:32
@ EN_TS_CANCELED
Definition task_impl.h:35