@@ -78,8 +78,8 @@ static inline PyObject *CPy_GetAttrRef(PyObject **field) {
7878// use-after-free race that CPy_GetAttrRef guards against cannot happen: the field
7979// holds a strong reference for the object's whole lifetime, and any thread reading
8080// it necessarily holds 'self', which keeps the value alive. So the try-incref +
81- // _Py_NewRefWithLock fallback are unnecessary here -- a
82- // plain load + Py_INCREF is safe. A cross-thread Py_INCREF is an unconditional
81+ // _Py_NewRefWithLock fallback are unnecessary here -- a plain load + Py_INCREF is
82+ // safe. A cross-thread Py_INCREF is an unconditional
8383// atomic add on ob_ref_shared, so (unlike CPy_GetAttrRef's try-incref) it needs no
8484// maybe-weakref and has no slow path. The load is relaxed rather than acquire: the
8585// reader reached 'self' through a synchronization edge (self's own publication)
@@ -99,8 +99,8 @@ static inline PyObject *CPy_GetAttrRefFinal(PyObject **field) {
9999// CPy_GetAttrRef reads the field optimistically without holding any lock the
100100// writer also takes, so a reader can load the old pointer and then try to take a
101101// reference after this store. The old value must therefore stay alive until every
102- // thread has passed a quiescent point, which is
103- // exactly what a QSBR-deferred decref guarantees. So all mortal old values are
102+ // thread has passed a quiescent point, which is exactly what a QSBR-deferred
103+ // decref guarantees. So all mortal old values are
104104// reclaimed via _PyObject_XDecRefDelayed, matching CPython's own replace-a-slot
105105// paths (e.g. _PyObject_SetDict / _PyObject_SetManagedDict).
106106//
0 commit comments