What’s new in Pigweed: March 2026#
Highlights:
Kernel: Async IPC - Added non-blocking IPC syscalls to
pw_kernel.C++ data structures and utilities: New dynamically allocated map -
pw::DynamicMapis a new sorted map container that uses a caller-providedpw::Allocatorto dynamically allocate nodes.Kernel: Process termination and ownership -
pw_kernelprocesses can now be terminated from inside or outside of the process, and the new ownership model makes it possible to wait for a process to terminate.Toolchains and compilers: Newly exposed toolchain tools - The active toolchain’s tools (e.g.
objdump,readelf, etc.) can now be used interactively viabazelisk run.Async and concurrency: New PW_AWAIT macro - Simplified future polling with less boilerplate.
Async and concurrency#
New PW_AWAIT macro#
Introduced the PW_AWAIT macro, which simplifies polling pw_async2
futures by returning Pending if the future is not ready. CLs:
1
Coroutine and task rework#
Reworked task and coroutine allocation in pw_async2 to separate allocation
from creation, simplify templates, and use standard allocators. Coroutines now
support void return types and crash on allocation failure by default, with
pw::async2::FallibleCoroTask available for error handling. CLs:
1, 2,
3
Type-erasure with BoxedFuture#
Added pw::async2::BoxedFuture and a pw::async2::Box helper to support
dynamically allocated futures. BoxedFuture type-erases a future and stores
it dynamically via a pw::Allocator, hiding the concrete type. This is useful
when storing or returning futures of different concrete types. CLs:
1
C++ data structures and utilities#
New dynamically allocated map#
Introduced pw::DynamicMap, a sorted map container that uses a
caller-provided pw::Allocator to dynamically allocate nodes. CLs:
1, 2
New intrusive FIFO queue#
pw::IntrusiveQueue is a new FIFO queue container that uses intrusive links
to provide O(1) push and pop operations. CLs: 1
Developer tools#
New ide_query tool and improved compile commands#
The new ide_query tool in pw_ide provides a unified interface for
querying IDE-related information from the build system. Compile commands were
updated to extract dependencies and use relative paths, improving
reliability. CLs: 1,
2, 3,
4
Kernel#
Async IPC#
Added channel_async_transact, channel_async_transact_complete, and
channel_async_cancel syscalls to pw_kernel, enabling non-blocking IPC.
CLs: 1
Process termination and ownership#
Processes and their associated threads can now be terminated from either
inside or outside the process. The new process ownership model enables
waiting for a process to terminate via join. CLs:
1, 2
Reduce footprint of kernel-only applications#
The kernel no longer compiles userspace support code when building a kernel-only application, reducing binary size by over 2.6 KB on Cortex-M and RISC-V. CLs: 1
Networking#
Allocator support for buffers and packets in pw_bluetooth_sapphire#
Updated DynamicByteBuffer, CommandPacket, and EventPacket to accept
an optional pw::Allocator&, allowing for more flexible memory management.
CLs: 1
RPC#
Support multiple clients on a transfer thread in pw_transfer#
Multiple pw_transfer clients can now share a single transfer thread.
CLs: 1
Toolchains and compilers#
Newly exposed toolchain tools#
The active toolchain’s tools are now exposed for interactive use through
bazelisk run. Available tools include cc, c++, ld, ar,
objdump, nm, readelf, size, strip, and cov.
CLs: 1