Skip to content

Commit 255de6f

Browse files
Bug, 解决Wakeup时机滞后,可能导致Wait失败
1 parent 06c82af commit 255de6f

File tree

5 files changed

+58
-34
lines changed

5 files changed

+58
-34
lines changed

include/YY/Base/Threading/TaskRunner.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ namespace YY
6565

6666
void __YYAPI operator()()
6767
{
68-
Wakeup(RunTask());
68+
RunTask();
6969
}
7070

7171
/// <summary>

src/YY/Base/Threading/ParallelTaskRunnerImpl.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,7 @@ namespace YY
225225

226226
if (TaskRunnerFlags.bStopWakeup)
227227
{
228+
_pTask->Wakeup(YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED));
228229
return YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
229230
}
230231

src/YY/Base/Threading/SequencedTaskRunnerImpl.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ namespace YY
6868
{
6969
if (_fFlags & StopWakeupRaw)
7070
{
71+
_pTask->Wakeup(YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED));
7172
return YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
7273
}
7374
else if (_fFlags & (1 << LockedQueuePushBitIndex))

src/YY/Base/Threading/TaskRunner.cpp

Lines changed: 43 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,18 @@ namespace YY
3434
if (IsCanceled())
3535
return YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
3636

37+
HRESULT _hr = S_OK;
3738
try
3839
{
3940
pfnTaskCallback();
40-
return S_OK;
4141
}
4242
catch (const YY::Base::OperationCanceledException& _Exception)
4343
{
44-
return YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
44+
_hr = YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
4545
}
46+
47+
Wakeup(_hr);
48+
return _hr;
4649
}
4750

4851
HRESULT __YYAPI Timer::RunTask()
@@ -52,20 +55,25 @@ namespace YY
5255

5356
if (uInterval.GetTotalMilliseconds() <= 0)
5457
{
58+
return TaskEntry::RunTask();
59+
}
60+
else
61+
{
62+
HRESULT _hr = S_OK;
63+
bool _bRet = false;
64+
auto _uExpire = TickCount::GetNow() + uInterval;
5565
try
5666
{
57-
pfnTaskCallback();
58-
return S_OK;
67+
_bRet = pfnTimerCallback();
5968
}
6069
catch (const YY::Base::OperationCanceledException& _Exception)
6170
{
62-
return YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
71+
_hr = YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
6372
}
64-
}
65-
else
66-
{
67-
auto _uExpire = TickCount::GetNow() + uInterval;
68-
if (pfnTimerCallback())
73+
74+
Wakeup(_hr);
75+
76+
if (_bRet)
6977
{
7078
auto _pOwnerTaskRunner = pOwnerTaskRunnerWeak.Get();
7179
// 任务被取消?
@@ -75,7 +83,8 @@ namespace YY
7583
uExpire = _uExpire;
7684
return _pOwnerTaskRunner->SetTimerInternal(this);
7785
}
78-
return S_OK;
86+
87+
return _hr;
7988
}
8089
}
8190

@@ -311,35 +320,30 @@ namespace YY
311320
HRESULT __YYAPI TaskRunner::SetTimerInternal(RefPtr<Timer> _pTask)
312321
{
313322
_pTask->pOwnerTaskRunnerWeak = this;
323+
_pTask->hr = E_PENDING;
314324

315325
if (_pTask->IsCanceled())
316326
{
327+
_pTask->Wakeup(YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED));
317328
return YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
318329
}
319-
320-
if (_pTask->uExpire.GetTicks() == 0)
321-
return PostTaskInternal(std::move(_pTask));
322-
323-
// 现在的时间已经比过期时间大,那么立即触发任务,降低延迟
324-
auto _uCurrent = TickCount::GetNow();
325-
if (_pTask->uExpire <= _uCurrent)
330+
else if (_pTask->uExpire.GetTicks() == 0 || (_pTask->uExpire - YY::TickCount::GetNow()).GetTotalMilliseconds() <= 0)
326331
{
327-
_pTask->uExpire = _uCurrent;
328332
return PostTaskInternal(std::move(_pTask));
329333
}
330-
else
331-
{
332-
TaskRunnerDispatch::Get()->SetTimerInternal(std::move(_pTask));
333-
return S_OK;
334-
}
334+
335+
TaskRunnerDispatch::Get()->SetTimerInternal(std::move(_pTask));
336+
return S_OK;
335337
}
336338

337339
HRESULT __YYAPI TaskRunner::SetWaitInternal(RefPtr<Wait> _pTask)
338340
{
339341
_pTask->pOwnerTaskRunnerWeak = this;
342+
_pTask->hr = E_PENDING;
340343

341344
if (_pTask->IsCanceled())
342345
{
346+
_pTask->Wakeup(YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED));
343347
return YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
344348
}
345349

@@ -461,21 +465,27 @@ namespace YY
461465
if (IsCanceled())
462466
return YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
463467

468+
HRESULT _hr = S_OK;
469+
bool _bRet = false;
464470
try
465471
{
466-
if (pfnWaitTaskCallback(uWaitResult))
467-
{
468-
if (auto _pOwnerTaskRunner = pOwnerTaskRunnerWeak.Get())
469-
{
470-
_pOwnerTaskRunner->SetWaitInternal(this);
471-
}
472-
}
473-
return S_OK;
472+
_bRet = pfnWaitTaskCallback(uWaitResult);
474473
}
475474
catch (const YY::Base::OperationCanceledException& _Exception)
476475
{
477-
return HRESULT_From_LSTATUS(ERROR_CANCELLED);
476+
_hr = HRESULT_From_LSTATUS(ERROR_CANCELLED);
478477
}
478+
479+
Wakeup(_hr);
480+
if (_bRet)
481+
{
482+
if (auto _pOwnerTaskRunner = pOwnerTaskRunnerWeak.Get())
483+
{
484+
_pOwnerTaskRunner->SetWaitInternal(this);
485+
}
486+
}
487+
488+
return _hr;
479489
}
480490

481491
void __YYAPI Wait::Cancel()

src/YY/Base/Threading/ThreadTaskRunnerImpl.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,8 +255,10 @@ namespace YY
255255

256256
HRESULT __YYAPI ThreadTaskRunnerImpl::PostTaskInternal(RefPtr<TaskEntry> _pTask)
257257
{
258+
_pTask->hr = E_PENDING;
258259
if (bStopWakeup)
259260
{
261+
_pTask->Wakeup(YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED));
260262
return YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
261263
}
262264

@@ -285,11 +287,17 @@ namespace YY
285287
HRESULT __YYAPI ThreadTaskRunnerImpl::SetTimerInternal(RefPtr<Timer> _pTask)
286288
{
287289
_pTask->pOwnerTaskRunnerWeak = this;
290+
_pTask->hr = E_PENDING;
288291

289292
if (_pTask->IsCanceled())
290293
{
294+
_pTask->Wakeup(YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED));
291295
return YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
292296
}
297+
else if (_pTask->uExpire.GetTicks() == 0 || (_pTask->uExpire - YY::TickCount::GetNow()).GetTotalMilliseconds() <= 0)
298+
{
299+
return PostTaskInternal(RefPtr<TaskEntry>(std::move(_pTask)));
300+
}
293301

294302
if (uThreadId != GetCurrentThreadId())
295303
{
@@ -309,8 +317,12 @@ namespace YY
309317
if (_pTask == nullptr || _pTask->hHandle == NULL)
310318
return E_INVALIDARG;
311319

320+
_pTask->hr = E_PENDING;
312321
if (_pTask->IsCanceled())
322+
{
323+
_pTask->Wakeup(YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED));
313324
return YY::Base::HRESULT_From_LSTATUS(ERROR_CANCELLED);
325+
}
314326

315327
if (_pTask->hThreadPoolWait)
316328
{

0 commit comments

Comments
 (0)