Description
Feature or enhancement
PEP 703 in large part relies on replacing the GIL with fine grained per-object locks. The primary way to acquire and release these locks is through the critical section API (#111569). In #111903, we added support for generating the necessary critical section calls in Argument Clinic wrapped methods. In #112205, this was extended to getters and setters as well.
However, some object behavior is implemented using "tp slots", which are not supported by Argument Clinic. These functions often need critical sections for thread-safety; that means more boilerplate code.
Here are some possible ideas on how to address this:
Add support for "tp slots" to Argument Clinic
We could add support for certain tp slots functions to Argument Clinic. This would provide a consistent way to add critical sections across both slots, getters/setters, and "regular" methods. The disadvantage is that "tp slots" don't need much argument parsing, so they may otherwise not be a great fit for Argument Clinic
Use C macros to wrap slot implementations with critical sections
We could implement an internal-only header that provides macros to wrap a given "tp slot" function with a critical section. For example, something like:
static PyObject *
list_richcompare_impl(PyObject *v, PyObject *w, int op)
{
// implement richcompare unchanged
}
// generates a list_richcompare() function with the correct Py_BEGIN/END_CRITICAL_SECTION()
_Py_CRITICAL_SECTION_TP_RICHCOMPARE(list_richcompare, list_richcompare_impl);
I think this would not be too difficult to implement -- probably easier than modifying Argument Clinic. The disadvantage is the lack of uniformity around how we add critical sections to functions.
Keep the status quo
We can always just keep adding the Py_BEGIN/END_CRITICAL_SECTION()
calls manually for tp slots.