mirror of
https://github.com/python/cpython.git
synced 2025-08-03 16:39:00 +00:00
gh-90815: Add mimalloc memory allocator (#109914)
* Add mimalloc v2.12 Modified src/alloc.c to remove include of alloc-override.c and not compile new handler. Did not include the following files: - include/mimalloc-new-delete.h - include/mimalloc-override.h - src/alloc-override-osx.c - src/alloc-override.c - src/static.c - src/region.c mimalloc is thread safe and shares a single heap across all runtimes, therefore finalization and getting global allocated blocks across all runtimes is different. * mimalloc: minimal changes for use in Python: - remove debug spam for freeing large allocations - use same bytes (0xDD) for freed allocations in CPython and mimalloc This is important for the test_capi debug memory tests * Don't export mimalloc symbol in libpython. * Enable mimalloc as Python allocator option. * Add mimalloc MIT license. * Log mimalloc in Lib/test/pythoninfo.py. * Document new mimalloc support. * Use macro defs for exports as done in: https://github.com/python/cpython/pull/31164/ Co-authored-by: Sam Gross <colesbury@gmail.com> Co-authored-by: Christian Heimes <christian@python.org> Co-authored-by: Victor Stinner <vstinner@python.org>
This commit is contained in:
parent
4ebf2fae96
commit
05f2f0ac92
61 changed files with 16792 additions and 161 deletions
|
@ -11,6 +11,11 @@ ALLOWED_PREFIXES = ('Py', '_Py')
|
|||
if sys.platform == 'darwin':
|
||||
ALLOWED_PREFIXES += ('__Py',)
|
||||
|
||||
# mimalloc doesn't use static, but it's symbols are not exported
|
||||
# from the shared library. They do show up in the static library
|
||||
# before its linked into an executable.
|
||||
ALLOWED_STATIC_PREFIXES = ('mi_', '_mi_')
|
||||
|
||||
# "Legacy": some old symbols are prefixed by "PY_".
|
||||
EXCEPTIONS = frozenset({
|
||||
'PY_TIMEOUT_MAX',
|
||||
|
@ -59,7 +64,7 @@ def get_exported_symbols(library, dynamic=False):
|
|||
return stdout
|
||||
|
||||
|
||||
def get_smelly_symbols(stdout):
|
||||
def get_smelly_symbols(stdout, dynamic=False):
|
||||
smelly_symbols = []
|
||||
python_symbols = []
|
||||
local_symbols = []
|
||||
|
@ -77,7 +82,9 @@ def get_smelly_symbols(stdout):
|
|||
symbol = parts[-1]
|
||||
result = '%s (type: %s)' % (symbol, symtype)
|
||||
|
||||
if symbol.startswith(ALLOWED_PREFIXES) or symbol in EXCEPTIONS:
|
||||
if (symbol.startswith(ALLOWED_PREFIXES) or
|
||||
symbol in EXCEPTIONS or
|
||||
(not dynamic and symbol.startswith(ALLOWED_STATIC_PREFIXES))):
|
||||
python_symbols.append(result)
|
||||
continue
|
||||
|
||||
|
@ -95,7 +102,7 @@ def get_smelly_symbols(stdout):
|
|||
|
||||
def check_library(library, dynamic=False):
|
||||
nm_output = get_exported_symbols(library, dynamic)
|
||||
smelly_symbols, python_symbols = get_smelly_symbols(nm_output)
|
||||
smelly_symbols, python_symbols = get_smelly_symbols(nm_output, dynamic)
|
||||
|
||||
if not smelly_symbols:
|
||||
print(f"OK: no smelly symbol found ({len(python_symbols)} Python symbols)")
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue