mirror of
https://github.com/esphome/esphome.git
synced 2026-06-02 03:02:19 +08:00
[core] Replace std::bind with lambda in DelayAction (#14968)
This commit is contained in:
@@ -188,7 +188,7 @@ template<typename... Ts> class DelayAction : public Action<Ts...>, public Compon
|
|||||||
// Issue #10264: This is a workaround for parallel script delays interfering with each other.
|
// Issue #10264: This is a workaround for parallel script delays interfering with each other.
|
||||||
|
|
||||||
// Optimization: For no-argument delays (most common case), use direct lambda
|
// Optimization: For no-argument delays (most common case), use direct lambda
|
||||||
// instead of std::bind to avoid bind overhead (~16 bytes heap + faster execution)
|
// to avoid overhead from capturing arguments by value
|
||||||
if constexpr (sizeof...(Ts) == 0) {
|
if constexpr (sizeof...(Ts) == 0) {
|
||||||
App.scheduler.set_timer_common_(
|
App.scheduler.set_timer_common_(
|
||||||
this, Scheduler::SchedulerItem::TIMEOUT, Scheduler::NameType::NUMERIC_ID_INTERNAL, nullptr,
|
this, Scheduler::SchedulerItem::TIMEOUT, Scheduler::NameType::NUMERIC_ID_INTERNAL, nullptr,
|
||||||
@@ -196,9 +196,9 @@ template<typename... Ts> class DelayAction : public Action<Ts...>, public Compon
|
|||||||
[this]() { this->play_next_(); },
|
[this]() { this->play_next_(); },
|
||||||
/* is_retry= */ false, /* skip_cancel= */ this->num_running_ > 1);
|
/* is_retry= */ false, /* skip_cancel= */ this->num_running_ > 1);
|
||||||
} else {
|
} else {
|
||||||
// For delays with arguments, use std::bind to preserve argument values
|
// For delays with arguments, capture by value to preserve argument values
|
||||||
// Arguments must be copied because original references may be invalid after delay
|
// Arguments must be copied because original references may be invalid after delay
|
||||||
auto f = std::bind(&DelayAction<Ts...>::play_next_, this, x...);
|
auto f = [this, x...]() { this->play_next_(x...); };
|
||||||
App.scheduler.set_timer_common_(this, Scheduler::SchedulerItem::TIMEOUT, Scheduler::NameType::NUMERIC_ID_INTERNAL,
|
App.scheduler.set_timer_common_(this, Scheduler::SchedulerItem::TIMEOUT, Scheduler::NameType::NUMERIC_ID_INTERNAL,
|
||||||
nullptr, static_cast<uint32_t>(InternalSchedulerID::DELAY_ACTION),
|
nullptr, static_cast<uint32_t>(InternalSchedulerID::DELAY_ACTION),
|
||||||
this->delay_.value(x...), std::move(f),
|
this->delay_.value(x...), std::move(f),
|
||||||
|
|||||||
Reference in New Issue
Block a user