changeset 28960:14e683d6b273

transaction: clear callback instances after usage Prevents double usage and helps reduce reference cycles, which were observed to occur in `hg convert` and other scenarios where there are multiple transactions per process.
author Gregory Szorc <gregory.szorc@gmail.com>
date Sat, 16 Apr 2016 09:02:37 -0700
parents 518c3e392f75
children 2e58dc022caa
files mercurial/transaction.py
diffstat 1 files changed, 6 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/transaction.py	Sat Apr 16 09:00:15 2016 -0700
+++ b/mercurial/transaction.py	Sat Apr 16 09:02:37 2016 -0700
@@ -431,6 +431,8 @@
             categories = sorted(self._finalizecallback)
             for cat in categories:
                 self._finalizecallback[cat](self)
+            # Prevent double usage and help clear cycles.
+            self._finalizecallback = None
             self._generatefiles(group=GenerationGroup.POSTFINALIZE)
 
         self.count -= 1
@@ -486,6 +488,8 @@
         categories = sorted(self._postclosecallback)
         for cat in categories:
             self._postclosecallback[cat](self)
+        # Prevent double usage and help clear cycles.
+        self._postclosecallback = None
 
     @active
     def abort(self):
@@ -539,6 +543,8 @@
             try:
                 for cat in sorted(self._abortcallback):
                     self._abortcallback[cat](self)
+                # Prevent double usage and help clear cycles.
+                self._abortcallback = None
                 _playback(self.journal, self.report, self.opener, self._vfsmap,
                           self.entries, self._backupentries, False)
                 self.report(_("rollback completed\n"))