Merge "ueventd: don't double fork firmware handlers" am: 0f4fb5497a

am: e944b7e0a4

Change-Id: Ifc8c586aa3b06ecb42bf20284c461b4b7c159bc7
This commit is contained in:
Tom Cherry 2017-07-06 02:21:26 +00:00 committed by android-build-merger
commit 1eee2122ca
2 changed files with 11 additions and 19 deletions

View file

@ -110,31 +110,16 @@ void HandleFirmwareEvent(const Uevent& uevent) {
if (uevent.subsystem != "firmware" || uevent.action != "add") return; if (uevent.subsystem != "firmware" || uevent.action != "add") return;
// Loading the firmware in a child means we can do that in parallel... // Loading the firmware in a child means we can do that in parallel...
// We double fork instead of waiting for these processes. auto pid = fork();
pid_t pid = fork();
if (pid == -1) { if (pid == -1) {
PLOG(ERROR) << "could not fork to process firmware event for " << uevent.firmware; PLOG(ERROR) << "could not fork to process firmware event for " << uevent.firmware;
return;
} }
if (pid == 0) { if (pid == 0) {
pid = fork(); Timer t;
if (pid == -1) { ProcessFirmwareEvent(uevent);
PLOG(ERROR) << "could not fork a sceond time to process firmware event for " LOG(INFO) << "loading " << uevent.path << " took " << t;
<< uevent.firmware;
_exit(EXIT_FAILURE);
}
if (pid == 0) {
Timer t;
ProcessFirmwareEvent(uevent);
LOG(INFO) << "loading " << uevent.path << " took " << t;
_exit(EXIT_SUCCESS);
}
_exit(EXIT_SUCCESS); _exit(EXIT_SUCCESS);
} }
waitpid(pid, nullptr, 0);
} }
} // namespace init } // namespace init

View file

@ -268,6 +268,13 @@ int ueventd_main(int argc, char** argv) {
cold_boot.Run(); 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) { uevent_listener.Poll([&device_handler](const Uevent& uevent) {
HandleFirmwareEvent(uevent); HandleFirmwareEvent(uevent);
device_handler.HandleDeviceEvent(uevent); device_handler.HandleDeviceEvent(uevent);