fix: stabilize runtime follow-up regressions

This commit is contained in:
udo
2026-06-11 23:03:07 +00:00
parent 7f757654b6
commit 20db669589
37 changed files with 906 additions and 144 deletions
+11 -4
View File
@@ -18,7 +18,10 @@ static sigjmp_buf request_fault_jmp;
static volatile sig_atomic_t request_fault_active = 0;
static volatile sig_atomic_t request_fault_signal = 0;
static Request* request_fault_request = 0;
static String request_fault_trace = "";
// Raw frame pointers only: the signal handler must not allocate, so frames are
// captured here and symbolized after the siglongjmp.
static void* request_fault_frames[64];
static volatile sig_atomic_t request_fault_frame_count = 0;
static int websocket_exec_fd = -1;
static String websocket_exec_read_buffer = "";
static std::deque<DTree> websocket_exec_pending_jobs;
@@ -105,7 +108,7 @@ void on_request_fault_signal(int sig)
request_fault_signal = sig;
if(request_fault_active && request_fault_request)
{
request_fault_trace = capture_backtrace_string(32, 1);
request_fault_frame_count = backtrace(request_fault_frames, 64);
siglongjmp(request_fault_jmp, 1);
}
on_segfault(sig);
@@ -887,7 +890,7 @@ int handle_complete(FastCGIRequest& request) {
request_fault_request = &request;
request_fault_active = 1;
request_fault_signal = 0;
request_fault_trace = "";
request_fault_frame_count = 0;
install_request_fault_handlers();
String failure_title = "";
@@ -898,7 +901,7 @@ int handle_complete(FastCGIRequest& request) {
{
failure_title = "fatal signal during request";
failure_details = "worker recovered before closing the upstream connection";
failure_trace = request_fault_trace;
failure_trace = backtrace_frames_string(request_fault_frames, request_fault_frame_count, 1);
}
else
{
@@ -1502,6 +1505,10 @@ void init_base_process()
int main(int argc, char** argv)
{
// Warm up libgcc's backtrace state so the first in-handler backtrace()
// after a fault does not allocate.
backtrace(request_fault_frames, 4);
init_base_process();
ensure_proactive_compiler();