summaryrefslogtreecommitdiff
path: root/init/epoll.cpp
diff options
context:
space:
mode:
authoralk3pInjection <webmaster@raspii.tech>2021-10-12 16:30:00 +0800
committeralk3pInjection <webmaster@raspii.tech>2021-10-12 16:30:00 +0800
commite133954adc84ad6faae8d80986a6a6291f1f94e8 (patch)
treec244bd262d86a8953cd2031a044863518006fc81 /init/epoll.cpp
parent2ef3b59442f291e6230eef14c81b906752acf748 (diff)
parent5ef7f7b23dac0f210fd2c60a04b41fa8da11d1dd (diff)
Merge remote-tracking branch 'upstream/lineage-18.1' into lineage-18.1lineage-18.1
* upstream/lineage-18.1: Use std::shared_ptr in Epoll's callback list. init: do not create dev.mnt. properties for emulated mounts Change-Id: I7384327c412f75ab3c9c62cb82640f9988702a03
Diffstat (limited to 'init/epoll.cpp')
-rw-r--r--init/epoll.cpp12
1 files changed, 7 insertions, 5 deletions
diff --git a/init/epoll.cpp b/init/epoll.cpp
index 17d63fa5d..74d8aac96 100644
--- a/init/epoll.cpp
+++ b/init/epoll.cpp
@@ -38,11 +38,12 @@ Result<void> Epoll::Open() {
return {};
}
-Result<void> Epoll::RegisterHandler(int fd, std::function<void()> handler, uint32_t events) {
+Result<void> Epoll::RegisterHandler(int fd, Handler handler, uint32_t events) {
if (!events) {
return Error() << "Must specify events";
}
- auto [it, inserted] = epoll_handlers_.emplace(fd, std::move(handler));
+ auto sp = std::make_shared<decltype(handler)>(std::move(handler));
+ auto [it, inserted] = epoll_handlers_.emplace(fd, std::move(sp));
if (!inserted) {
return Error() << "Cannot specify two epoll handlers for a given FD";
}
@@ -69,7 +70,7 @@ Result<void> Epoll::UnregisterHandler(int fd) {
return {};
}
-Result<std::vector<std::function<void()>*>> Epoll::Wait(
+Result<std::vector<std::shared_ptr<Epoll::Handler>>> Epoll::Wait(
std::optional<std::chrono::milliseconds> timeout) {
int timeout_ms = -1;
if (timeout && timeout->count() < INT_MAX) {
@@ -81,9 +82,10 @@ Result<std::vector<std::function<void()>*>> Epoll::Wait(
if (num_events == -1) {
return ErrnoError() << "epoll_wait failed";
}
- std::vector<std::function<void()>*> pending_functions;
+ std::vector<std::shared_ptr<Handler>> pending_functions;
for (int i = 0; i < num_events; ++i) {
- pending_functions.emplace_back(reinterpret_cast<std::function<void()>*>(ev[i].data.ptr));
+ auto sp = *reinterpret_cast<std::shared_ptr<Handler>*>(ev[i].data.ptr);
+ pending_functions.emplace_back(std::move(sp));
}
return pending_functions;