IJPL-164884 Shutdown CEF when some subprocess constantly recreates

(cherry picked from commit 69146b91cf563fa11dc7dedfb8c3ac84aad50284)

IJ-CR-148229

GitOrigin-RevId: f59ba49b1ae019b170b966a09452f6c56b2214b5
This commit is contained in:
Artem Bochkarev
2024-10-28 12:42:50 +04:00
committed by intellij-monorepo-bot
parent da2936d4a4
commit cd45476ae1

View File

@@ -480,14 +480,21 @@ public final class JBCefApp {
private static class MyCefAppHandler extends CefAppHandlerAdapter { private static class MyCefAppHandler extends CefAppHandlerAdapter {
private final int myGPUCrashLimit; private final int myGPUCrashLimit;
private int myGPUCrashCounter = 0; private final int myTotalCrashLimit;
private int myGPULaunchCounter = 0;
private int myLaunchCounter = 0;
private boolean myNotificationShown = false; private boolean myNotificationShown = false;
private final String myArgs; private final String myArgs;
MyCefAppHandler(String @Nullable [] args, boolean trackGPUCrashes) { MyCefAppHandler(String @Nullable [] args, boolean trackGPUCrashes) {
super(args); super(args);
myArgs = Arrays.toString(args); myArgs = Arrays.toString(args);
myGPUCrashLimit = trackGPUCrashes ? Integer.getInteger("ide.browser.jcef.gpu.infinitecrash.internallimit", 10) : -1; if (trackGPUCrashes) {
myGPUCrashLimit = Integer.getInteger("ide.browser.jcef.gpu.infinitecrash.internallimit", 10);
myTotalCrashLimit = myGPUCrashLimit*2;
} else {
myGPUCrashLimit = myTotalCrashLimit = -1;
}
} }
@Override @Override
@@ -520,12 +527,22 @@ public final class JBCefApp {
@Override @Override
public void onBeforeChildProcessLaunch(String command_line) { public void onBeforeChildProcessLaunch(String command_line) {
if (myGPUCrashLimit >= 0 && command_line != null && command_line.contains("--type=gpu-process")) { ++myLaunchCounter;
if (++myGPUCrashCounter > myGPUCrashLimit && !myNotificationShown) { if (command_line == null)
return;
if (command_line.contains("--type=gpu-process")) {
++myGPULaunchCounter;
if (myGPUCrashLimit >= 0 && myGPULaunchCounter > myGPUCrashLimit && !myNotificationShown) {
ApplicationManager.getApplication().executeOnPooledThread(() -> SettingsHelper.showNotificationDisableGPU()); ApplicationManager.getApplication().executeOnPooledThread(() -> SettingsHelper.showNotificationDisableGPU());
myNotificationShown = true; myNotificationShown = true;
} }
} }
if (myTotalCrashLimit >= 0) {
if (myLaunchCounter > myTotalCrashLimit) {
ApplicationManager.getApplication().executeOnPooledThread(() -> CefApp.getInstance().dispose());
}
}
} }
} }