feat(renaser): Fase 10 — alta y baja de aplicaciones en vivo

El censo de aplicaciones deja de fijarse en el arranque: una app puede
nacer o cerrarse con el reactor ya en marcha.

- El reactor admite NACIMIENTOS en vivo: cola `NACIMIENTOS` +
  `engendrar()`, drenada al inicio de cada vuelta de `run()`;
  `Task::adoptar` acoge un futuro ya empaquetado.
- `Alt+Q` (`Mando::Cerrar`): baja limpia. El compositor saca la
  ventana enfocada del teselado y del orden-Z; la app advierte la
  baja (`ventana_cerrada`) y concluye su tarea — su memoria, su
  combustible y su canal de teclado se liberan. Sin baliza.
- `Alt+N` (`Mando::Lanzar`): alta en vivo. `nacer_ventana` añade la
  ventana y entrega su índice; el orquestador instancia el WASM y
  engendra su tarea. Las apps de génesis dejan su bytecode cacheado
  como `Plantilla`; cada `Alt+N` instancia una en rotación.

Verificado en QEMU (sendkey): tres Alt+N hacen crecer el escritorio
de 5 a 8 ventanas; tres Alt+Q lo reducen de 8 a 5. Kernel estable.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
sergio
2026-05-22 20:26:25 +00:00
parent 8f946b449c
commit 089afccbbc
9 changed files with 395 additions and 16 deletions
+42
View File
@@ -805,3 +805,45 @@ propio y libre, por encima de las demás.
ventana la flota en cascada, solapando a la primera. `Alt+K` devuelve el foco
a la ventana grande y ésta sube al frente, tapando por completo a la pequeña.
Un `Alt+F` final la reintegra al teselado.
## Fase 10 — Alta y baja de aplicaciones en vivo — 2026-05-22
Hasta la Fase 9 el censo de aplicaciones se fijaba en el arranque: las apps
nacían del manifiesto y sólo morían al fallar. La Fase 10 lo vuelve DINÁMICO —
una app puede nacer o cerrarse con el reactor ya en marcha.
### Añadido
- **El reactor admite nacimientos en vivo.** `executor`: una cola de
NACIMIENTOS (`Vec<FuturoTarea>` tras un `Mutex`) y la función `engendrar`.
El ejecutor la drena al inicio de cada vuelta (`recoger_nacimientos`) y
adopta cada futuro como tarea. `Task::adoptar` acoge un futuro ya
empaquetado. `dormir_si_inactivo` cuenta los nacimientos como trabajo.
- **Baja en vivo — `Alt+Q`.** Mando `Cerrar`: el compositor marca la ventana
enfocada como `cerrada`, libera su caché de respaldo, la saca del teselado y
del orden-Z, y traslada el foco a una ventana viva contigua. La app, en su
tarea, consulta `compositor::ventana_cerrada` cada fotograma; al verla
cerrada concluye su tarea — y `AplicacionWasm::drop` libera su memoria
lineal, su combustible y su canal de teclado. Una baja LIMPIA, sin baliza.
- **Alta en vivo — `Alt+N`.** Mando `Lanzar`: el compositor cuenta la petición
(`PARTOS`); la tarea del compositor la atiende con `partos_pendientes` y
`lanzar_app`. `compositor::nacer_ventana` añade la ventana y devuelve su
índice; el orquestador instancia el WASM con ese índice y `engendra` su
tarea. Las apps de génesis dejan su bytecode cacheado en RAM como
`Plantilla`; cada `Alt+N` instancia la siguiente en rotación, sin volver al
disco —una E/S por sondeo en mitad del reactor sería un mal vecino—.
- `compositor`: campo `Ventana.cerrada`, mandos `Cerrar` / `Lanzar`, y las
funciones `cerrar`, `nacer_ventana`, `ventana_cerrada`, `partos_pendientes`.
- `teclado`: `Alt+Q` → `Cerrar`, `Alt+N` → `Lanzar`.
### Cambiado
- `encender_app` devuelve la `Plantilla` de la app —su bytecode y geometría—
para los lanzamientos en vivo.
- `tarea_aplicacion` consulta `ventana_cerrada` antes de cada `tick`.
- `presentar_fotograma` y `desalojar` ignoran una ventana ya cerrada: una baja
limpia gana a un fotograma o a un desalojo que lleguen tarde.
### Verificado
- QEMU (`sendkey`): tres `Alt+N` dan a luz tres apps nuevas y el escritorio se
re-tesela de 5 a 8 ventanas. Tres `Alt+Q` cierran la app enfocada una a una
y el teselado reclama su espacio, de 8 de vuelta a 5. El kernel sigue estable
a través de todas las altas y bajas.