[1/2] ole32: Rewrite transacted storage to be more lazy.

Vincent Povirk vincent at codeweavers.com
Wed May 5 14:23:12 CDT 2010

Sorry about the large patch, but I can't think of a way to break this up any further.

This patch series greatly cuts down on unnecessary copying in transacted storage. When creating a new transacted storage object (or reverting an existing one), rather than copy the original storage, we simply create a "stub directory entry" for the root. As stub entries are accessed, we fill in their data from the parent and create new stubs for any linked entries. The streams have copy on write semantics - reads are from the original entry until a change is made, then we make a copy in the scratch file.

When committing transacted storages, we have to create a new tree with the new data so that the storage entry can be modified in one step, but unmodified sections of the tree can now be shared between the new tree and the old. An entry can be shared if it and all entries reachable from it are unmodified. In the trivial case where nothing has been modified, we don't have to make a new tree at all.

We still have to copy unmodified streams in the case where modified entries are reachable from the stream's entry. The second patch in the series takes care of this by letting us make a new entry that points to the same stream as an existing entry. This is OK during a commit operation because only one entry will be reachable at a time, and the other will shortly be deleted.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20100505/08d431bd/attachment-0001.htm>
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: 0001-ole32-Rewrite-transacted-storage-to-be-more-lazy.txt
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20100505/08d431bd/attachment-0001.txt>

More information about the wine-patches mailing list