D1457: workers: create backgroundcloser per thread

wlis (Wojciech Lis) phabricator at mercurial-scm.org
Mon Nov 20 13:37:13 EST 2017


wlis created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  This allows to create _backgroundfilecloser per thread.
  The threading.local() manages the distinct storage between threads and works for main thread as well (if no actuall threading is used)

TEST PLAN
  Ran pull, update, sparse commands and watched the closer threads created and destroyed in procexp.exe
  
  ran test on CentOS. No tests broken compared to the base

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  mercurial/vfs.py

CHANGE DETAILS

diff --git a/mercurial/vfs.py b/mercurial/vfs.py
--- a/mercurial/vfs.py
+++ b/mercurial/vfs.py
@@ -269,27 +269,27 @@
         for dirpath, dirs, files in os.walk(self.join(path), onerror=onerror):
             yield (dirpath[prefixlen:], dirs, files)
 
+    threaddata = threading.local()
+
     @contextlib.contextmanager
     def backgroundclosing(self, ui, expectedcount=-1):
         """Allow files to be closed asynchronously.
 
         When this context manager is active, ``backgroundclose`` can be passed
         to ``__call__``/``open`` to result in the file possibly being closed
         asynchronously, on a background thread.
         """
-        # This is an arbitrary restriction and could be changed if we ever
-        # have a use case.
         vfs = getattr(self, 'vfs', self)
-        if getattr(vfs, '_backgroundfilecloser', None):
+        if getattr(vfs.threaddata, '_backgroundfilecloser', None):
             raise error.Abort(
-                _('can only have 1 active background file closer'))
+                _('can only have 1 active background file closer per thread'))
 
         with backgroundfilecloser(ui, expectedcount=expectedcount) as bfc:
             try:
-                vfs._backgroundfilecloser = bfc
+                vfs.threaddata._backgroundfilecloser = bfc
                 yield bfc
             finally:
-                vfs._backgroundfilecloser = None
+                vfs.threaddata._backgroundfilecloser = None
 
 class vfs(abstractvfs):
     '''Operate files relative to a base directory
@@ -414,12 +414,12 @@
             fp = checkambigatclosing(fp)
 
         if backgroundclose:
-            if not self._backgroundfilecloser:
+            if not self.threaddata._backgroundfilecloser:
                 raise error.Abort(_('backgroundclose can only be used when a '
                                   'backgroundclosing context manager is active')
                                   )
 
-            fp = delayclosedfile(fp, self._backgroundfilecloser)
+            fp = delayclosedfile(fp, self.threaddata._backgroundfilecloser)
 
         return fp
 



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


More information about the Mercurial-devel mailing list