Skip to main content

qubit_thread_pool/delayed/
delayed_task_state.rs

1/*******************************************************************************
2 *
3 *    Copyright (c) 2025 - 2026 Haixing Hu.
4 *
5 *    SPDX-License-Identifier: Apache-2.0
6 *
7 *    Licensed under the Apache License, Version 2.0.
8 *
9 ******************************************************************************/
10use std::sync::atomic::{
11    AtomicU8,
12    Ordering,
13};
14
15/// Atomic task-state transitions for delayed task scheduling.
16pub struct DelayedTaskState;
17
18impl DelayedTaskState {
19    /// Task has been accepted but has not started.
20    pub const PENDING: u8 = 0;
21    /// Task has started and can no longer be cancelled.
22    pub const STARTED: u8 = 1;
23    /// Task was cancelled before it started.
24    pub const CANCELLED: u8 = 2;
25
26    /// Attempts to mark a task state as cancelled.
27    pub fn cancel(task_state: &AtomicU8) -> bool {
28        task_state
29            .compare_exchange(
30                Self::PENDING,
31                Self::CANCELLED,
32                Ordering::AcqRel,
33                Ordering::Acquire,
34            )
35            .is_ok()
36    }
37
38    /// Attempts to mark a task state as started.
39    pub fn start(task_state: &AtomicU8) -> bool {
40        task_state
41            .compare_exchange(
42                Self::PENDING,
43                Self::STARTED,
44                Ordering::AcqRel,
45                Ordering::Acquire,
46            )
47            .is_ok()
48    }
49
50    /// Returns whether a task state has been cancelled.
51    pub fn is_cancelled(task_state: &AtomicU8) -> bool {
52        task_state.load(Ordering::Acquire) == Self::CANCELLED
53    }
54}
55
56pub const TASK_PENDING: u8 = DelayedTaskState::PENDING;
57pub const TASK_CANCELLED: u8 = DelayedTaskState::CANCELLED;
58
59/// Attempts to mark a task state as cancelled.
60pub fn cancel_task_state(task_state: &AtomicU8) -> bool {
61    DelayedTaskState::cancel(task_state)
62}
63
64/// Attempts to mark a task state as started.
65pub fn start_task_state(task_state: &AtomicU8) -> bool {
66    DelayedTaskState::start(task_state)
67}
68
69/// Returns whether a task state has been cancelled.
70pub fn is_task_cancelled(task_state: &AtomicU8) -> bool {
71    DelayedTaskState::is_cancelled(task_state)
72}