Conceitos de Rust

Rust avançado, do sistema de tipos ao código unsafe, async e produção, medido no Rust 1.100 e baseado na documentação oficial, em livros e em papers, um conceito de cada vez.

Ordenar

Threads & Atomics

Async

1

Futures, Wakers e o Modelo de Poll

A trait Future com Poll, Context e Waker, o enum de estados que o compilador gera para um async fn (medido com size_of_val e -Zprint-type-sizes), por que o tamanho do future cresce com o que atravessa o .await e onde Box::pin ajuda, um executor block_on mínimo só com std (Wake e thread park) e o travamento silencioso de um Pending sem wake, inclusive como ele se disfarça de latência sob tokio::time::timeout.

2

Pin e Futures Autorreferenciais

Por que a máquina de estados de um async fn pode apontar para si mesma (medido em memória), a garantia de Pin e o auto trait Unpin, os erros reais do compilador ao chamar poll num future sem pin, pin! versus Box::pin, pinning estrutural e projeção com pin-project-lite (incluindo a proibição de Drop e o PinnedDrop) e o que acontece, nativamente e no Miri, quando código unsafe move um future já fixado, com o motivo do RFC 2349.

3

Por Dentro do Runtime do Tokio

Os schedulers current_thread e multi_thread, filas locais e global com work stealing medido, o LIFO slot, o orçamento cooperativo de 128 unidades com consume_budget, o driver de I/O sobre kqueue e epoll via mio, o timer de 1 ms, e o travamento medido de uma thread do runtime bloqueada com std::thread::sleep corrigido com spawn_blocking e block_in_place.

4

Async Traits e Async Closures

async fn em traits e RPITIT (1.75), o erro de Send ao fazer spawn em código genérico e as correções com -> impl Future + Send e trait_variant::make, return type notation ainda instável, por que dyn com métodos async não é dyn compatible, boxing com async-trait ou Pin<Box<dyn Future>> medido em alocações por chamada, e async closures com AsyncFn, AsyncFnMut e AsyncFnOnce (1.85) contra closures que devolvem futures.

5

Cancel Safety e Shutdown Gracioso

Drop como cancelamento, o que o tokio::select! faz com os ramos perdedores, JoinHandle que desanexa e abort, as listas de cancel safety da documentação do Tokio, a perda de dados medida com read_exact num loop de select! e a correção com read_buf, JoinSet, CancellationToken com child tokens, e shutdown gracioso com sinal, cancelamento em broadcast, TaskTracker e prazo, incluindo o SIGTERM que o ctrl_c não captura.