Merge "ueventd: don't double fork firmware handlers" am: 0f4fb5497a
am: e944b7e0a4
Change-Id: Ifc8c586aa3b06ecb42bf20284c461b4b7c159bc7
This commit is contained in:
commit
1eee2122ca
2 changed files with 11 additions and 19 deletions
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue