in include/unifex/submit.hpp [164:199]
void operator()(Sender&& sender, Receiver&& receiver) const {
// Default implementation in terms of connect/start
switch (blocking(sender)) {
case blocking_kind::always:
case blocking_kind::always_inline:
{
// The sender will complete synchronously so we can avoid allocating the
// state on the heap.
auto op = unifex::connect((Sender &&) sender, (Receiver &&) receiver);
unifex::start(op);
break;
}
default:
{
// Otherwise need to heap-allocate the operation-state
using op_t = _submit::operation<Sender, Receiver>;
op_t* op = nullptr;
{
// Use the receiver's associated allocator to allocate this state.
auto allocator = get_allocator(receiver);
using allocator_t = decltype(allocator);
rebind_alloc_t<allocator_t, op_t> typedAllocator{allocator};
op = rebind_traits_t<allocator_t, op_t>::allocate(typedAllocator, 1);
scope_guard freeOnError = [&]() noexcept {
rebind_traits_t<allocator_t, op_t>::deallocate(typedAllocator, op, 1);
};
rebind_traits_t<allocator_t, op_t>::construct(
typedAllocator, op, (Sender&&)sender, (Receiver&&)receiver);
freeOnError.release();
}
op->start();
}
}
}