tawasuyu

tawasuyu/brahman

Rust 463TOML 180Markdown 49JSON 176353 Definitions

⎇ 2523652e2250835d1521b0c3f3fc8374f6f1ae15 renaser/kernel/src/async_system/task.rs Rust · 45 lines · 1.5 KB History Who touched what raw

feat: integra renaser (kernel SASOS bare-metal) al monorepo e2272c0ed · sergio ·

1// =============================================================================
2//  renaser :: async_system/task.rs — Fase 3 :: la unidad de trabajo asincrono
3// =============================================================================
4
5use alloc::boxed::Box;
6use core::future::Future;
7use core::pin::Pin;
8use core::sync::atomic::{AtomicU64, Ordering};
9use core::task::{Context, Poll};
10
11/// Identificador unico de una tarea. Autoincremental y atomico: dos tareas
12/// jamas comparten identidad.
13#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
14pub struct TaskId(u64);
15
16impl TaskId {
17    /// Acuña un identificador nuevo, distinto de todos los anteriores.
18    fn nuevo() -> TaskId {
19        static SIGUIENTE: AtomicU64 = AtomicU64::new(0);
20        TaskId(SIGUIENTE.fetch_add(1, Ordering::Relaxed))
21    }
22}
23
24/// Una tarea asincrona: un `Future` encapsulado, anclado (`Pin`) en el heap
25/// para que su direccion nunca cambie mientras avanza.
26pub struct Task {
27    /// La identidad de la tarea, su nombre ante el ejecutor.
28    pub id: TaskId,
29    futuro: Pin<Box<dyn Future<Output = ()> + Send + 'static>>,
30}
31
32impl Task {
33    /// Envuelve un `Future` en una tarea con identidad propia.
34    pub fn nueva(futuro: impl Future<Output = ()> + Send + 'static) -> Task {
35        Task {
36            id: TaskId::nuevo(),
37            futuro: Box::pin(futuro),
38        }
39    }
40
41    /// Hace avanzar la tarea un paso. `Poll::Ready` significa que concluyo.
42    pub fn poll(&mut self, contexto: &mut Context) -> Poll<()> {
43        self.futuro.as_mut().poll(contexto)
44    }
45}