Skip to content

Commit f7c6990

Browse files
authored
Merge pull request #46 from gamife/fix/finish_task
fix: FinishTask event should after AppendTaskHandle
2 parents 1fd9d17 + daeab54 commit f7c6990

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

src/timer/task.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ pub struct TaskContext {
473473
pub runtime_kind: RuntimeKind,
474474
/// Event Sender for Timer Wheel Core.
475475
pub(crate) timer_event_sender: Option<TimerEventSender>,
476+
pub(crate) could_send_finish_event: Option<AsyncReceiver<()>>,
476477
}
477478

478479
impl TaskContext {
@@ -496,6 +497,15 @@ impl TaskContext {
496497
self
497498
}
498499

500+
#[inline(always)]
501+
pub(crate) fn could_send_finish_event(
502+
&mut self,
503+
could_send_finish_event: AsyncReceiver<()>,
504+
) -> &mut Self {
505+
self.could_send_finish_event = Some(could_send_finish_event);
506+
self
507+
}
508+
499509
#[inline(always)]
500510
/// Get hook functions that may be used in the future.
501511
pub fn then_fn(&mut self, then_fn: fn()) -> &mut Self {
@@ -512,6 +522,10 @@ impl TaskContext {
512522
/// Send a task-Finish signal to EventHandle.
513523
pub async fn finish_task(self, finish_output: Option<FinishOutput>) {
514524
if let Some(timer_event_sender) = self.timer_event_sender {
525+
// Wait for the TimerEvent::AppendTaskHandle event to be sent.
526+
if let Some(ref wait) = self.could_send_finish_event {
527+
let _ = wait.recv().await;
528+
}
515529
timer_event_sender
516530
.send(TimerEvent::FinishTask(FinishTaskBody {
517531
task_id: self.task_id,

src/timer/timer_core.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,11 +323,14 @@ impl Timer {
323323
}
324324
}
325325

326+
let (s, r) = channel::bounded::<()>(1);
327+
326328
let mut task_context = TaskContext::default();
327329
task_context
328330
.task_id(task_id)
329331
.record_id(record_id)
330332
.timer_event_sender(self.timer_event_sender.clone())
333+
.could_send_finish_event(r)
331334
.runtime_kind(self.shared_header.runtime_instance.kind);
332335

333336
let task_handler_box = self.routine_exec(&*(task.routine.0), task_context);
@@ -341,6 +344,8 @@ impl Timer {
341344
.spawn(task_handler_box);
342345

343346
self.send_timer_event(task_id, tmp_task_handler_box).await;
347+
// The TimerEvent::AppendTaskHandle event should always be sent before The TimerEvent::FinishTask event.
348+
let _ = s.try_send(());
344349

345350
let task_valid = task.down_count_and_set_vaild();
346351
if !task_valid {

0 commit comments

Comments
 (0)