Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit aabaa0ae authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "init: Introduce Epoll::SetFirstCallback()" am: 9457a9ab

parents 7c5e1562 9457a9ab
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -75,6 +75,10 @@ Result<void> Epoll::UnregisterHandler(int fd) {
    return {};
}

void Epoll::SetFirstCallback(std::function<void()> first_callback) {
    first_callback_ = std::move(first_callback);
}

Result<std::vector<std::shared_ptr<Epoll::Handler>>> Epoll::Wait(
        std::optional<std::chrono::milliseconds> timeout) {
    int timeout_ms = -1;
@@ -87,6 +91,9 @@ Result<std::vector<std::shared_ptr<Epoll::Handler>>> Epoll::Wait(
    if (num_events == -1) {
        return ErrnoError() << "epoll_wait failed";
    }
    if (num_events > 0 && first_callback_) {
        first_callback_();
    }
    std::vector<std::shared_ptr<Handler>> pending_functions;
    for (int i = 0; i < num_events; ++i) {
        auto& info = *reinterpret_cast<Info*>(ev[i].data.ptr);
+2 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ class Epoll {
    Result<void> Open();
    Result<void> RegisterHandler(int fd, Handler handler, uint32_t events = EPOLLIN);
    Result<void> UnregisterHandler(int fd);
    void SetFirstCallback(std::function<void()> first_callback);
    Result<std::vector<std::shared_ptr<Handler>>> Wait(
            std::optional<std::chrono::milliseconds> timeout);

@@ -53,6 +54,7 @@ class Epoll {

    android::base::unique_fd epoll_fd_;
    std::map<int, Info> epoll_handlers_;
    std::function<void()> first_callback_;
};

}  // namespace init
+5 −4
Original line number Diff line number Diff line
@@ -1061,6 +1061,11 @@ int SecondStageMain(int argc, char** argv) {
        PLOG(FATAL) << result.error();
    }

    // We always reap children before responding to the other pending functions. This is to
    // prevent a race where other daemons see that a service has exited and ask init to
    // start it again via ctl.start before init has reaped it.
    epoll.SetFirstCallback(ReapAnyOutstandingChildren);

    InstallSignalFdHandler(&epoll);
    InstallInitNotifier(&epoll);
    StartPropertyService(&property_fd);
@@ -1176,10 +1181,6 @@ int SecondStageMain(int argc, char** argv) {
        if (!pending_functions.ok()) {
            LOG(ERROR) << pending_functions.error();
        } else if (!pending_functions->empty()) {
            // We always reap children before responding to the other pending functions. This is to
            // prevent a race where other daemons see that a service has exited and ask init to
            // start it again via ctl.start before init has reaped it.
            ReapAnyOutstandingChildren();
            for (const auto& function : *pending_functions) {
                (*function)();
            }