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::DynamicMap is a new sorted map container that uses a caller-provided pw::Allocator to dynamically allocate nodes.

  • Kernel: Process termination and ownership - pw_kernel processes 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 via bazelisk 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