mirror of
https://github.com/lightpanda-io/browser.git
synced 2026-04-04 00:20:32 +00:00
Move finalizers to pure reference counting
Takes https://github.com/lightpanda-io/browser/pull/2024 a step further and changes all reference counting to be explicit. Up until this point, finalizers_callback was seen as a fail-safe to make sure that instances were released no matter what. It exists because v8 might never call a finalizer, so we need to keep track of finalizables and finalize them on behalf of v8. BUT, it was used as more than a fallback for v8...it allowed us to be lazy and acquireRef's in Zig without a matching releaseRef (1), because why not, the finalizer_callback will handle it. This commit redefines finalizer_callbacks as strictly being a fallback for v8. If v8 calls the finalizer, then the finalizer callback is removed (2) - we lose our fail-safe. This means that every acquireRef must be matched with a releaseRef. Everything is explicit now. The most obvious impact of this is that on Page.deinit, we have to releaseRef every MO, IO and blob held by the page. This change removes a number of special-cases to deal with various ownership patterns. For example, Iterators are now properly reference counted and when their RC reaches 0, they can safely releaseRef on their list. This also elimites use-after-free potential when 2 RC objects reference each other. This should eliminate some WPT crashes (e.g. /editing/run/insertimage.html) (1) - We were only ever lazy about releaseRef during shutdown, so this change won't result in more aggressive collection. (2) Since 1 object can be referenced from 0-N IsolatedWorlds, it would be more accurate to say that the finalizer callback is removed when all referencing IsolatedWorld finalize it.
This commit is contained in:
@@ -259,9 +259,6 @@ pub fn RC(comptime T: type) type {
|
||||
return;
|
||||
}
|
||||
value.deinit(session);
|
||||
if (session.finalizer_callbacks.fetchRemove(@intFromPtr(value))) |kv| {
|
||||
session.releaseArena(kv.value.arena);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn format(self: @This(), writer: *std.Io.Writer) !void {
|
||||
|
||||
Reference in New Issue
Block a user