Skip to content

Commit 1651fa3

Browse files
committed
Address code review
1 parent ae5b6a4 commit 1651fa3

5 files changed

Lines changed: 27 additions & 27 deletions

File tree

Include/internal/pycore_object.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,27 @@ _Py_TryIncref(PyObject *op)
767767
#endif
768768
}
769769

770+
// Enqueue an object to be freed possibly after some delay
771+
#ifdef Py_GIL_DISABLED
772+
PyAPI_FUNC(void) _PyObject_XDecRefDelayed(PyObject *obj);
773+
#else
774+
static inline void _PyObject_XDecRefDelayed(PyObject *obj)
775+
{
776+
Py_XDECREF(obj);
777+
}
778+
#endif
779+
780+
#ifdef Py_GIL_DISABLED
781+
// Same as `Py_XSETREF` but in free-threading, it stores the object atomically
782+
// and queues the old object to be decrefed at a safe point using QSBR.
783+
PyAPI_FUNC(void) _PyObject_XSetRefDelayed(PyObject **p_obj, PyObject *obj);
784+
#else
785+
static inline void _PyObject_XSetRefDelayed(PyObject **p_obj, PyObject *obj)
786+
{
787+
Py_XSETREF(*p_obj, obj);
788+
}
789+
#endif
790+
770791
#ifdef Py_REF_DEBUG
771792
extern void _PyInterpreterState_FinalizeRefTotal(PyInterpreterState *);
772793
extern void _Py_FinalizeRefTotal(_PyRuntimeState *);

Include/internal/pycore_pymem.h

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -90,27 +90,6 @@ extern int _PyMem_DebugEnabled(void);
9090
// Enqueue a pointer to be freed possibly after some delay.
9191
extern void _PyMem_FreeDelayed(void *ptr);
9292

93-
// Enqueue an object to be freed possibly after some delay
94-
#ifdef Py_GIL_DISABLED
95-
PyAPI_FUNC(void) _PyObject_XDecRefDelayed(PyObject *obj);
96-
#else
97-
static inline void _PyObject_XDecRefDelayed(PyObject *obj)
98-
{
99-
Py_XDECREF(obj);
100-
}
101-
#endif
102-
103-
#ifdef Py_GIL_DISABLED
104-
// Same as `Py_XSETREF` but in free-threading, it stores the object atomically
105-
// and queues the old object to be decrefed at a safe point using QSBR.
106-
PyAPI_FUNC(void) _PyObject_XSetRefDelayed(PyObject **p_obj, PyObject *obj);
107-
#else
108-
static inline void _PyObject_XSetRefDelayed(PyObject **p_obj, PyObject *obj)
109-
{
110-
Py_XSETREF(*p_obj, obj);
111-
}
112-
#endif
113-
11493
// Periodically process delayed free requests.
11594
extern void _PyMem_ProcessDelayed(PyThreadState *tstate);
11695

Objects/genobject.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -705,7 +705,7 @@ static PyObject *
705705
gen_get_name(PyObject *self, void *Py_UNUSED(ignored))
706706
{
707707
PyGenObject *op = _PyGen_CAST(self);
708-
PyObject *name = FT_ATOMIC_LOAD_PTR_RELAXED(op->gi_name);
708+
PyObject *name = FT_ATOMIC_LOAD_PTR_ACQUIRE(op->gi_name);
709709
return Py_NewRef(name);
710710
}
711711

@@ -721,7 +721,7 @@ gen_set_name(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
721721
return -1;
722722
}
723723
Py_BEGIN_CRITICAL_SECTION(self);
724-
// gh-133931: To prevent use-after-free from other threads that reference
724+
// gh-133980: To prevent use-after-free from other threads that reference
725725
// the gi_name.
726726
_PyObject_XSetRefDelayed(&op->gi_name, Py_NewRef(value));
727727
Py_END_CRITICAL_SECTION();
@@ -732,7 +732,7 @@ static PyObject *
732732
gen_get_qualname(PyObject *self, void *Py_UNUSED(ignored))
733733
{
734734
PyGenObject *op = _PyGen_CAST(self);
735-
PyObject *qualname = FT_ATOMIC_LOAD_PTR_RELAXED(op->gi_qualname);
735+
PyObject *qualname = FT_ATOMIC_LOAD_PTR_ACQUIRE(op->gi_qualname);
736736
return Py_NewRef(qualname);
737737
}
738738

@@ -748,7 +748,7 @@ gen_set_qualname(PyObject *self, PyObject *value, void *Py_UNUSED(ignored))
748748
return -1;
749749
}
750750
Py_BEGIN_CRITICAL_SECTION(self);
751-
// gh-133931: To prevent use-after-free from other threads that reference
751+
// gh-133980: To prevent use-after-free from other threads that reference
752752
// the gi_qualname.
753753
_PyObject_XSetRefDelayed(&op->gi_qualname, Py_NewRef(value));
754754
Py_END_CRITICAL_SECTION();

Objects/obmalloc.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1235,7 +1235,7 @@ _PyObject_XDecRefDelayed(PyObject *ptr)
12351235
void
12361236
_PyObject_XSetRefDelayed(PyObject **ptr, PyObject *value)
12371237
{
1238-
PyObject *old = FT_ATOMIC_LOAD_PTR_ACQUIRE(*ptr);
1238+
PyObject *old = *ptr;
12391239
FT_ATOMIC_STORE_PTR_RELEASE(*ptr, value);
12401240
if (old == NULL) {
12411241
return;

Objects/typeobject.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3967,7 +3967,7 @@ _PyObject_SetDict(PyObject *obj, PyObject *value)
39673967
return -1;
39683968
}
39693969
Py_BEGIN_CRITICAL_SECTION(obj);
3970-
// gh-133931: To prevent use-after-free from other threads that reference
3970+
// gh-133980: To prevent use-after-free from other threads that reference
39713971
// the __dict__
39723972
_PyObject_XSetRefDelayed(dictptr, Py_NewRef(value));
39733973
Py_END_CRITICAL_SECTION();

0 commit comments

Comments
 (0)