diff options
author | Victor Stinner <vstinner@python.org> | 2020-12-26 00:45:43 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-26 00:45:43 (GMT) |
commit | 41010184880151d6ae02a226dbacc796e5c90d11 (patch) | |
tree | 5d87ed2b4392de3d7063b59f03d955b04f8b0eec /Include/internal/pycore_interp.h | |
parent | 77fde8dc16dc808b9f9838af1aa1253e15cab6ad (diff) | |
download | cpython-41010184880151d6ae02a226dbacc796e5c90d11.zip cpython-41010184880151d6ae02a226dbacc796e5c90d11.tar.gz cpython-41010184880151d6ae02a226dbacc796e5c90d11.tar.bz2 |
bpo-42745: Make the type cache per-interpreter (GH-23947)
Make the type attribute lookup cache per-interpreter.
Add private _PyType_InitCache() function, called by PyInterpreterState_New().
Continue to share next_version_tag between interpreters, since static
types are still shared by interpreters.
Remove MCACHE macro: the cache is no longer disabled if the
EXPERIMENTAL_ISOLATED_SUBINTERPRETERS macro is defined.
Diffstat (limited to 'Include/internal/pycore_interp.h')
-rw-r--r-- | Include/internal/pycore_interp.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/Include/internal/pycore_interp.h b/Include/internal/pycore_interp.h index 8c61802..339c2c4 100644 --- a/Include/internal/pycore_interp.h +++ b/Include/internal/pycore_interp.h @@ -180,6 +180,27 @@ struct atexit_state { }; +// Type attribute lookup cache: speed up attribute and method lookups, +// see _PyType_Lookup(). +struct type_cache_entry { + unsigned int version; // initialized from type->tp_version_tag + PyObject *name; // reference to exactly a str or None + PyObject *value; // borrowed reference or NULL +}; + +#define MCACHE_SIZE_EXP 12 +#define MCACHE_STATS 0 + +struct type_cache { + struct type_cache_entry hashtable[1 << MCACHE_SIZE_EXP]; +#if MCACHE_STATS + size_t hits; + size_t misses; + size_t collisions; +#endif +}; + + /* interpreter state */ #define _PY_NSMALLPOSINTS 257 @@ -284,6 +305,7 @@ struct _is { struct _Py_exc_state exc_state; struct ast_state ast; + struct type_cache type_cache; }; extern void _PyInterpreterState_ClearModules(PyInterpreterState *interp); |