Skip to content

Commit bcccf1f

Browse files
authored
gh-112075: Add gc shared bits (#114931)
Add GC shared flags for objects to the GC bit states in free-threaded builds
1 parent 36518e6 commit bcccf1f

File tree

1 file changed

+17
-0
lines changed

1 file changed

+17
-0
lines changed

Include/internal/pycore_gc.h

+17
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ static inline PyObject* _Py_FROM_GC(PyGC_Head *gc) {
4343
# define _PyGC_BITS_FINALIZED (2)
4444
# define _PyGC_BITS_UNREACHABLE (4)
4545
# define _PyGC_BITS_FROZEN (8)
46+
# define _PyGC_BITS_SHARED (16)
4647
#endif
4748

4849
/* True if the object is currently tracked by the GC. */
@@ -68,6 +69,22 @@ static inline int _PyObject_GC_MAY_BE_TRACKED(PyObject *obj) {
6869
return 1;
6970
}
7071

72+
#ifdef Py_GIL_DISABLED
73+
74+
/* True if an object is shared between multiple threads and
75+
* needs special purpose when freeing to do the possibility
76+
* of in-flight lock-free reads occuring */
77+
static inline int _PyObject_GC_IS_SHARED(PyObject *op) {
78+
return (op->ob_gc_bits & _PyGC_BITS_SHARED) != 0;
79+
}
80+
#define _PyObject_GC_IS_SHARED(op) _PyObject_GC_IS_SHARED(_Py_CAST(PyObject*, op))
81+
82+
static inline void _PyObject_GC_SET_SHARED(PyObject *op) {
83+
op->ob_gc_bits |= _PyGC_BITS_SHARED;
84+
}
85+
#define _PyObject_GC_SET_SHARED(op) _PyObject_GC_SET_SHARED(_Py_CAST(PyObject*, op))
86+
87+
#endif
7188

7289
/* Bit flags for _gc_prev */
7390
/* Bit 0 is set when tp_finalize is called */

0 commit comments

Comments
 (0)