|
| 1 | +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| 2 | +From: Yang Liu < [email protected]> |
| 3 | +Date: Wed, 5 Mar 2025 17:22:39 +0800 |
| 4 | +Subject: feat: add oom_error_callback in node::IsolateSettings |
| 5 | + |
| 6 | +Expose v8::OOMErrorCallback to allow setting OOM error handler outside Node.js |
| 7 | + |
| 8 | +As described in this issue https://github.com/electron/electron/issues/45894, |
| 9 | +Electron fails to capture js heap oom because node::OOMErrorHandler just |
| 10 | +terminates the process without raising an exception. |
| 11 | + |
| 12 | +To fix this issue, provide the interface oom_error_callback to enable a |
| 13 | +custom oom error callback set from Electron. |
| 14 | + |
| 15 | +diff --git a/src/api/environment.cc b/src/api/environment.cc |
| 16 | +index 32fc075e97eebca6c47e796ac5308915746ffa2a..e72bee385865c7d34e9eea6b90c6d911d592f8af 100644 |
| 17 | +--- a/src/api/environment.cc |
| 18 | ++++ b/src/api/environment.cc |
| 19 | +@@ -241,7 +241,10 @@ void SetIsolateErrorHandlers(v8::Isolate* isolate, const IsolateSettings& s) { |
| 20 | + auto* fatal_error_cb = s.fatal_error_callback ? |
| 21 | + s.fatal_error_callback : OnFatalError; |
| 22 | + isolate->SetFatalErrorHandler(fatal_error_cb); |
| 23 | +- isolate->SetOOMErrorHandler(OOMErrorHandler); |
| 24 | ++ |
| 25 | ++ auto* oom_error_cb = s.oom_error_callback ? |
| 26 | ++ s.oom_error_callback : OOMErrorHandler; |
| 27 | ++ isolate->SetOOMErrorHandler(oom_error_cb); |
| 28 | + |
| 29 | + if ((s.flags & SHOULD_NOT_SET_PREPARE_STACK_TRACE_CALLBACK) == 0) { |
| 30 | + auto* prepare_stack_trace_cb = s.prepare_stack_trace_callback ? |
| 31 | +diff --git a/src/node.h b/src/node.h |
| 32 | +index afb26ec5690ccd65a3c36f8b8a1b2de416b9d843..98ad0ea649eaef43d1f5231f7bc4044e100e08d7 100644 |
| 33 | +--- a/src/node.h |
| 34 | ++++ b/src/node.h |
| 35 | +@@ -489,6 +489,7 @@ struct IsolateSettings { |
| 36 | + v8::Isolate::AbortOnUncaughtExceptionCallback |
| 37 | + should_abort_on_uncaught_exception_callback = nullptr; |
| 38 | + v8::FatalErrorCallback fatal_error_callback = nullptr; |
| 39 | ++ v8::OOMErrorCallback oom_error_callback = nullptr; |
| 40 | + v8::PrepareStackTraceCallback prepare_stack_trace_callback = nullptr; |
| 41 | + |
| 42 | + // Miscellaneous callbacks |
0 commit comments