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

Commit 0f4fb549 authored by Tom Cherry's avatar Tom Cherry Committed by Gerrit Code Review
Browse files

Merge "ueventd: don't double fork firmware handlers"

parents b3915d11 0f296e06
Loading
Loading
Loading
Loading
+4 −19
Original line number Diff line number Diff line
@@ -110,19 +110,9 @@ void HandleFirmwareEvent(const Uevent& uevent) {
    if (uevent.subsystem != "firmware" || uevent.action != "add") return;

    // Loading the firmware in a child means we can do that in parallel...
    // We double fork instead of waiting for these processes.
    pid_t pid = fork();
    auto pid = fork();
    if (pid == -1) {
        PLOG(ERROR) << "could not fork to process firmware event for " << uevent.firmware;
        return;
    }

    if (pid == 0) {
        pid = fork();
        if (pid == -1) {
            PLOG(ERROR) << "could not fork a sceond time to process firmware event for "
                        << uevent.firmware;
            _exit(EXIT_FAILURE);
    }
    if (pid == 0) {
        Timer t;
@@ -130,11 +120,6 @@ void HandleFirmwareEvent(const Uevent& uevent) {
        LOG(INFO) << "loading " << uevent.path << " took " << t;
        _exit(EXIT_SUCCESS);
    }

        _exit(EXIT_SUCCESS);
    }

    waitpid(pid, nullptr, 0);
}

}  // namespace init
+7 −0
Original line number Diff line number Diff line
@@ -268,6 +268,13 @@ int ueventd_main(int argc, char** argv) {
        cold_boot.Run();
    }

    // We use waitpid() in ColdBoot, so we can't ignore SIGCHLD until now.
    signal(SIGCHLD, SIG_IGN);
    // Reap and pending children that exited between the last call to waitpid() and setting SIG_IGN
    // for SIGCHLD above.
    while (waitpid(-1, nullptr, WNOHANG) > 0) {
    }

    uevent_listener.Poll([&device_handler](const Uevent& uevent) {
        HandleFirmwareEvent(uevent);
        device_handler.HandleDeviceEvent(uevent);