Skip to content

Commit 3930f0d

Browse files
Opt, TaskAwaiter统一到协程头文件从TaskRunner.h --> Coroutine.h
1 parent 0879a53 commit 3930f0d

File tree

2 files changed

+115
-116
lines changed

2 files changed

+115
-116
lines changed

include/YY/Base/Threading/Coroutine.h

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <coroutine>
66

77
#include <YY/Base/Containers/Optional.h>
8+
#include <YY/Base/Sync/Interlocked.h>
89

910
#pragma pack(push, __YY_PACKING)
1011

@@ -77,6 +78,120 @@ namespace YY
7778
{
7879
using promise_type = Promise<_ReturnType, Coroutine>;
7980
};
81+
82+
template<typename ResumeType_>
83+
class TaskAwaiter
84+
{
85+
public:
86+
using ResumeType = ResumeType_;
87+
88+
class RefData
89+
{
90+
public:
91+
// 协程句柄
92+
intptr_t hCoroutineHandle = 0;
93+
94+
~RefData()
95+
{
96+
if (hCoroutineHandle && hCoroutineHandle != (intptr_t)-1)
97+
{
98+
std::coroutine_handle<>::from_address((void*)hCoroutineHandle).destroy();
99+
}
100+
}
101+
102+
virtual uint32_t __YYAPI AddRef() noexcept = 0;
103+
104+
virtual uint32_t __YYAPI Release() noexcept = 0;
105+
106+
virtual ResumeType_ __YYAPI Resume() noexcept = 0;
107+
};
108+
109+
private:
110+
RefPtr<RefData> pAwaiterData;
111+
112+
public:
113+
TaskAwaiter(_In_ RefPtr<RefData> _pAwaiterData)
114+
: pAwaiterData(std::move(_pAwaiterData))
115+
{
116+
}
117+
118+
TaskAwaiter(TaskAwaiter&&) = default;
119+
120+
TaskAwaiter(const TaskAwaiter&) = delete;
121+
TaskAwaiter& operator=(const TaskAwaiter&) = delete;
122+
123+
bool await_ready() noexcept
124+
{
125+
return pAwaiterData->hCoroutineHandle == /*hReadyHandle*/ (intptr_t)-1;
126+
}
127+
128+
bool await_suspend(std::coroutine_handle<> _hHandle) noexcept
129+
{
130+
return YY::Base::Sync::CompareExchange(&pAwaiterData->hCoroutineHandle, (intptr_t)_hHandle.address(), 0) == 0;
131+
}
132+
133+
ResumeType await_resume() noexcept
134+
{
135+
return pAwaiterData->Resume();
136+
}
137+
};
138+
139+
template<>
140+
class TaskAwaiter<void>
141+
{
142+
public:
143+
using ResumeType = void;
144+
145+
class RefData
146+
{
147+
public:
148+
// 协程句柄
149+
intptr_t hCoroutineHandle = 0;
150+
151+
~RefData()
152+
{
153+
if (hCoroutineHandle && hCoroutineHandle != (intptr_t)-1)
154+
{
155+
std::coroutine_handle<>::from_address((void*)hCoroutineHandle).destroy();
156+
}
157+
}
158+
159+
virtual uint32_t __YYAPI AddRef() noexcept = 0;
160+
161+
virtual uint32_t __YYAPI Release() noexcept = 0;
162+
};
163+
164+
private:
165+
RefPtr<RefData> pAwaiterData;
166+
167+
public:
168+
TaskAwaiter(_In_ RefPtr<RefData> _pAwaiterData)
169+
: pAwaiterData(std::move(_pAwaiterData))
170+
{
171+
}
172+
173+
TaskAwaiter(TaskAwaiter&&) = default;
174+
175+
TaskAwaiter(const TaskAwaiter&) = delete;
176+
TaskAwaiter& operator=(const TaskAwaiter&) = delete;
177+
178+
TaskAwaiter& operator=(TaskAwaiter&&) = default;
179+
180+
bool await_ready() noexcept
181+
{
182+
return pAwaiterData->hCoroutineHandle == /*hReadyHandle*/ (intptr_t)-1;
183+
}
184+
185+
bool await_suspend(std::coroutine_handle<> _hHandle) noexcept
186+
{
187+
return YY::Base::Sync::CompareExchange(&pAwaiterData->hCoroutineHandle, (intptr_t)_hHandle.address(), 0) == 0;
188+
}
189+
190+
void await_resume() noexcept
191+
{
192+
// 因为没有返回值,所以空函数占坑
193+
}
194+
};
80195
}
81196
}
82197

include/YY/Base/Threading/TaskRunner.h

Lines changed: 0 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -166,122 +166,6 @@ namespace YY
166166
};
167167
#endif
168168

169-
#if defined(_HAS_CXX20) && _HAS_CXX20
170-
template<typename ResumeType_>
171-
class TaskAwaiter
172-
{
173-
public:
174-
using ResumeType = ResumeType_;
175-
176-
class RefData
177-
{
178-
public:
179-
// 协程句柄
180-
intptr_t hCoroutineHandle = 0;
181-
182-
~RefData()
183-
{
184-
if (hCoroutineHandle && hCoroutineHandle != (intptr_t)-1)
185-
{
186-
std::coroutine_handle<>::from_address((void*)hCoroutineHandle).destroy();
187-
}
188-
}
189-
190-
virtual uint32_t __YYAPI AddRef() noexcept = 0;
191-
192-
virtual uint32_t __YYAPI Release() noexcept = 0;
193-
194-
virtual ResumeType_ __YYAPI Resume() noexcept = 0;
195-
};
196-
197-
private:
198-
RefPtr<RefData> pAwaiterData;
199-
200-
public:
201-
TaskAwaiter(_In_ RefPtr<RefData> _pAwaiterData)
202-
: pAwaiterData(std::move(_pAwaiterData))
203-
{
204-
}
205-
206-
TaskAwaiter(TaskAwaiter&&) = default;
207-
208-
TaskAwaiter(const TaskAwaiter&) = delete;
209-
TaskAwaiter& operator=(const TaskAwaiter&) = delete;
210-
211-
bool await_ready() noexcept
212-
{
213-
return pAwaiterData->hCoroutineHandle == /*hReadyHandle*/ (intptr_t)-1;
214-
}
215-
216-
bool await_suspend(std::coroutine_handle<> _hHandle) noexcept
217-
{
218-
return YY::Base::Sync::CompareExchange(&pAwaiterData->hCoroutineHandle, (intptr_t)_hHandle.address(), 0) == 0;
219-
}
220-
221-
ResumeType await_resume() noexcept
222-
{
223-
return pAwaiterData->Resume();
224-
}
225-
};
226-
227-
template<>
228-
class TaskAwaiter<void>
229-
{
230-
public:
231-
using ResumeType = void;
232-
233-
class RefData
234-
{
235-
public:
236-
// 协程句柄
237-
intptr_t hCoroutineHandle = 0;
238-
239-
~RefData()
240-
{
241-
if (hCoroutineHandle && hCoroutineHandle != (intptr_t)-1)
242-
{
243-
std::coroutine_handle<>::from_address((void*)hCoroutineHandle).destroy();
244-
}
245-
}
246-
247-
virtual uint32_t __YYAPI AddRef() noexcept = 0;
248-
249-
virtual uint32_t __YYAPI Release() noexcept = 0;
250-
};
251-
252-
private:
253-
RefPtr<RefData> pAwaiterData;
254-
255-
public:
256-
TaskAwaiter(_In_ RefPtr<RefData> _pAwaiterData)
257-
: pAwaiterData(std::move(_pAwaiterData))
258-
{
259-
}
260-
261-
TaskAwaiter(TaskAwaiter&&) = default;
262-
263-
TaskAwaiter(const TaskAwaiter&) = delete;
264-
TaskAwaiter& operator=(const TaskAwaiter&) = delete;
265-
266-
TaskAwaiter& operator=(TaskAwaiter&&) = default;
267-
268-
bool await_ready() noexcept
269-
{
270-
return pAwaiterData->hCoroutineHandle == /*hReadyHandle*/ (intptr_t)-1;
271-
}
272-
273-
bool await_suspend(std::coroutine_handle<> _hHandle) noexcept
274-
{
275-
return YY::Base::Sync::CompareExchange(&pAwaiterData->hCoroutineHandle, (intptr_t)_hHandle.address(), 0) == 0;
276-
}
277-
278-
void await_resume() noexcept
279-
{
280-
// 因为没有返回值,所以空函数占坑
281-
}
282-
};
283-
#endif // defined(_HAS_CXX20) && _HAS_CXX20
284-
285169
class TaskRunnerDispatch;
286170

287171
// 通用任务执行器的抽象层

0 commit comments

Comments
 (0)