Skip to content

关于同一highp_timer更新时间后async_wait可能的问题 #356

Description

@koobin
void io_service::schedule_timer(highp_timer* timer_ctl, timer_cb_t&& timer_cb)
{
  if (timer_ctl == nullptr)
    return;

  std::lock_guard<std::recursive_mutex> lck(this->timer_queue_mtx_);
  auto timer_it = this->find_timer(timer_ctl);
  if (timer_it == timer_queue_.end())
  {
    this->timer_queue_.emplace_back(timer_ctl, std::move(timer_cb));
    this->sort_timers();
    // If the new timer is earliest, wakup
    if (timer_ctl == this->timer_queue_.rbegin()->first)
      this->interrupt();
  }
  else // always replace timer_cb
    timer_it->second = std::move(timer_cb);
}

该函数在更新过期时间(比如缩短过期时间)后可能不能正常执行,能否改成如下代码,这样就在任何情况下都不会有问题。

void io_service::schedule_timer(highp_timer* timer_ctl, timer_cb_t&& timer_cb)
{
  if (timer_ctl == nullptr)
    return;

  std::lock_guard<std::recursive_mutex> lck(this->timer_queue_mtx_);
  auto timer_it = this->find_timer(timer_ctl);
  if (timer_it == timer_queue_.end())
  {
    this->timer_queue_.emplace_back(timer_ctl, std::move(timer_cb));
  }
  else // always replace timer_cb
    timer_it->second = std::move(timer_cb);

  this->sort_timers();
  // If the new timer is earliest, wakup
  if (timer_ctl == this->timer_queue_.rbegin()->first)
    this->interrupt();
}

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions