From 76e850602285d7b8498b57f30c07b839fd1e2f10 Mon Sep 17 00:00:00 2001 From: Karl Seguin Date: Thu, 9 Oct 2025 13:18:47 +0800 Subject: [PATCH] Remove potential processing blocking with CDP When using CDP, we poll the HTTP clients along with the CDP socket. Because this polling can be long, we first process any pending message. This can end up processing _all_ messages, in which case the poll will block for a long time. This change makes it so that when the initial processing processes 1+ message, we do not poll, but rather return. This allows the page lifecycle to be processed normally (and not just blocking on poll, waiting for the CDP client to send data). --- src/cdp/domains/log.zig | 2 +- src/http/Client.zig | 11 ++++++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/cdp/domains/log.zig b/src/cdp/domains/log.zig index 717f4781..368a7954 100644 --- a/src/cdp/domains/log.zig +++ b/src/cdp/domains/log.zig @@ -106,7 +106,7 @@ pub fn LogInterceptor(comptime BC: type) type { }, .{ .session_id = self.bc.session_id, }) catch |err| { - log.err(.interceptor, "failed to send", .{.err = err}); + log.err(.interceptor, "failed to send", .{ .err = err }); }; } }; diff --git a/src/http/Client.zig b/src/http/Client.zig index 83046606..7eb84b24 100644 --- a/src/http/Client.zig +++ b/src/http/Client.zig @@ -393,7 +393,9 @@ fn perform(self: *Client, timeout_ms: c_int) !PerformStatus { // We're potentially going to block for a while until we get data. Process // whatever messages we have waiting ahead of time. - try self.processMessages(); + if (try self.processMessages()) { + return .normal; + } var status = PerformStatus.normal; if (self.extra_socket) |s| { @@ -411,12 +413,13 @@ fn perform(self: *Client, timeout_ms: c_int) !PerformStatus { try errorMCheck(c.curl_multi_poll(multi, null, 0, timeout_ms, null)); } - try self.processMessages(); + _ = try self.processMessages(); return status; } -fn processMessages(self: *Client) !void { +fn processMessages(self: *Client) !bool { const multi = self.multi; + var processed = false; var messages_count: c_int = 0; while (c.curl_multi_info_read(multi, &messages_count)) |msg_| { const msg: *c.CURLMsg = @ptrCast(msg_); @@ -475,10 +478,12 @@ fn processMessages(self: *Client) !void { .transfer = transfer, }); } + processed = true; } else |err| { self.requestFailed(transfer, err); } } + return processed; } fn endTransfer(self: *Client, transfer: *Transfer) void {