};
Mutex lock;
- map<int, FileEvent> file_events;
+ unordered_map<int, FileEvent> file_events;
// The second element is id
map<utime_t, uint64_t> time_to_ids;
// The first element is id
int process_time_events();
FileEvent *_get_file_event(int fd) {
- map<int, FileEvent>::iterator it = file_events.find(fd);
+ unordered_map<int, FileEvent>::iterator it = file_events.find(fd);
if (it != file_events.end()) {
return &it->second;
}
//
deque<FiredEvent> conn_queue;
// used only by file event <File Descriptor, Mask>
- map<int, int> pending;
+ unordered_map<int, int> pending;
EventWQ(EventCenter *c, time_t timeout, time_t suicide_timeout, ThreadPool *tp)
: ThreadPool::WorkQueueVal<FiredEvent>("Event::EventWQ", timeout, suicide_timeout, tp), center(c) {}
void _enqueue(FiredEvent e) {
if (e.is_file) {
// Ensure only one thread process one file descriptor
- map<int, int>::iterator it = pending.find(e.file_event.fd);
+ unordered_map<int, int>::iterator it = pending.find(e.file_event.fd);
if (it != pending.end()) {
it->second |= e.file_event.mask;
} else {
FiredEvent e = conn_queue.front();
conn_queue.pop_front();
if (e.is_file) {
- assert(pending.count(e.file_event.fd));
e.file_event.mask = pending[e.file_event.fd];
pending.erase(e.file_event.fd);
}
}
}
void _clear() {
- assert(conn_queue.empty());
}
} event_wq;
return -errno;
}
+ size = nevent;
+
return 0;
}
struct epoll_event ee;
/* If the fd was already monitored for some event, we need a MOD
* operation. Otherwise we need an ADD operation. */
- int op, pos;
- map<int, int>::iterator it = fds.find(fd);
- if (it == fds.end()) {
- op = EPOLL_CTL_ADD;
- if (deleted_fds.size()) {
- pos = deleted_fds.front();
- deleted_fds.pop_front();
- } else {
- pos = next_pos;
- next_pos++;
- }
- fds[fd] = pos;
- } else {
- op = cur_mask == EVENT_NONE ? EPOLL_CTL_ADD: EPOLL_CTL_MOD;
- }
+ int op;
+ op = cur_mask == EVENT_NONE ? EPOLL_CTL_ADD: EPOLL_CTL_MOD;
ee.events = EPOLLET;
add_mask |= cur_mask; /* Merge old events */
void EpollDriver::del_event(int fd, int cur_mask, int delmask)
{
struct epoll_event ee;
- map<int, int>::iterator it = fds.find(fd);
- if (it == fds.end())
- return ;
-
int mask = cur_mask & (~delmask);
ee.events = 0;
lderr(cct) << __func__ << " epoll_ctl: delete fd=" << fd
<< " failed." << cpp_strerror(errno) << dendl;
}
-
- if (next_pos == it->second)
- next_pos--;
- else
- deleted_fds.push_back(it->second);
- fds.erase(fd);
}
ldout(cct, 10) << __func__ << " del event fd=" << fd << " cur mask=" << mask
<< dendl;
int EpollDriver::resize_events(int newsize)
{
+ size = newsize;
events = (struct epoll_event*)realloc(events, sizeof(struct epoll_event)*newsize);
return 0;
}
{
int retval, numevents = 0;
- retval = epoll_wait(epfd, events, next_pos,
+ retval = epoll_wait(epfd, events, size,
tvp ? (tvp->tv_sec*1000 + tvp->tv_usec/1000) : -1);
if (retval > 0) {
int j;
class EpollDriver : public EventDriver {
int epfd;
- // map "fd" to the pos of "events"
- map<int, int> fds;
- // used to store the deleted position
- list<int> deleted_fds;
- int next_pos;
struct epoll_event *events;
CephContext *cct;
+ int size;
public:
- EpollDriver(CephContext *c): epfd(-1), next_pos(0), events(NULL), cct(c) {}
+ EpollDriver(CephContext *c): epfd(-1), events(NULL), cct(c) {}
virtual ~EpollDriver() {
if (epfd != -1)
close(epfd);