Patchwork D6578: copies: document how 'copies' dict instances are reused

login
register
mail settings
Submitter phabricator
Date June 26, 2019, 12:20 p.m.
Message ID <differential-rev-PHID-DREV-ziacgzuf2b4vgklv2l4g-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/40681/
State Superseded
Headers show

Comments

phabricator - June 26, 2019, 12:20 p.m.
martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  We avoid copying these instances as much as we can, so it's not
  obvious what's safe to do with them. This patch tries to explain what
  is safe and what is not.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D6578

AFFECTED FILES
  mercurial/copies.py

CHANGE DETAILS




To: martinvonz, #hg-reviewers
Cc: mercurial-devel

Patch

diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -268,6 +268,10 @@ 
     # 'work' contains 3-tuples of a (revision number, parent number, copies).
     # The parent number is only used for knowing which parent the copies dict
     # came from.
+    # NOTE: To reduce costly copying the 'copies' dicts, we reuse the same
+    # instance for *one* of the child nodes (the last one). Once an instance
+    # has been put on the queue, it is thus no longer safe to modify it.
+    # Conversely, it *is* safe to modify an instance popped off the queue.
     work = [(r, 1, {}) for r in roots]
     heapq.heapify(work)
     alwaysmatch = match.always()