return r;
}
+ file_events.resize(n);
+ nevent = n;
+
+ if (!driver->need_wakeup())
+ return 0;
+
int fds[2];
if (pipe(fds) < 0) {
lderr(cct) << __func__ << " can't create notify pipe" << dendl;
return r;
}
- file_events.resize(n);
- nevent = n;
- return 0;
+ return r;
}
EventCenter::~EventCenter()
global_centers, "AsyncMessenger::EventCenter::global_center");
assert(global_centers);
global_centers->centers[idx] = this;
- notify_handler = new C_handle_notify(this, cct);
- int r = create_file_event(notify_receive_fd, EVENT_READABLE, notify_handler);
- assert(r == 0);
+ if (driver->need_wakeup()) {
+ notify_handler = new C_handle_notify(this, cct);
+ int r = create_file_event(notify_receive_fd, EVENT_READABLE, notify_handler);
+ assert(r == 0);
+ }
}
}
void EventCenter::wakeup()
{
// No need to wake up since we never sleep
- if (!pollers.empty())
+ if (!pollers.empty() || !driver->need_wakeup())
return ;
ldout(cct, 2) << __func__ << dendl;
bool trigger_time = false;
auto now = clock_type::now();
+ auto it = time_events.begin();
bool blocking = pollers.empty() && !external_num_events.load();
// If exists external events or poller, don't block
if (!blocking) {
+ if (it != time_events.end() && now >= it->first)
+ trigger_time = true;
tv.tv_sec = 0;
tv.tv_usec = 0;
} else {
clock_type::time_point shortest;
shortest = now + std::chrono::microseconds(timeout_microseconds);
- auto it = time_events.begin();
if (it != time_events.end() && shortest >= it->first) {
ldout(cct, 10) << __func__ << " shortest is " << shortest << " it->first is " << it->first << dendl;
shortest = it->first;
virtual int del_event(int fd, int cur_mask, int del_mask) = 0;
virtual int event_wait(vector<FiredFileEvent> &fired_events, struct timeval *tp) = 0;
virtual int resize_events(int newsize) = 0;
+ virtual bool need_wakeup() { return true; }
};
/*
int del_event(int fd, int cur_mask, int del_mask) override;
int resize_events(int newsize) override;
int event_wait(vector<FiredFileEvent> &fired_events, struct timeval *tp) override;
- bool wakeup_support() { return false; }
+ bool need_wakeup() { return false; }
};
#endif //CEPH_EVENTDPDK_H