mirror of
https://github.com/python/cpython.git
synced 2025-09-27 02:39:58 +00:00
gh-131586: Avoid refcount contention in some "special" calls (#131588)
In the free threaded build, the `_PyObject_LookupSpecial()` call can lead to reference count contention on the returned function object becuase it doesn't use stackrefs. Refactor some of the callers to use `_PyObject_MaybeCallSpecialNoArgs`, which uses stackrefs internally. This fixes the scaling bottleneck in the "lookup_special" microbenchmark in `ftscalingbench.py`. However, the are still some uses of `_PyObject_LookupSpecial()` that need to be addressed in future PRs.
This commit is contained in:
parent
3d4ac1a2c2
commit
67fbfb42bd
16 changed files with 450 additions and 374 deletions
|
@ -891,6 +891,12 @@ extern bool _PyObject_TryGetInstanceAttribute(PyObject *obj, PyObject *name,
|
|||
extern PyObject *_PyType_LookupRefAndVersion(PyTypeObject *, PyObject *,
|
||||
unsigned int *);
|
||||
|
||||
// Internal API to look for a name through the MRO.
|
||||
// This stores a stack reference in out and returns the value of
|
||||
// type->tp_version or zero if name is missing. It doesn't set an exception!
|
||||
extern unsigned int
|
||||
_PyType_LookupStackRefAndVersion(PyTypeObject *type, PyObject *name, _PyStackRef *out);
|
||||
|
||||
// Cache the provided init method in the specialization cache of type if the
|
||||
// provided type version matches the current version of the type.
|
||||
//
|
||||
|
@ -946,6 +952,14 @@ extern int _PyObject_IsInstanceDictEmpty(PyObject *);
|
|||
PyAPI_FUNC(PyObject*) _PyObject_LookupSpecial(PyObject *, PyObject *);
|
||||
PyAPI_FUNC(PyObject*) _PyObject_LookupSpecialMethod(PyObject *self, PyObject *attr, PyObject **self_or_null);
|
||||
|
||||
// Calls the method named `attr` on `self`, but does not set an exception if
|
||||
// the attribute does not exist.
|
||||
PyAPI_FUNC(PyObject *)
|
||||
_PyObject_MaybeCallSpecialNoArgs(PyObject *self, PyObject *attr);
|
||||
|
||||
PyAPI_FUNC(PyObject *)
|
||||
_PyObject_MaybeCallSpecialOneArg(PyObject *self, PyObject *attr, PyObject *arg);
|
||||
|
||||
extern int _PyObject_IsAbstract(PyObject *);
|
||||
|
||||
PyAPI_FUNC(int) _PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue