Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/util.py @ 23495:b25f07cb5399
util: add a 'nogc' decorator to disable the garbage collection
Garbage collection behave pathologically when creating a lot of containers. As
we do that more than once it become sensible to have a decorator for it. See
inline documentation for details.
author | Pierre-Yves David <pierre-yves.david@fb.com> |
---|---|
date | Thu, 04 Dec 2014 05:43:40 -0800 |
parents | 46265d0f0c7b |
children | 4dd8a6a1240d |
comparison
equal
deleted
inserted
replaced
23494:3849b89459b0 | 23495:b25f07cb5399 |
---|---|
18 import error, osutil, encoding | 18 import error, osutil, encoding |
19 import errno, shutil, sys, tempfile, traceback | 19 import errno, shutil, sys, tempfile, traceback |
20 import re as remod | 20 import re as remod |
21 import os, time, datetime, calendar, textwrap, signal, collections | 21 import os, time, datetime, calendar, textwrap, signal, collections |
22 import imp, socket, urllib | 22 import imp, socket, urllib |
23 import gc | |
23 | 24 |
24 if os.name == 'nt': | 25 if os.name == 'nt': |
25 import windows as platform | 26 import windows as platform |
26 else: | 27 else: |
27 import posix as platform | 28 import posix as platform |
542 return True | 543 return True |
543 | 544 |
544 def never(fn): | 545 def never(fn): |
545 return False | 546 return False |
546 | 547 |
548 def nogc(func): | |
549 """disable garbage collector | |
550 | |
551 Python's garbage collector triggers a GC each time a certain number of | |
552 container objects (the number being defined by gc.get_threshold()) are | |
553 allocated even when marked not to be tracked by the collector. Tracking has | |
554 no effect on when GCs are triggered, only on what objects the GC looks | |
555 into. As a workaround, disable GC while building complexe (huge) | |
556 containers. | |
557 | |
558 This garbage collector issue have been fixed in 2.7. | |
559 """ | |
560 def wrapper(*args, **kwargs): | |
561 gcenabled = gc.isenabled() | |
562 gc.disable() | |
563 try: | |
564 return func(*args, **kwargs) | |
565 finally: | |
566 if gcenabled: | |
567 gc.enable() | |
568 return wrapper | |
569 | |
547 def pathto(root, n1, n2): | 570 def pathto(root, n1, n2): |
548 '''return the relative path from one place to another. | 571 '''return the relative path from one place to another. |
549 root should use os.sep to separate directories | 572 root should use os.sep to separate directories |
550 n1 should use os.sep to separate directories | 573 n1 should use os.sep to separate directories |
551 n2 should use "/" to separate directories | 574 n2 should use "/" to separate directories |