mirror of
https://github.com/fergalmoran/ladybird.git
synced 2026-03-19 20:06:29 +00:00
When cloning an AnonymousVMObject, committed COW pages are shared between the parent and child object. Whicever object COW's first will take the shared committed page, and if the other object ends up doing a COW as well, it will notice that the page is no longer shared by two objects and simple remap it as read/write. When a child is COW'ed again, while still having shared committed pages with its own parent, the grandchild object will now join in the sharing pool with its parent and grandparent. This means that the first 2 of 3 objects that COW will draw from the shared committed pages, and 3rd will remap read/write. Previously, we would "fork" the shared committed pages when cloning, which could lead to a situation where the grandparent held on to 1 of the 3 needed shared committed pages. If both the child and grandchild COW'ed, they wouldn't have enough pages, and since the grandparent maintained an extra +1 ref count on the page, it wasn't possible to to remap read/write.