Skip to content

F4.2: IPC bloqueante por canal con timeout/deadline#80

Merged
guillo93 merged 1 commit into
mainfrom
f4.2-ipc-bloqueante-timeout
Jun 3, 2026
Merged

F4.2: IPC bloqueante por canal con timeout/deadline#80
guillo93 merged 1 commit into
mainfrom
f4.2-ipc-bloqueante-timeout

Conversation

@guillo93
Copy link
Copy Markdown
Owner

@guillo93 guillo93 commented Jun 3, 2026

Resumen

Segunda unidad del roadmap F4. Añade canales IPC con bloqueo acotado por plazo (timeout/deadline), sin busy-wait.

  • Canal con buffer FIFO circular (CHAN_CAPACITY), chan_send/chan_recv con tres modos: no bloqueante (timeout=0Ebusy), bloqueante con plazo (Etimedout al vencer), e indefinido (TIMEOUT_FOREVER).
  • Estados BlockedRecv/BlockedSend + block_deadline por tarea; wake_expired extendido vence los bloqueos IPC; al despertar se reintenta la operación.
  • Despertar al waiter de mayor prioridad (wake_one_recv/wake_one_send); limpieza de waiters/propiedad en kill.
  • ABI: IDs 0x12 (ChanSend, por valor) y 0x13 (ChanRecv, con out-ptr validado vía validate_user_range) + hooks + trampolines SVC userland.
  • cpu_chan_send/cpu_chan_recv privilegiados; sync_selftest extendido.

Validación

  • F407 y F769: RTT → sync selftest: PASS (mutex + semaphore + IPC).
  • 24 tests host en verde (módulo ipc_tests: FIFO, lleno→Ebusy, send despierta receptor bloqueado, timeout por plazo).
  • clippy/doc/fmt limpios en thumbv7em y thumbv7m.

Notas de diseño

  • El bloqueo real (switch_until_ready) no se prueba en host (el switch_context no-op de MockArch no progresaría): los tests cubren la ruta no bloqueante y la contabilidad de despertar/timeout vía accesores *_for_test + wake_expired_for_test.
  • ChanRecv es el primer syscall con puntero que ejercita el contrato de validate_user_range documentado en dispatch.

🤖 Generated with Claude Code

Añade canales IPC con buffer FIFO acotado, bloqueo con plazo y latencia
acotada (sin busy-wait):

- sched.rs: ChanCb (buffer circular CHAN_CAPACITY), estados BlockedRecv/
  BlockedSend con block_deadline por tarea, chan_send/chan_recv (no
  bloqueante con timeout=0, bloqueante con plazo, indefinido con
  TIMEOUT_FOREVER), wake_one_recv/send (despierta al waiter de mayor
  prioridad), wake_expired extendido para vencer bloqueos IPC, y limpieza
  en kill (release_task_sync).
- syscall.rs: IDs 0x12 (ChanSend, por valor) y 0x13 (ChanRecv, con out-ptr
  validado por validate_user_range) + hooks + trampolines SVC userland.
- rugus-kernel: hooks chan_send/chan_recv + wrappers cpu_chan_* +
  sync_selftest extendido (FIFO no bloqueante + Ebusy en vacío).
- examples F407/F769: log "sync selftest: PASS (mutex + semaphore + IPC)".
- appliance F103: rechaza IPC por canal con Einval (sin multitarea).
- host-tests: módulo ipc_tests (FIFO, lleno→Ebusy, send despierta receptor
  bloqueado, timeout por plazo) + aserciones de dispatch ChanSend/ChanRecv.

Validado: F407 y F769 reportan "sync selftest: PASS (mutex + semaphore +
IPC)" por RTT; 24 tests host en verde; clippy/doc/fmt limpios en ambos
targets.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@guillo93 guillo93 merged commit dbd0017 into main Jun 3, 2026
9 checks passed
@guillo93 guillo93 deleted the f4.2-ipc-bloqueante-timeout branch June 3, 2026 01:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant