⎇ 2523652e2250835d1521b0c3f3fc8374f6f1ae15
renaser/kernel/src/async_system/task.rs
History
Who touched what
raw
feat: integra renaser (kernel SASOS bare-metal) al monorepo
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}