nocg: make the utility work are both a decorator and context manager
In some case, the context manager version will be simpler.
--- a/mercurial/util.py Tue Mar 26 11:24:20 2024 +0000
+++ b/mercurial/util.py Tue Mar 26 13:28:52 2024 +0000
@@ -35,6 +35,7 @@
import warnings
from typing import (
+ Any,
Iterable,
Iterator,
List,
@@ -1812,7 +1813,7 @@
return False
-def nogc(func):
+def nogc(func=None) -> Any:
"""disable garbage collector
Python's garbage collector triggers a GC each time a certain number of
@@ -1825,15 +1826,27 @@
This garbage collector issue have been fixed in 2.7. But it still affect
CPython's performance.
"""
-
+ if func is None:
+ return _nogc_context()
+ else:
+ return _nogc_decorator(func)
+
+
+@contextlib.contextmanager
+def _nogc_context():
+ gcenabled = gc.isenabled()
+ gc.disable()
+ try:
+ yield
+ finally:
+ if gcenabled:
+ gc.enable()
+
+
+def _nogc_decorator(func):
def wrapper(*args, **kwargs):
- gcenabled = gc.isenabled()
- gc.disable()
- try:
+ with _nogc_context():
return func(*args, **kwargs)
- finally:
- if gcenabled:
- gc.enable()
return wrapper