Skip to content

定时器中的resetArriveTime(),不应该是以第一个TimerEvent的arrivedTime作为Timer的新的arrivedTime吗?(应该是auto it = tmp.begin(),而不是auto it = tmp.rbegin()) #72

@JanDavi

Description

@JanDavi
void Timer::resetArriveTime() {
  RWMutex::ReadLock lock(m_event_mutex);
  std::multimap<int64_t, TimerEvent::ptr> tmp = m_pending_events;
  lock.unlock();

  if (tmp.size() == 0) {
    DebugLog << "no timerevent pending, size = 0";
    return;
  }

  auto it = tmp.rbegin();
  int64_t interval = (*it).first - getNowMs();
  if (interval < 0) {
    DebugLog << "all timer events has already expire";
    return;
  }

  timespec ts;
  memset(&ts, 0, sizeof(ts));
  ts.tv_sec = interval / 1000;
  ts.tv_nsec = (interval % 1000) * 1000000;
  
  itimerspec new_value;
  memset(&new_value, 0, sizeof(new_value));
  new_value.it_value = ts;

  int rt = timerfd_settime(m_fd, 0, &new_value, nullptr);

  if (rt != 0) {
    ErrorLog << "tiemr_settime error, interval=" << interval;
  } else {
    DebugLog << "reset timer succ, next occur time=" << (*it).first;
  }
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions