Code size analysis#

pw_async2: Cooperative async tasks for embedded

Core async2 implementation#

The following table shows the code size cost of adding pw_async2 to a system. These size reports assume a baseline system with an RTOS which already uses a handful of core Pigweed components including HAL abstractions and pw_allocator.

The first row captures the core of pw_async2: the dispatcher, tasks, and wakers, using the pw::async2::BasicDispatcher. This is the minimum size cost a system must pay to adopt pw_async2. The following row demonstrates the cost of adding another task to this system. Of course, the majority of the cost of the task exists within its implementation — this simply shows that there is minimal internal overhead.

Label

Segment

Delta

Full cost of including pw_async2

FLASH

+668

[section .rodata]

+40

pw::containers::internal::GenericIntrusiveList<>::remove_if<>()

+16

pw::containers::internal::GenericIntrusiveList<>::clear()

+228

pw::async2::size_report::Measure()

-2

pw::containers::internal::IntrusiveForwardListItem::DoGetPrevious()

+14

pw::containers::internal::GenericIntrusiveList<>::remove()

NEW

+228

pw::async2::Task::RunInDispatcher()

NEW

+164

pw::async2::Task::TryDeregister()

NEW

+100

pw::this_thread::sleep_for()

NEW

+84

pw::async2::Dispatcher::Post()

NEW

+82

pw::async2::Task::~Task()

NEW

+76

vTaskDelay

NEW

+72

pw::async2::Task::Wake()

NEW

+72

pw::async2::size_report::PendableValue<>::Get()

NEW

+60

pw::this_thread::get_id()

NEW

+56

pw::async2::Task::PostTo()

NEW

+56

pw::async2::Waker::operator=()

NEW

+56

pw::async2::internal::CloneWaker()

NEW

+56

pw::async2::size_report::MockTask::DoPend()

NEW

+52

pw::async2::Dispatcher::PopTaskToRun()

NEW

+50

pw::async2::Dispatcher::WakeTask()

NEW

+46

pw::async2::size_report::MockTask::~MockTask()

NEW

+42

pw::async2::Dispatcher::~Dispatcher()

NEW

+40

pw::async2::Dispatcher::Deregister()

NEW

+40

pw::async2::Dispatcher::PopTaskToRunLocked()

NEW

+40

pw::async2::Waker::InternalCloneIntoLocked()

NEW

+40

pw::async2::Waker::Wake()

NEW

+36

__atomic_exchange_1

NEW

+32

__atomic_store_1

NEW

+32

pw::async2::Dispatcher::PopAndRunAllReadyTasks()

NEW

+32

pw::async2::Waker::InsertIntoTaskWakerList()

NEW

+32

pw::async2::Waker::RemoveFromTaskWakerList()

NEW

+30

pw::async2::PendFuncTask<>::~PendFuncTask()

NEW

+28

pw::async2::BasicDispatcher

NEW

+28

pw::async2::Dispatcher::UnpostTaskList()

NEW

+28

pw::async2::RunnableDispatcher::RunToCompletion()

NEW

+26

pw::async2::Dispatcher::RunTask()

NEW

+26

pw::containers::internal::IntrusiveListItemBase<>::unlist()

NEW

+24

pw::async2::Task::Deregister()

NEW

+24

pw::async2::Waker::Waker()

NEW

+24

pw::async2::size_report::MockTask::DoPend()::{lambda()#1}::operator()()

NEW

+24

pw::async2::size_report::PendableValue<>::Get()::{lambda()#1}::operator()()

NEW

+22

pw::async2::BasicDispatcher::~BasicDispatcher()

NEW

+22

pw::async2::Task::RemoveAllWakersLocked()

NEW

+20

pw::async2::Dispatcher

NEW

+20

pw::async2::PendFuncTask<>

NEW

+20

pw::async2::Task

NEW

+20

pw::async2::size_report::MockTask

NEW

+18

pw::async2::PendFuncTask<>::DoPend()

NEW

+18

pw::async2::Task::RemoveWakerLocked()

NEW

+18

pw::containers::internal::LegacyIntrusiveList<>::Item::~Item()

NEW

+16

pw::async2::Waker::InsertIntoTaskWakerListLocked()

NEW

+16

pw::async2::Waker::RemoveFromTaskWakerListLocked()

NEW

+16

pw::async2::Waker::~Waker()

NEW

+16

pw::containers::internal::LegacyIntrusiveList<>::~LegacyIntrusiveList()

NEW

+14

pw::async2::Task::Unpost()

NEW

+12

pw::async2::(anonymous namespace)::YieldToAnyThread()

NEW

+12

pw::async2::BasicDispatcher::DoWaitForWake()

NEW

+12

pw::async2::Task::AddWakerLocked()

NEW

+12

pw::async2::internal::StoreWaker()

NEW

+10

pw::async2::BasicDispatcher::DoWake()

NEW

+8

pw::async2::RunnableDispatcher::DoRunUntilStalled()

+3,224

RAM

+8

[section .data]

NEW

+24

pw::async2::size_report::(anonymous namespace)::dispatcher

NEW

+8

pw::async2::internal::lock()::lock

+40

Base incremental cost of adding a task to an existing async system

FLASH

+56

pw::async2::size_report::Measure()

+8

vClearInterruptMaskFromISR

+64

Size of pw_async2’s C++ coroutine adapters

FLASH

+160

[section .rodata]

+116

pw::async2::size_report::Measure()

+40

pw::Result<>::value()

+2

pw::async2::size_report::MockTask::~MockTask()

+2

pw::async2::PendFuncTask<>::~PendFuncTask()

+4

vClearInterruptMaskFromISR

-2

operator delete()

+2

fit::internal::trivial_target_destroy()

NEW

+272

pw::async2::size_report::StoresFiveThenReturns()

NEW

+236

pw::async2::Coro<>::Pend()

NEW

+112

pw::async2::size_report::ImmediatelyReturnsFive()

NEW

+88

pw::async2::size_report::ExpectCoroTask::DoPend()

NEW

+70

pw::async2::internal::OwningCoroutineHandle<>::Release()

NEW

+68

pw::async2::internal::CoroPromiseType<>::SharedNew()

NEW

+56

pw::async2::internal::Awaitable<>::await_suspend()

NEW

+48

pw::async2::internal::Awaitable<>::PendFillReturnValue()

NEW

+42

pw::internal_result::StatusOrData<>::operator=()

NEW

+40

_ZN2pw15internal_result12StatusOrDataIiLb1EEC2INS_6StatusETnNSt3__29enable_ifIXsr3std16is_constructibleIS4_OT_EE5valueEiE4typeELi0EEES8_

NEW

+40

pw::async2::internal::CoroPromiseType<>::get_return_object()

NEW

+40

pw::internal_result::StatusOrData<>::AssignStatus<>()

NEW

+36

_ZNSt3__216__variant_detail12__visitation6__base11__visit_altB9nqn220000IZNS0_6__dtorINS0_8__traitsIJN2pw6async24CoroINS6_6ResultIiEEEESA_EEELNS0_6_TraitE1EE9__destroyB9nqn220000EvEUlRT_E_JRSE_EEEDcOSF_DpOT0_

NEW

+34

pw::async2::size_report::ExpectCoroTask::~ExpectCoroTask()

NEW

+32

pw::async2::internal::CoroPromiseType<>::get_return_object_on_allocation_failure()

NEW

+30

_ZNSt3__216__variant_detail12__assignmentINS0_8__traitsIJN2pw6async24CoroINS3_6ResultIiEEEES7_EEEE9__emplaceB9nqn220000ILj1EJS7_EEERDaDpOT0_

NEW

+26

_ZNSt3__216__variant_detail12__assignmentINS0_8__traitsIJN2pw6async24CoroINS3_6ResultIiEEEES7_EEEE12__assign_altB9nqn220000ILj1ES7_S7_EEvRNS0_5__altIXT_ET0_EEOT1_

NEW

+26

_ZNSt3__216__variant_detail6__dtorINS0_8__traitsIJN2pw6async24CoroINS3_6ResultIiEEEES7_EEELNS0_6_TraitE1EE9__destroyB9nqn220000Ev

NEW

+24

pw::async2::internal::LogCoroAllocationFailure()

NEW

+20

_ZNSt3__28optionalIN2pw6ResultIiEEEC2B9nqn220000INS1_6StatusETnNS_9enable_ifIXclsr22_CheckOptionalLikeCtorIT_OS8_EE17__enable_implicitIS8_EEEiE4typeELi0EEEONS0_IS8_EE

NEW

+20

fit::internal::inline_trivial_target_move<>()

NEW

+20

fit::internal::target<>::ops

NEW

+20

pw::async2::size_report::ExpectCoroTask

NEW

+16

pw::async2::internal::CoroPromiseType<>::operator new<>()

NEW

+14

_ZNSt3__213__generic_getB9nqn220000ILj0ERNS_7variantIJN2pw6async24CoroINS2_6ResultIiEEEES6_EEEEEODaOT0_

NEW

+14

_ZNSt3__223__optional_storage_baseIN2pw6ResultIiEELb0EE16__construct_fromB9nqn220000INS_8optionalINS1_6StatusEEEEEvOT_

NEW

+14

pw::Result<>::Result()

NEW

+12

_ZNSt3__213__generic_getB9nqn220000ILj1ERNS_7variantIJN2pw6async24CoroINS2_6ResultIiEEEES6_EEEEEODaOT0_

NEW

+12

_ZNSt3__216__variant_detail6__implIJN2pw6async24CoroINS2_6ResultIiEEEES6_EE8__assignB9nqn220000ILj1ES6_EEvOT0_

NEW

+12

_ZNSt3__223__optional_storage_baseIN2pw6ResultIiEELb0EE11__constructB9nqn220000IJNS1_6StatusEEEEvDpOT_

NEW

+12

_ZNSt3__226__throw_bad_variant_accessB9nqn220000Ev

NEW

+10

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj0EEE10__dispatchB9nqn220000IOZNS0_6__dtorINS0_8__traitsIJN2pw6async24CoroINS8_6ResultIiEEEESC_EEELNS0_6_TraitE1EE9__destroyB9nqn220000EvEUlRT_E_JRNS0_6__baseILSF_1EJSD_SC_EEEEEEDcSH_DpT0_

NEW

+10

pw::async2::internal::Awaitable<>::await_suspend()::{lambda()#1}::operator()()

NEW

+10

std::__2::__libcpp_verbose_abort()

NEW

+8

fit::internal::target<>::invoke()

NEW

+2

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj1EEE10__dispatchB9nqn220000IOZNS0_6__dtorINS0_8__traitsIJN2pw6async24CoroINS8_6ResultIiEEEESC_EEELNS0_6_TraitE1EE9__destroyB9nqn220000EvEUlRT_E_JRNS0_6__baseILSF_1EJSD_SC_EEEEEEDcSH_DpT0_

NEW

+2

fit::internal::inline_target_get()

+1,872

Futures#

Futures are the core abstraction in pw_async2, providing a standardized way of polling an asynchronous operation to completion.

The design of futures has some implications for code size:

  • All futures are templated on the type of value they produce, which means that the compiler must generate separate code for each type.

  • Additionally, futures use CRTP for compile-time polymorphism, so each concrete future type is a distinct class and may duplicate common behavior.

The following sections detail the code size of various future implementations and utilities.

ValueFuture#

ValueFuture is the simplest future type, used to return a single result from an asynchronous operation. Its implementation contains effectively the minimal code required for a future, making it a good baseline for understanding the size cost of a future in pw_async2.

The table below shows the size of ValueFuture. The first row shows the base cost of using a single ValueFuture. The second row adds another ValueFuture with a different return type to demonstrate the incremental cost of template specialization. The third row shows the size of VoidFuture (alias for ValueFuture<void>), which is specialized to avoid storing a value.

Label

Segment

Delta

Size of ValueFuture

FLASH

+280

[section .rodata]

-88

pw::async2::size_report::Measure()

+2

pw::containers::internal::GenericIntrusiveList<>::remove_if<>()

DEL

-72

pw::async2::size_report::PendableValue<>::Get()

+2

pw::async2::size_report::MockTask::~MockTask()

-2

pw::containers::internal::IntrusiveListItemBase<>::unlist()

DEL

-24

pw::async2::size_report::PendableValue<>::Get()::{lambda()#1}::operator()()

+12

pw::async2::PendFuncTask<>::DoPend()

+2

pw::containers::internal::GenericIntrusiveList<>::push_back()

+8

vClearInterruptMaskFromISR

NEW

+148

pw::async2::size_report::SingleTypeValueFuture()

NEW

+84

pw::async2::FutureCore::DoPend<>()

NEW

+56

pw::async2::ValueProvider<>::Get()

NEW

+48

pw::async2::ValueFuture<>::ResolveLocked<>()

NEW

+44

_ZN2pw6async213ValueProviderIiE7ResolveIJiEiTnNSt3__29enable_ifIXntsr3stdE9is_void_vIT0_EEiE4typeELi0EEEvDpOT_

NEW

+44

pw::async2::BaseFutureList::PushRequireEmpty()

NEW

+40

pw::async2::ValueFuture<>::Pend()

NEW

+40

pw::async2::ValueProvider<>::~ValueProvider()

NEW

+36

pw::async2::ValueFuture<>::~ValueFuture()

NEW

+24

pw::async2::FutureCore::DoPend<>()::{lambda()#1}::operator()()

NEW

+18

pw::async2::FutureCore::~FutureCore()

NEW

+16

pw::async2::FutureCore::WakeAndMarkReady()

NEW

+10

pw::async2::FutureCore::Unlist()

+728

RAM

NEW

+8

pw::async2::internal::ValueProviderLock()::lock

+8

Cost of additional ValueFuture template specialization

FLASH

+8

pw::async2::size_report::Measure()

+88

pw::async2::FutureCore::DoPend<>()

+56

pw::async2::ValueProvider<>::Get()

+48

pw::async2::ValueFuture<>::ResolveLocked<>()

+40

pw::async2::ValueFuture<>::Pend()

+40

pw::async2::ValueProvider<>::~ValueProvider()

+36

pw::async2::ValueFuture<>::~ValueFuture()

+30

pw::async2::PendFuncTask<>::DoPend()

+30

pw::async2::PendFuncTask<>::~PendFuncTask()

+24

pw::async2::FutureCore::DoPend<>()::{lambda()#1}::operator()()

+20

pw::async2::PendFuncTask<>

-8

vClearInterruptMaskFromISR

-4

__bi_84

NEW

+156

pw::async2::size_report::MultiTypeValueFuture()

NEW

+80

__aeabi_f2iz

NEW

+44

_ZN2pw6async213ValueProviderIfE7ResolveIJfEfTnNSt3__29enable_ifIXntsr3stdE9is_void_vIT0_EEiE4typeELi0EEEvDpOT_

+688

Size of VoidFuture (ValueFuture<void>)

FLASH

+268

[section .rodata]

-88

pw::async2::size_report::Measure()

+2

pw::containers::internal::GenericIntrusiveList<>::remove_if<>()

DEL

-72

pw::async2::size_report::PendableValue<>::Get()

+2

pw::async2::size_report::MockTask::~MockTask()

-2

pw::containers::internal::IntrusiveListItemBase<>::unlist()

DEL

-24

pw::async2::size_report::PendableValue<>::Get()::{lambda()#1}::operator()()

+8

pw::async2::PendFuncTask<>::DoPend()

-4

__bi_84

+2

pw::containers::internal::GenericIntrusiveList<>::push_back()

NEW

+128

pw::async2::size_report::VoidFutureReport()

NEW

+80

pw::async2::FutureCore::DoPend<>()

NEW

+52

pw::async2::ValueProvider<>::Get()

NEW

+44

pw::async2::BaseFutureList::PushRequireEmpty()

NEW

+40

pw::async2::ValueFuture<>::Pend()

NEW

+40

pw::async2::ValueProvider<>::~ValueProvider()

NEW

+36

pw::async2::ValueFuture<>::~ValueFuture()

NEW

+32

_ZN2pw6async213ValueProviderIvE7ResolveIvTnNSt3__29enable_ifIXsr3stdE9is_void_vIT_EEiE4typeELi0EEEvv

NEW

+24

pw::async2::FutureCore::DoPend<>()::{lambda()#1}::operator()()

NEW

+20

pw::async2::BaseFutureList::ResolveOne()

NEW

+18

pw::async2::FutureCore::WakeAndMarkReady()

NEW

+18

pw::async2::FutureCore::~FutureCore()

NEW

+14

pw::async2::BaseFutureList::ResolveOneIfAvailable()

NEW

+10

pw::async2::FutureCore::Unlist()

+648

RAM

NEW

+8

pw::async2::internal::ValueProviderLock()::lock

+8

OnceSender and OnceReceiver#

The next table shows sizes of the pair of OnceSender and OnceReceiver types, which allow for returning a delayed result from an async function, similar to a Future type in other languages. This type is templated on its stored value, causing specialization overhead for each type sent through the sender/receiver pair. The first row showcases the base cost of using a OnceSender and OnceReceiver; the second row adds another template specialization on top of this to demonstrate the incremental cost.

Label

Segment

Delta

Size of OnceSender / OnceReceiver

FLASH

+172

[section .rodata]

+52

pw::async2::size_report::Measure()

+2

pw::containers::internal::GenericIntrusiveList<>::~GenericIntrusiveList()

+2

pw::async2::size_report::MockTask::~MockTask()

-4

vClearInterruptMaskFromISR

-2

operator delete()

NEW

+112

pw::async2::OnceReceiver<>::Pend()

NEW

+96

pw::async2::OnceReceiver<>::OnceReceiver()

NEW

+60

pw::async2::size_report::SenderAdd()

NEW

+52

pw::async2::OnceSender<>::emplace<>()

NEW

+52

pw::async2::size_report::ReceiverTask<>::ReceiverTask()

NEW

+46

pw::async2::size_report::ReceiverTask<>::~ReceiverTask()

NEW

+44

pw::async2::OnceReceiver<>::~OnceReceiver()

NEW

+44

pw::async2::OnceSender<>::~OnceSender()

NEW

+40

_ZN2pw15internal_result12StatusOrDataIjLb1EEC2INS_6StatusETnNSt3__29enable_ifIXsr3std16is_constructibleIS4_OT_EE5valueEiE4typeELi0EEES8_

NEW

+24

pw::async2::OnceReceiver<>::Pend()::{lambda()#1}::operator()()

NEW

+22

pw::async2::size_report::ReceiverTask<>::DoPend()

NEW

+20

_ZNSt3__28optionalIN2pw6ResultIjEEEC2B9nqn220000INS1_6StatusETnNS_9enable_ifIXclsr22_CheckOptionalLikeCtorIT_OS8_EE17__enable_implicitIS8_EEEiE4typeELi0EEEONS0_IS8_EE

NEW

+20

pw::async2::size_report::ReceiverTask<>

NEW

+20

std::__2::pair<>::~pair()

NEW

+14

_ZNSt3__223__optional_storage_baseIN2pw6ResultIjEELb0EE11__constructB9nqn220000IJNS1_6StatusEEEEvDpOT_

NEW

+14

_ZNSt3__223__optional_storage_baseIN2pw6ResultIjEELb0EE16__construct_fromB9nqn220000INS_8optionalINS1_6StatusEEEEEvOT_

NEW

+12

_ZNRSt3__28optionalIjE5valueB9nqn220000Ev

NEW

+12

_ZNSt3__227__throw_bad_optional_accessB9nqn220000Ev

NEW

+10

std::__2::__libcpp_verbose_abort()

+936

RAM

NEW

+8

pw::async2::sender_receiver_lock()::lock

+8

Cost of additional OnceSender / OnceReceiver template specialization

FLASH

+56

pw::async2::size_report::Measure()

+112

pw::async2::OnceReceiver<>::Pend()

+96

pw::async2::OnceReceiver<>::OnceReceiver()

+52

pw::async2::OnceSender<>::emplace<>()

+52

pw::async2::size_report::ReceiverTask<>::ReceiverTask()

+46

pw::async2::size_report::ReceiverTask<>::~ReceiverTask()

+44

pw::async2::OnceReceiver<>::~OnceReceiver()

+44

pw::async2::OnceSender<>::~OnceSender()

+24

pw::async2::OnceReceiver<>::Pend()::{lambda()#1}::operator()()

+22

pw::async2::size_report::ReceiverTask<>::DoPend()

+20

pw::async2::size_report::ReceiverTask<>

+18

std::__2::pair<>::~pair()

-4

__bi_84

+8

vClearInterruptMaskFromISR

NEW

+62

pw::async2::size_report::SenderSub()

NEW

+40

_ZN2pw15internal_result12StatusOrDataIiLb1EEC2INS_6StatusETnNSt3__29enable_ifIXsr3std16is_constructibleIS4_OT_EE5valueEiE4typeELi0EEES8_

NEW

+20

_ZNSt3__28optionalIN2pw6ResultIiEEEC2B9nqn220000INS1_6StatusETnNS_9enable_ifIXclsr22_CheckOptionalLikeCtorIT_OS8_EE17__enable_implicitIS8_EEEiE4typeELi0EEEONS0_IS8_EE

NEW

+14

_ZNSt3__223__optional_storage_baseIN2pw6ResultIiEELb0EE11__constructB9nqn220000IJNS1_6StatusEEEEvDpOT_

NEW

+14

_ZNSt3__223__optional_storage_baseIN2pw6ResultIiEELb0EE16__construct_fromB9nqn220000INS_8optionalINS1_6StatusEEEEEvOT_

NEW

+12

_ZNRSt3__28optionalIiE5valueB9nqn220000Ev

+752

async2 utilities#

Pigweed provides several utilities to simplify writing asynchronous code. Among these are combinators which operate over several pendables, such as Join which waits for all pendables to complete, and Select which waits for the first pendable to complete.

The table below demonstrates the code size impact of using these utilities. For both Join and Select, the report shows:

  • The initial cost of using the utility with multiple pendables of the same type.

  • The incremental cost of adding a second call with pendables of different types, which demonstrates the overhead of template specialization.

Additionally, the table includes a comparison showing the code size difference between using the Select helper versus manually polling each pendable.

Label

Segment

Delta

Size of calling Select() with several pendables of the same type

FLASH

+164

[section .rodata]

-88

pw::async2::size_report::Measure()

+2

pw::containers::internal::GenericIntrusiveList<>::~GenericIntrusiveList()

+2

pw::async2::size_report::MockTask::~MockTask()

+16

pw::async2::PendFuncTask<>

+14

pw::async2::PendFuncTask<>::DoPend()

-4

__bi_84

-4

vClearInterruptMaskFromISR

-2

operator delete()

NEW

+260

pw::async2::size_report::SingleTypeSelect()

NEW

+192

pw::async2::Selector<>::PendFrom<>()

NEW

+60

pw::async2::MemberPendableWrapper<>::Pend()

NEW

+24

_ZNSt3__28__invokeB9nqn220000IJMN2pw6async211size_report13PendableValueIiEEFNS2_4PollIiEERNS2_7ContextEERPS5_S9_EEENS_20__invoke_result_implIvJDpT_EE4typeEDpOSF_

NEW

+24

pw::async2::MemberPendableWrapper<>::Pend()::{lambda()#1}::operator()<>()

NEW

+14

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj0EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EiEENSD_ILj2EiEENS9_21AllPendablesCompletedEEEEZNS9_11size_report16SingleTypeSelectEjE3$_1NS_5tupleIJOZNSK_16SingleTypeSelectEjE3$_2OZNSK_16SingleTypeSelectEjE3$_3OZNSK_16SingleTypeSelectEjE3$_4EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSV_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSU_DpT0_

NEW

+14

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj1EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EiEENSD_ILj2EiEENS9_21AllPendablesCompletedEEEEZNS9_11size_report16SingleTypeSelectEjE3$_1NS_5tupleIJOZNSK_16SingleTypeSelectEjE3$_2OZNSK_16SingleTypeSelectEjE3$_3OZNSK_16SingleTypeSelectEjE3$_4EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSV_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSU_DpT0_

NEW

+14

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj2EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EiEENSD_ILj2EiEENS9_21AllPendablesCompletedEEEEZNS9_11size_report16SingleTypeSelectEjE3$_1NS_5tupleIJOZNSK_16SingleTypeSelectEjE3$_2OZNSK_16SingleTypeSelectEjE3$_3OZNSK_16SingleTypeSelectEjE3$_4EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSV_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSU_DpT0_

NEW

+14

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj3EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EiEENSD_ILj2EiEENS9_21AllPendablesCompletedEEEEZNS9_11size_report16SingleTypeSelectEjE3$_1NS_5tupleIJOZNSK_16SingleTypeSelectEjE3$_2OZNSK_16SingleTypeSelectEjE3$_3OZNSK_16SingleTypeSelectEjE3$_4EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSV_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSU_DpT0_

NEW

+12

_ZNSt3__220__throw_if_valuelessB9nqn220000IJRNS_7variantIJN2pw6async212SelectResultILj0EiEENS4_ILj1EiEENS4_ILj2EiEENS3_21AllPendablesCompletedEEEEEEEvDpOT_

NEW

+12

_ZNSt3__226__throw_bad_variant_accessB9nqn220000Ev

NEW

+10

pw::async2::Selector<>::Pend()

NEW

+10

std::__2::__libcpp_verbose_abort()

+760

Size of an additional a call to Select() with pendables of different types

FLASH

+182

pw::async2::Selector<>::PendFrom<>()

+8

pw::async2::size_report::Measure()

+140

pw::async2::size_report::PendableValue<>::Get()

+116

pw::async2::MemberPendableWrapper<>::Pend()

+36

pw::async2::PendFuncTask<>

+32

pw::async2::PendFuncTask<>::DoPend()

+30

pw::async2::PendFuncTask<>::~PendFuncTask()

+48

pw::async2::MemberPendableWrapper<>::Pend()::{lambda()#1}::operator()<>()

+48

pw::async2::size_report::PendableValue<>::Get()::{lambda()#1}::operator()()

-2

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj3EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EiEENSD_ILj2EiEENS9_21AllPendablesCompletedEEEEZNS9_11size_report16SingleTypeSelectEjE3$_1NS_5tupleIJOZNSK_16SingleTypeSelectEjE3$_2OZNSK_16SingleTypeSelectEjE3$_3OZNSK_16SingleTypeSelectEjE3$_4EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSV_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSU_DpT0_

+4

__bi_84

+10

pw::async2::Selector<>::Pend()

+8

vClearInterruptMaskFromISR

NEW

+256

pw::async2::size_report::MultiTypeSelect()

NEW

+24

_ZNSt3__28__invokeB9nqn220000IJMN2pw6async211size_report13PendableValueIcEEFNS2_4PollIcEERNS2_7ContextEERPS5_S9_EEENS_20__invoke_result_implIvJDpT_EE4typeEDpOSF_

NEW

+24

_ZNSt3__28__invokeB9nqn220000IJMN2pw6async211size_report13PendableValueIjEEFNS2_4PollIjEERNS2_7ContextEERPS5_S9_EEENS_20__invoke_result_implIvJDpT_EE4typeEDpOSF_

NEW

+14

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj0EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EjEENSD_ILj2EcEENS9_21AllPendablesCompletedEEEEZNS9_11size_report15MultiTypeSelectEjE3$_1NS_5tupleIJOZNSK_15MultiTypeSelectEjE3$_2OZNSK_15MultiTypeSelectEjE3$_3OZNSK_15MultiTypeSelectEjE3$_4EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSV_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSU_DpT0_

NEW

+14

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj1EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EjEENSD_ILj2EcEENS9_21AllPendablesCompletedEEEEZNS9_11size_report15MultiTypeSelectEjE3$_1NS_5tupleIJOZNSK_15MultiTypeSelectEjE3$_2OZNSK_15MultiTypeSelectEjE3$_3OZNSK_15MultiTypeSelectEjE3$_4EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSV_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSU_DpT0_

NEW

+14

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj2EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EjEENSD_ILj2EcEENS9_21AllPendablesCompletedEEEEZNS9_11size_report15MultiTypeSelectEjE3$_1NS_5tupleIJOZNSK_15MultiTypeSelectEjE3$_2OZNSK_15MultiTypeSelectEjE3$_3OZNSK_15MultiTypeSelectEjE3$_4EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSV_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSU_DpT0_

NEW

+14

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj3EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EjEENSD_ILj2EcEENS9_21AllPendablesCompletedEEEEZNS9_11size_report15MultiTypeSelectEjE3$_1NS_5tupleIJOZNSK_15MultiTypeSelectEjE3$_2OZNSK_15MultiTypeSelectEjE3$_3OZNSK_15MultiTypeSelectEjE3$_4EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSV_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSU_DpT0_

NEW

+12

_ZNSt3__220__throw_if_valuelessB9nqn220000IJRNS_7variantIJN2pw6async212SelectResultILj0EiEENS4_ILj1EjEENS4_ILj2EcEENS3_21AllPendablesCompletedEEEEEEEvDpOT_

+1,032

Cost of using Select() versus manually polling each pendable

FLASH

+164

[section .rodata]

-62

pw::async2::size_report::SelectComparison::Pend()

+16

pw::async2::PendFuncTask<>

-2

pw::async2::PendFuncTask<>::DoPend()

+4

__bi_84

-4

vClearInterruptMaskFromISR

-2

operator delete()

NEW

+180

pw::async2::Selector<>::PendFrom<>()

NEW

+176

pw::async2::MemberPendableWrapper<>::Pend()

NEW

+72

pw::async2::MemberPendableWrapper<>::Pend()::{lambda()#1}::operator()<>()

NEW

+72

pw::async2::size_report::SelectComparison::Pend()::{lambda()#1}::operator()()

NEW

+36

pw::async2::internal::VisitSelectResult<>()::{lambda()#1}::operator()<>()

NEW

+32

_ZNSt3__216__variant_detail12__visitation9__variant13__visit_valueB9nqn220000IZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS5_12SelectResultILj0EiEENS9_ILj1EjEENS9_ILj2EcEENS5_21AllPendablesCompletedEEEEZNS5_11size_report16SelectComparison4PendERNS5_7ContextEEUlSD_E_NS_5tupleIJOZNSH_4PendESJ_EUliE_OZNSH_4PendESJ_EUljE_OZNSH_4PendESJ_EUlcE_EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSU_E_JSF_EEEDcSU_DpOT0_

NEW

+24

_ZNSt3__28__invokeB9nqn220000IJMN2pw6async211size_report13PendableValueIcEEFNS2_4PollIcEERNS2_7ContextEERPS5_S9_EEENS_20__invoke_result_implIvJDpT_EE4typeEDpOSF_

NEW

+24

_ZNSt3__28__invokeB9nqn220000IJMN2pw6async211size_report13PendableValueIiEEFNS2_4PollIiEERNS2_7ContextEERPS5_S9_EEENS_20__invoke_result_implIvJDpT_EE4typeEDpOSF_

NEW

+24

_ZNSt3__28__invokeB9nqn220000IJMN2pw6async211size_report13PendableValueIjEEFNS2_4PollIjEERNS2_7ContextEERPS5_S9_EEENS_20__invoke_result_implIvJDpT_EE4typeEDpOSF_

NEW

+22

_ZNSt3__25visitB9nqn220000IZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS2_12SelectResultILj0EiEENS6_ILj1EjEENS6_ILj2EcEENS2_21AllPendablesCompletedEEEEZNS2_11size_report16SelectComparison4PendERNS2_7ContextEEUlSA_E_NS_5tupleIJOZNSE_4PendESG_EUliE_OZNSE_4PendESG_EUljE_OZNSE_4PendESG_EUlcE_EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSR_E_JSC_EvEEDcSR_DpOT0_

NEW

+18

pw::async2::VisitSelectResult<>()

NEW

+18

pw::async2::internal::VisitSelectResult<>()

NEW

+12

_ZNSt3__220__throw_if_valuelessB9nqn220000IJRNS_7variantIJN2pw6async212SelectResultILj0EiEENS4_ILj1EjEENS4_ILj2EcEENS3_21AllPendablesCompletedEEEEEEEvDpOT_

NEW

+12

_ZNSt3__226__throw_bad_variant_accessB9nqn220000Ev

NEW

+12

_ZNSt3__28__invokeB9nqn220000IJZN2pw6async211size_report16SelectComparison4PendERNS2_7ContextEEUliE_iEEENS_20__invoke_result_implIvJDpT_EE4typeEDpOS9_

NEW

+10

_ZNKSt3__216__variant_detail12__visitation9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS5_12SelectResultILj0EiEENS9_ILj1EjEENS9_ILj2EcEENS5_21AllPendablesCompletedEEEEZNS5_11size_report16SelectComparison4PendERNS5_7ContextEEUlSD_E_NS_5tupleIJOZNSH_4PendESJ_EUliE_OZNSH_4PendESJ_EUljE_OZNSH_4PendESJ_EUlcE_EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSU_E_EclB9nqn220000IJRNS0_5__altILj0ESA_EEEEEDcDpOT_

NEW

+10

_ZNKSt3__216__variant_detail12__visitation9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS5_12SelectResultILj0EiEENS9_ILj1EjEENS9_ILj2EcEENS5_21AllPendablesCompletedEEEEZNS5_11size_report16SelectComparison4PendERNS5_7ContextEEUlSD_E_NS_5tupleIJOZNSH_4PendESJ_EUliE_OZNSH_4PendESJ_EUljE_OZNSH_4PendESJ_EUlcE_EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSU_E_EclB9nqn220000IJRNS0_5__altILj1ESB_EEEEEDcDpOT_

NEW

+10

_ZNKSt3__216__variant_detail12__visitation9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS5_12SelectResultILj0EiEENS9_ILj1EjEENS9_ILj2EcEENS5_21AllPendablesCompletedEEEEZNS5_11size_report16SelectComparison4PendERNS5_7ContextEEUlSD_E_NS_5tupleIJOZNSH_4PendESJ_EUliE_OZNSH_4PendESJ_EUljE_OZNSH_4PendESJ_EUlcE_EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSU_E_EclB9nqn220000IJRNS0_5__altILj2ESC_EEEEEDcDpOT_

NEW

+10

_ZNSt3__28__invokeB9nqn220000IJZN2pw6async211size_report16SelectComparison4PendERNS2_7ContextEEUlcE_cEEENS_20__invoke_result_implIvJDpT_EE4typeEDpOS9_

NEW

+10

_ZNSt3__28__invokeB9nqn220000IJZN2pw6async211size_report16SelectComparison4PendERNS2_7ContextEEUljE_jEEENS_20__invoke_result_implIvJDpT_EE4typeEDpOS9_

NEW

+10

pw::async2::Selector<>::Pend()

NEW

+10

std::__2::__libcpp_verbose_abort()

NEW

+8

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj0EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EjEENSD_ILj2EcEENS9_21AllPendablesCompletedEEEEZNS9_11size_report16SelectComparison4PendERNS9_7ContextEEUlSH_E_NS_5tupleIJOZNSL_4PendESN_EUliE_OZNSL_4PendESN_EUljE_OZNSL_4PendESN_EUlcE_EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSY_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSX_DpT0_

NEW

+8

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj1EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EjEENSD_ILj2EcEENS9_21AllPendablesCompletedEEEEZNS9_11size_report16SelectComparison4PendERNS9_7ContextEEUlSH_E_NS_5tupleIJOZNSL_4PendESN_EUliE_OZNSL_4PendESN_EUljE_OZNSL_4PendESN_EUlcE_EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSY_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSX_DpT0_

NEW

+8

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj2EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EjEENSD_ILj2EcEENS9_21AllPendablesCompletedEEEEZNS9_11size_report16SelectComparison4PendERNS9_7ContextEEUlSH_E_NS_5tupleIJOZNSL_4PendESN_EUliE_OZNSL_4PendESN_EUljE_OZNSL_4PendESN_EUlcE_EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSY_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSX_DpT0_

NEW

+2

_ZNSt3__216__variant_detail12__visitation6__base12__dispatcherIJLj3EEE10__dispatchB9nqn220000IONS1_9__variant15__value_visitorIZN2pw6async28internal17VisitSelectResultIRNS_7variantIJNS9_12SelectResultILj0EiEENSD_ILj1EjEENSD_ILj2EcEENS9_21AllPendablesCompletedEEEEZNS9_11size_report16SelectComparison4PendERNS9_7ContextEEUlSH_E_NS_5tupleIJOZNSL_4PendESN_EUliE_OZNSL_4PendESN_EUljE_OZNSL_4PendESN_EUlcE_EEEJLj0ELj1ELj2EEEEvOT_OT0_OT1_NS_16integer_sequenceIjJXspT2_EEEEEUlSY_E_EEJRNS0_6__baseILNS0_6_TraitE0EJSE_SF_SG_SH_EEEEEEDcSX_DpT0_

+944

Size of calling Join() with several futures of the same type

FLASH

+104

[section .rodata]

+8

pw::async2::size_report::Measure()

+34

pw::async2::PendFuncTask<>::DoPend()

+30

pw::async2::PendFuncTask<>::~PendFuncTask()

+20

pw::async2::PendFuncTask<>

-8

vClearInterruptMaskFromISR

+4

__bi_84

-4

main

NEW

+204

pw::async2::size_report::SingleTypeJoin()

NEW

+100

pw::async2::JoinFuture<>::PendElement<>()

NEW

+84

pw::async2::JoinFuture<>::Pend()

NEW

+52

pw::async2::JoinFuture<>::PendElements<>()

NEW

+40

_ZNSt3__223__optional_storage_baseINS_5tupleIJOiS2_S2_EEELb0EE13__assign_fromB9nqn220000INS_27__optional_move_assign_baseIS3_Lb0EEEEEvOT_

NEW

+36

_ZNSt3__212__tuple_implINS_18__integer_sequenceIjJLj0ELj1ELj2EEEEJN2pw6async211ValueFutureIiEES6_S6_EEC2B9nqn220000IJS6_S6_S6_EEENS_14__forward_argsEDpOT_

NEW

+28

_ZNSt3__227__memberwise_forward_assignB9nqn220000INS_5tupleIJOiS2_S2_EEES3_JS2_S2_S2_EJLj0ELj1ELj2EEEEvRT_OT0_NS_11__type_listIJDpT1_EEENS_18__integer_sequenceIjJXspT2_EEEE

NEW

+28

std::__2::__tuple_impl<>::~__tuple_impl()

NEW

+26

pw::async2::JoinFuture<>::JoinFuture()

NEW

+18

_ZNSt3__25tupleIJN2pw6async211ValueFutureIiEES4_S4_EEC2B9nqn220000IJS4_S4_S4_ETnNS_9enable_ifIXsr4_AndINS_17integral_constantIbXeqsZT_sZT_EEENS5_17_EnableUTypesCtorIJDpT_EEEEE5valueEiE4typeELi0EEEDpOSB_

NEW

+12

_ZNSt3__25tupleIJOiS1_S1_EEaSB9nqn220000EOS2_

+816

Size of an additional a call to Join() with futures of different types

FLASH

+8

pw::async2::size_report::Measure()

+32

pw::async2::PendFuncTask<>::DoPend()

+88

pw::async2::JoinFuture<>::PendElement<>()

+84

pw::async2::JoinFuture<>::Pend()

+30

pw::async2::PendFuncTask<>::~PendFuncTask()

+52

pw::async2::JoinFuture<>::PendElements<>()

-2

pw::async2::size_report::MockTask::~MockTask()

+20

pw::async2::PendFuncTask<>

+26

std::__2::__tuple_impl<>::~__tuple_impl()

+26

pw::async2::JoinFuture<>::JoinFuture()

-4

__bi_84

+8

vClearInterruptMaskFromISR

NEW

+208

pw::async2::size_report::MultiTypeJoin()

NEW

+40

_ZNSt3__223__optional_storage_baseINS_5tupleIJOiOjOcEEELb0EE13__assign_fromB9nqn220000INS_27__optional_move_assign_baseIS5_Lb0EEEEEvOT_

NEW

+34

_ZNSt3__212__tuple_implINS_18__integer_sequenceIjJLj0ELj1ELj2EEEEJN2pw6async211ValueFutureIiEENS5_IjEENS5_IcEEEEC2B9nqn220000IJS6_S7_S8_EEENS_14__forward_argsEDpOT_

NEW

+26

_ZNSt3__227__memberwise_forward_assignB9nqn220000INS_5tupleIJOiOjOcEEES5_JS2_S3_S4_EJLj0ELj1ELj2EEEEvRT_OT0_NS_11__type_listIJDpT1_EEENS_18__integer_sequenceIjJXspT2_EEEE

NEW

+16

_ZNSt3__25tupleIJN2pw6async211ValueFutureIiEENS3_IjEENS3_IcEEEEC2B9nqn220000IJS4_S5_S6_ETnNS_9enable_ifIXsr4_AndINS_17integral_constantIbXeqsZT_sZT_EEENS7_17_EnableUTypesCtorIJDpT_EEEEE5valueEiE4typeELi0EEEDpOSD_

NEW

+12

_ZNSt3__25tupleIJOiOjOcEEaSB9nqn220000EOS4_

+704

Channel#

pw_async2 channels are the primary mechanism for communicating between async tasks and threads.

The following size report shows the base cost of using static and dynamic channels, as well as the marginal cost of adding a new channel of a trivial or non-trivial type.

Label

Segment

Delta

Size of static MpmcChannel

FLASH

+436

[section .rodata]

DEL

-244

pw::async2::size_report::Measure()

+2

pw::containers::internal::GenericIntrusiveList<>::remove_if<>()

DEL

-72

pw::async2::size_report::PendableValue<>::Get()

DEL

-56

pw::async2::Waker::operator=()

DEL

-56

pw::async2::size_report::MockTask::DoPend()

DEL

-46

pw::async2::size_report::MockTask::~MockTask()

+30

pw::async2::PendFuncTask<>::~PendFuncTask()

DEL

-28

pw::async2::RunnableDispatcher::RunToCompletion()

-2

pw::Allocator::Resize()

-2

pw::containers::internal::IntrusiveListItemBase<>::unlist()

DEL

-24

pw::async2::size_report::MockTask::DoPend()::{lambda()#1}::operator()()

DEL

-24

pw::async2::size_report::PendableValue<>::Get()::{lambda()#1}::operator()()

+20

pw::async2::PendFuncTask<>

DEL

-20

pw::async2::size_report::MockTask

+2

pw::async2::PendFuncTask<>::DoPend()

+2

pw::async2::Waker::RemoveFromTaskWakerListLocked()

-2

pw::async2::internal::StoreWaker()

+8

vClearInterruptMaskFromISR

+4

main

NEW

+272

pw::async2::size_report::MeasureStatic<>()

NEW

+124

pw::async2::SendFuture<>::DoPend()

NEW

+116

pw::async2::ReceiveFuture<>::DoPend()

NEW

+114

pw::async2::internal::BaseChannelFuture::BaseChannelFuture()

NEW

+100

pw::async2::internal::BaseChannelFuture::StoreWakerForReceiveIfOpen()

NEW

+88

pw::async2::internal::BaseChannel::remove_object()

NEW

+76

pw::async2::internal::BaseChannel::~BaseChannel()

NEW

+76

pw::async2::internal::BaseChannelFuture::StoreWakerForSend()

NEW

+68

pw::async2::CreateMpmcChannel<>()

NEW

+52

pw::async2::internal::BaseChannel::add_object()

NEW

+48

pw::async2::size_report::MeasureStatic<>()::{lambda()#1}::operator()()

NEW

+44

pw::async2::ChannelHandle<>::CreateReceiver()

NEW

+44

pw::async2::ChannelHandle<>::CreateSender()

NEW

+44

pw::async2::internal::BaseChannel::add_ref()

NEW

+44

pw::containers::internal::GenericDeque<>::front()

NEW

+44

pw::containers::internal::GenericDeque<>::pop_front()

NEW

+42

pw::async2::internal::Channel<>::CreateReceiver()

NEW

+42

pw::async2::internal::Channel<>::CreateSender()

NEW

+40

pw::async2::internal::BaseChannel::BaseChannel()

NEW

+40

pw::async2::internal::ChannelFuture<>::Pend()

NEW

+40

pw::async2::size_report::MeasureStatic<>()::{lambda()#2}::operator()()

NEW

+40

pw::containers::internal::GenericDeque<>::push_back()

NEW

+38

pw::containers::internal::GenericDeque<>::try_emplace_back<>()

NEW

+36

pw::async2::internal::BaseChannel::RemoveRefAndDestroyIfUnreferenced()

NEW

+34

pw::FixedDeque<>::~FixedDeque()

NEW

+34

pw::async2::internal::BaseChannelFuture::StoreAndAddRefIfNonnull()

NEW

+32

pw::async2::ChannelStorage<>::ChannelStorage()

NEW

+32

pw::async2::internal::Channel<>::Channel<>()

NEW

+32

pw::async2::internal::Channel<>::PopAndWake()

NEW

+32

pw::async2::internal::Channel<>::~Channel()

NEW

+30

pw::async2::internal::BaseChannelFuture::RemoveFromChannel()

NEW

+28

pw::async2::internal::BaseChannel::should_close()

NEW

+26

pw::async2::BaseFutureList::ResolveAll()

NEW

+24

pw::async2::internal::BaseChannel::CloseLocked()

NEW

+24

pw::containers::internal::GenericDequeBase<>::PopFront()

NEW

+24

pw::containers::internal::GenericDequeBase<>::PushBack()

NEW

+20

pw::async2::BaseFutureList::ResolveOne()

NEW

+20

pw::async2::Receiver<>::Disconnect()

NEW

+20

pw::async2::Sender<>::Disconnect()

NEW

+20

pw::async2::internal::BaseChannelHandle::Release()

NEW

+20

pw::async2::internal::Channel<>::PushAndWake()

NEW

+20

pw::containers::internal::GenericDeque<>::EmplaceBackUnchecked<>()

NEW

+18

pw::async2::FutureCore::~FutureCore()

NEW

+18

pw::async2::ReceiveFuture<>::~ReceiveFuture()

NEW

+18

pw::async2::Receiver<>::~Receiver()

NEW

+18

pw::async2::SendFuture<>::SendFuture()

NEW

+18

pw::async2::SendFuture<>::~SendFuture()

NEW

+18

pw::async2::Sender<>::~Sender()

NEW

+16

pw::async2::FutureCore::WakeAndMarkReady()

NEW

+16

pw::async2::internal::BaseChannelFuture::Complete()

NEW

+14

pw::async2::BaseFutureList::ResolveOneIfAvailable()

NEW

+14

pw::async2::FutureCore::Reset()

NEW

+14

pw::async2::internal::BaseChannel::add_handle()

NEW

+12

pw::async2::ChannelStorage<>

NEW

+12

pw::async2::internal::BaseChannel

NEW

+12

pw::async2::internal::BaseChannel::add_receiver()

NEW

+12

pw::async2::internal::BaseChannel::add_sender()

NEW

+12

pw::async2::internal::BaseChannel::remove_handle()

NEW

+12

pw::async2::internal::BaseChannel::remove_receiver()

NEW

+12

pw::async2::internal::BaseChannel::remove_sender()

NEW

+12

pw::async2::internal::Channel<>

NEW

+10

pw::async2::FutureCore::Unlist()

NEW

+10

pw::async2::ReceiveFuture<>::ReceiveFuture()

NEW

+10

pw::async2::Receiver<>::Receive()

NEW

+10

pw::async2::Sender<>::Send<>()

NEW

+2

pw::async2::internal::BaseChannel::Destroy()

+2,392

RAM

-8

[section .data]

DEL

-24

pw::async2::size_report::(anonymous namespace)::dispatcher

-32

Cost of additional static MpmcChannel<unsigned> instantiation

FLASH

+272

pw::async2::size_report::MeasureStatic<>()

+124

pw::async2::SendFuture<>::DoPend()

+116

pw::async2::ReceiveFuture<>::DoPend()

+68

pw::async2::CreateMpmcChannel<>()

+60

pw::async2::PendFuncTask<>::~PendFuncTask()

+48

pw::async2::size_report::MeasureStatic<>()::{lambda()#1}::operator()()

+44

pw::async2::ChannelHandle<>::CreateReceiver()

+44

pw::async2::ChannelHandle<>::CreateSender()

+44

pw::containers::internal::GenericDeque<>::front()

+44

pw::containers::internal::GenericDeque<>::pop_front()

+42

pw::async2::internal::Channel<>::CreateReceiver()

+42

pw::async2::internal::Channel<>::CreateSender()

+40

pw::async2::PendFuncTask<>

+40

pw::async2::internal::ChannelFuture<>::Pend()

+40

pw::async2::size_report::MeasureStatic<>()::{lambda()#2}::operator()()

+40

pw::containers::internal::GenericDeque<>::push_back()

+38

pw::containers::internal::GenericDeque<>::try_emplace_back<>()

+32

pw::FixedDeque<>::~FixedDeque()

+32

pw::async2::ChannelStorage<>::ChannelStorage()

+32

pw::async2::internal::Channel<>::Channel<>()

+32

pw::async2::internal::Channel<>::PopAndWake()

+32

pw::async2::internal::Channel<>::~Channel()

+20

pw::async2::PendFuncTask<>::DoPend()

+20

pw::async2::Receiver<>::Disconnect()

+20

pw::async2::Sender<>::Disconnect()

+20

pw::async2::internal::Channel<>::PushAndWake()

+20

pw::containers::internal::GenericDeque<>::EmplaceBackUnchecked<>()

-4

vClearInterruptMaskFromISR

+18

pw::async2::ReceiveFuture<>::~ReceiveFuture()

+18

pw::async2::Receiver<>::~Receiver()

+18

pw::async2::SendFuture<>::SendFuture()

+18

pw::async2::SendFuture<>::~SendFuture()

+18

pw::async2::Sender<>::~Sender()

+4

main

+12

pw::async2::ChannelStorage<>

+12

pw::async2::internal::Channel<>

+12

pw::async2::ReceiveFuture<>::ReceiveFuture()

+10

pw::async2::Receiver<>::Receive()

+10

pw::async2::Sender<>::Send<>()

+1,552

Cost of additional static MpmcChannel<MoveOnly> instantiation

FLASH

+272

pw::async2::size_report::MeasureStatic<>()

+124

pw::async2::SendFuture<>::DoPend()

+116

pw::async2::ReceiveFuture<>::DoPend()

+68

pw::async2::CreateMpmcChannel<>()

+60

pw::async2::PendFuncTask<>::~PendFuncTask()

+48

pw::async2::size_report::MeasureStatic<>()::{lambda()#1}::operator()()

+44

pw::async2::ChannelHandle<>::CreateReceiver()

+44

pw::async2::ChannelHandle<>::CreateSender()

+44

pw::containers::internal::GenericDeque<>::front()

+44

pw::containers::internal::GenericDeque<>::pop_front()

+42

pw::async2::internal::Channel<>::CreateReceiver()

+42

pw::async2::internal::Channel<>::CreateSender()

+40

pw::async2::PendFuncTask<>

+40

pw::async2::internal::ChannelFuture<>::Pend()

+40

pw::async2::size_report::MeasureStatic<>()::{lambda()#2}::operator()()

+40

pw::containers::internal::GenericDeque<>::push_back()

+38

pw::containers::internal::GenericDeque<>::try_emplace_back<>()

+32

pw::FixedDeque<>::~FixedDeque()

+32

pw::async2::ChannelStorage<>::ChannelStorage()

+32

pw::async2::internal::Channel<>::Channel<>()

+32

pw::async2::internal::Channel<>::PopAndWake()

+32

pw::async2::internal::Channel<>::~Channel()

+20

pw::async2::PendFuncTask<>::DoPend()

+20

pw::async2::Receiver<>::Disconnect()

+20

pw::async2::Sender<>::Disconnect()

+20

pw::async2::internal::Channel<>::PushAndWake()

+20

pw::containers::internal::GenericDeque<>::EmplaceBackUnchecked<>()

-4

vClearInterruptMaskFromISR

+18

pw::async2::ReceiveFuture<>::~ReceiveFuture()

+18

pw::async2::Receiver<>::~Receiver()

+18

pw::async2::SendFuture<>::SendFuture()

+18

pw::async2::SendFuture<>::~SendFuture()

+18

pw::async2::Sender<>::~Sender()

+4

main

+12

pw::async2::ChannelStorage<>

+12

pw::async2::internal::Channel<>

+12

pw::async2::ReceiveFuture<>::ReceiveFuture()

+10

pw::async2::Receiver<>::Receive()

+10

pw::async2::Sender<>::Send<>()

+1,552

Size of dynamic MpmcChannel

FLASH

+416

[section .rodata]

DEL

-244

pw::async2::size_report::Measure()

+2

pw::containers::internal::GenericIntrusiveList<>::remove_if<>()

DEL

-72

pw::async2::size_report::PendableValue<>::Get()

DEL

-56

pw::async2::Waker::operator=()

DEL

-56

pw::async2::size_report::MockTask::DoPend()

DEL

-46

pw::async2::size_report::MockTask::~MockTask()

+30

pw::async2::PendFuncTask<>::~PendFuncTask()

DEL

-28

pw::async2::RunnableDispatcher::RunToCompletion()

-2

pw::Allocator::Resize()

-2

pw::containers::internal::IntrusiveListItemBase<>::unlist()

DEL

-24

pw::async2::size_report::MockTask::DoPend()::{lambda()#1}::operator()()

DEL

-24

pw::async2::size_report::PendableValue<>::Get()::{lambda()#1}::operator()()

+20

pw::async2::PendFuncTask<>

DEL

-20

pw::async2::size_report::MockTask

+68

pw::async2::PendFuncTask<>::DoPend()

-4

__bi_84

+2

pw::async2::Waker::RemoveFromTaskWakerListLocked()

-2

pw::async2::BasicDispatcher::DoWaitForWake()

-2

pw::async2::internal::StoreWaker()

+2

main

NEW

+268

pw::async2::size_report::MeasureDynamic()

NEW

+124

pw::async2::SendFuture<>::DoPend()

NEW

+116

pw::async2::ReceiveFuture<>::DoPend()

NEW

+116

pw::async2::internal::BaseChannelFuture::BaseChannelFuture()

NEW

+100

pw::async2::internal::BaseChannelFuture::StoreWakerForReceiveIfOpen()

NEW

+88

pw::async2::internal::BaseChannel::remove_object()

NEW

+76

pw::async2::internal::BaseChannel::~BaseChannel()

NEW

+76

pw::async2::internal::BaseChannelFuture::StoreWakerForSend()

NEW

+64

pw::FixedDeque<>::TryAllocate()

NEW

+64

pw::async2::CreateMpmcChannel<>()

NEW

+52

pw::async2::internal::BaseChannel::add_object()

NEW

+48

pw::async2::internal::DynamicChannel<>::Allocate()

NEW

+44

pw::async2::ChannelHandle<>::CreateReceiver()

NEW

+44

pw::async2::ChannelHandle<>::CreateSender()

NEW

+44

pw::async2::internal::BaseChannel::add_ref()

NEW

+44

pw::containers::internal::GenericDeque<>::front()

NEW

+44

pw::containers::internal::GenericDeque<>::pop_front()

NEW

+42

pw::async2::internal::Channel<>::CreateReceiver()

NEW

+42

pw::async2::internal::Channel<>::CreateSender()

NEW

+40

pw::async2::internal::BaseChannel::BaseChannel()

NEW

+40

pw::async2::internal::ChannelFuture<>::Pend()

NEW

+40

pw::containers::internal::GenericDeque<>::push_back()

NEW

+40

std::__2::align()

NEW

+38

pw::Deque<>::Aligned::Align()

NEW

+38

pw::containers::internal::GenericDeque<>::try_emplace_back<>()

NEW

+36

pw::async2::internal::BaseChannel::RemoveRefAndDestroyIfUnreferenced()

NEW

+36

pw::async2::internal::Channel<>::Channel()

NEW

+34

pw::FixedDeque<>::FixedDeque()

NEW

+34

pw::async2::internal::BaseChannelFuture::StoreAndAddRefIfNonnull()

NEW

+32

pw::FixedDeque<>::~FixedDeque()

NEW

+32

pw::async2::internal::Channel<>::PopAndWake()

NEW

+32

pw::async2::internal::Channel<>::~Channel()

NEW

+30

pw::Deque<>::Deque()

NEW

+30

pw::async2::internal::BaseChannelFuture::RemoveFromChannel()

NEW

+28

pw::async2::internal::BaseChannel::should_close()

NEW

+28

pw::containers::internal::GenericDequeBase<>::MoveAssignIndices()

NEW

+26

_ZN2pw9Allocator3NewINS_6async28internal14DynamicChannelIiEETpTnRiJEJNS_10FixedDequeIiLj4294967295EtEEEEENSt3__29enable_ifIXntsr3stdE10is_array_vIT_EEPSB_E4typeEDpOT1_

NEW

+26

pw::async2::BaseFutureList::ResolveAll()

NEW

+24

pw::async2::internal::BaseChannel::CloseLocked()

NEW

+24

pw::async2::internal::DynamicChannel<>::Destroy()

NEW

+24

pw::containers::internal::GenericDequeBase<>::PopFront()

NEW

+24

pw::containers::internal::GenericDequeBase<>::PushBack()

NEW

+20

_ZNSt3__224__optional_destruct_baseIN2pw6async217MpmcChannelHandleIiEELb0EED2B9nqn220000Ev

NEW

+20

pw::allocator::Layout::Of<>()

NEW

+20

pw::async2::BaseFutureList::ResolveOne()

NEW

+20

pw::async2::Receiver<>::Disconnect()

NEW

+20

pw::async2::Sender<>::Disconnect()

NEW

+20

pw::async2::internal::BaseChannelHandle::Release()

NEW

+20

pw::async2::internal::Channel<>::PushAndWake()

NEW

+20

pw::async2::internal::DynamicChannel<>::DynamicChannel()

NEW

+20

pw::containers::internal::GenericDeque<>::EmplaceBackUnchecked<>()

NEW

+18

pw::async2::FutureCore::~FutureCore()

NEW

+18

pw::async2::ReceiveFuture<>::~ReceiveFuture()

NEW

+18

pw::async2::Receiver<>::~Receiver()

NEW

+18

pw::async2::SendFuture<>::SendFuture()

NEW

+18

pw::async2::SendFuture<>::~SendFuture()

NEW

+18

pw::async2::Sender<>::~Sender()

NEW

+16

pw::Deque<>::MoveBufferFrom()

NEW

+16

pw::async2::FutureCore::WakeAndMarkReady()

NEW

+16

pw::async2::internal::BaseChannelFuture::Complete()

NEW

+14

pw::async2::BaseFutureList::ResolveOneIfAvailable()

NEW

+14

pw::async2::FutureCore::Reset()

NEW

+12

pw::async2::internal::BaseChannel

NEW

+12

pw::async2::internal::BaseChannel::add_handle()

NEW

+12

pw::async2::internal::BaseChannel::add_receiver()

NEW

+12

pw::async2::internal::BaseChannel::add_sender()

NEW

+12

pw::async2::internal::BaseChannel::remove_handle()

NEW

+12

pw::async2::internal::BaseChannel::remove_receiver()

NEW

+12

pw::async2::internal::BaseChannel::remove_sender()

NEW

+12

pw::async2::internal::Channel<>

NEW

+12

pw::async2::internal::DynamicChannel<>

NEW

+10

pw::async2::FutureCore::Unlist()

NEW

+10

pw::async2::ReceiveFuture<>::ReceiveFuture()

NEW

+10

pw::async2::Receiver<>::Receive()

NEW

+10

pw::async2::Sender<>::Send<>()

NEW

+2

pw::async2::internal::BaseChannel::Destroy()

+2,704

RAM

-8

[section .data]

DEL

-24

pw::async2::size_report::(anonymous namespace)::dispatcher

-32

Cost of static MpmcChannel when dynamic of same type is present

FLASH

+20

[section .rodata]

+20

pw::async2::PendFuncTask<>::DoPend()

+68

pw::async2::CreateMpmcChannel<>()

+60

pw::async2::PendFuncTask<>::~PendFuncTask()

+40

pw::async2::PendFuncTask<>

-4

vClearInterruptMaskFromISR

+6

main

+2

pw::async2::BasicDispatcher::DoWaitForWake()

NEW

+272

pw::async2::size_report::MeasureStatic<>()

NEW

+48

pw::async2::size_report::MeasureStatic<>()::{lambda()#1}::operator()()

NEW

+40

pw::async2::size_report::MeasureStatic<>()::{lambda()#2}::operator()()

NEW

+32

pw::async2::ChannelStorage<>::ChannelStorage()

NEW

+32

pw::async2::internal::Channel<>::Channel<>()

NEW

+12

pw::async2::ChannelStorage<>

+648