@@ -41,19 +41,19 @@ void BlockObject::CoBlockWait()
4141 Task* tk = g_Scheduler.GetLocalInfo ().current_task ;
4242 tk->block_ = this ;
4343 tk->state_ = TaskState::sys_block;
44- tk->block_timeout_ = std::chrono::nanoseconds ::zero ();
44+ tk->block_timeout_ = MininumTimeDurationType ::zero ();
4545 tk->is_block_timeout_ = false ;
4646 ++ tk->block_sequence_ ;
4747 DebugPrint (dbg_syncblock, " wait to switch. task(%s)" , tk->DebugInfo ());
4848 g_Scheduler.CoYield ();
4949}
5050
51- bool BlockObject::CoBlockWaitTimed (std::chrono::nanoseconds timeo)
51+ bool BlockObject::CoBlockWaitTimed (MininumTimeDurationType timeo)
5252{
5353 auto begin = std::chrono::high_resolution_clock::now ();
5454 if (!g_Scheduler.IsCoroutine ()) {
5555 while (!TryBlockWait () &&
56- std::chrono::duration_cast<std::chrono::nanoseconds >
56+ std::chrono::duration_cast<MininumTimeDurationType >
5757 (std::chrono::high_resolution_clock::now () - begin) < timeo)
5858 usleep (10 * 1000 );
5959 return false ;
@@ -104,10 +104,11 @@ bool BlockObject::Wakeup()
104104 DebugPrint (dbg_syncblock, " wakeup to %lu." , (long unsigned )wakeup_);
105105 return true ;
106106 }
107+ lock.unlock ();
107108
108109 tk->block_ = nullptr ;
109- g_Scheduler.AddTaskRunnable (tk);
110110 DebugPrint (dbg_syncblock, " wakeup task(%s)." , tk->DebugInfo ());
111+ g_Scheduler.AddTaskRunnable (tk);
111112 return true ;
112113}
113114void BlockObject::CancelWait (Task* tk, uint32_t block_sequence)
@@ -128,11 +129,12 @@ void BlockObject::CancelWait(Task* tk, uint32_t block_sequence)
128129 DebugPrint (dbg_syncblock, " cancelwait task(%s) erase failed." , tk->DebugInfo ());
129130 return ;
130131 }
132+ lock.unlock ();
131133
132134 tk->block_ = nullptr ;
133135 tk->is_block_timeout_ = true ;
134- g_Scheduler.AddTaskRunnable (tk);
135136 DebugPrint (dbg_syncblock, " cancelwait task(%s)." , tk->DebugInfo ());
137+ g_Scheduler.AddTaskRunnable (tk);
136138}
137139
138140bool BlockObject::IsWakeup ()
@@ -152,7 +154,7 @@ bool BlockObject::AddWaitTask(Task* tk)
152154 wait_queue_.push (tk);
153155
154156 // 带超时的, 增加定时器
155- if (std::chrono::nanoseconds ::zero () != tk->block_timeout_ ) {
157+ if (MininumTimeDurationType ::zero () != tk->block_timeout_ ) {
156158 uint32_t seq = tk->block_sequence_ ;
157159 tk->IncrementRef ();
158160 lock.unlock (); // sequence记录完成, task引用计数增加, 可以解锁了
0 commit comments