Fix zombie process issue caused by trace trigger
Add waitpid() to allow system to release the resource associated with the child.
Bug: 308344874
Test: No zombie process found with "$ps -A | grep trigger_perf" and no
app crash observed.
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:7a295ee33f794c443cbb8eb255dcb1caef45898f)
Merged-In: Ie8fe67a14034149dbebddf7931bc2e1d2f12d1fe
Change-Id: Ie8fe67a14034149dbebddf7931bc2e1d2f12d1fe
diff --git a/media/libstagefright/VideoRenderQualityTracker.cpp b/media/libstagefright/VideoRenderQualityTracker.cpp
index 3bd236a..5ec84a7 100644
--- a/media/libstagefright/VideoRenderQualityTracker.cpp
+++ b/media/libstagefright/VideoRenderQualityTracker.cpp
@@ -28,6 +28,7 @@
#include <cmath>
#include <stdio.h>
#include <sys/time.h>
+#include <sys/wait.h>
#include <android-base/macros.h>
#include <android-base/parsebool.h>
@@ -835,19 +836,28 @@
void VideoRenderQualityTracker::triggerTrace() {
// Trigger perfetto to stop always-on-tracing (AOT) to collect trace into a file for video
// freeze event, the collected trace categories are configured by AOT.
- const char* args[] = {"/system/bin/trigger_perfetto", "com.android.codec-video-freeze", NULL};
+ static const char* args[] = {"/system/bin/trigger_perfetto",
+ "com.android.codec-video-freeze", NULL};
+
pid_t pid = fork();
if (pid < 0) {
ALOGI("Failed to fork for triggering trace");
- return;
- }
- if (pid == 0) {
- // child process.
+ } else if (pid == 0) {
+ // Child process.
+ ALOGI("Trigger trace %s", args[1]);
execvp(args[0], const_cast<char**>(args));
ALOGW("Failed to trigger trace %s", args[1]);
_exit(1);
+ } else {
+ // Parent process.
+ int status;
+ // Wait for the child process (pid) gets terminated, and allow the system to release
+ // the resource associated with the child. Or the child process will remain in a
+ // zombie state and get killed by llkd to cause foreground app crash.
+ if (waitpid(pid, &status, 0) < 0) {
+ ALOGW("Failed to waitpid for triggering trace");
+ }
}
- ALOGI("Triggered trace %s", args[1]);
}
} // namespace android