From 7185874b550e49e8d0ad7b1e124977d257f5e01a Mon Sep 17 00:00:00 2001 From: Avi Kivity <avi@cloudius-systems.com> Date: Thu, 21 Nov 2013 21:51:33 +0200 Subject: [PATCH] epoll: switch epoll_object to using file pointers Holding filerefs causes close() to be delayed indefinitly in case the user "forgets" to EPOLL_CTL_DEL the file before close(). Signed-off-by: Avi Kivity <avi@cloudius-systems.com> Signed-off-by: Pekka Enberg <penberg@cloudius-systems.com> --- core/epoll.cc | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core/epoll.cc b/core/epoll.cc index ace820312..17132b205 100644 --- a/core/epoll.cc +++ b/core/epoll.cc @@ -64,9 +64,9 @@ inline uint32_t events_poll_to_epoll(uint32_t e) } class epoll_obj { - std::unordered_map<fileref, epoll_event> map; + std::unordered_map<file*, epoll_event> map; public: - int add(fileref fp, struct epoll_event *event) + int add(file* fp, struct epoll_event *event) { if (map.count(fp)) { return EEXIST; @@ -74,7 +74,7 @@ public: map.emplace(std::move(fp), *event); return 0; } - int mod(fileref fp, struct epoll_event *event) + int mod(file* fp, struct epoll_event *event) { try { map.at(fp) = *event; @@ -83,7 +83,7 @@ public: return ENOENT; } } - int del(fileref fp) + int del(file* fp) { if (map.erase(fp)) { return 0; @@ -108,7 +108,7 @@ public: if (pollfds[i].revents) { --remain; assert(pollfds[i].fp); - events[remain].data = map[pollfds[i].fp].data; + events[remain].data = map[pollfds[i].fp.get()].data; events[remain].events = events_poll_to_epoll(pollfds[i].revents); trace_epoll_ready(pollfds[i].fp.get(), pollfds[i].revents); @@ -207,13 +207,13 @@ int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event) switch (op) { case EPOLL_CTL_ADD: - error = epo->add(std::move(fp), event); + error = epo->add(fp.get(), event); break; case EPOLL_CTL_MOD: - error = epo->mod(std::move(fp), event); + error = epo->mod(fp.get(), event); break; case EPOLL_CTL_DEL: - error = epo->del(std::move(fp)); + error = epo->del(fp.get()); break; default: error = EINVAL; -- GitLab