Skip to content

Commit 3718bea

Browse files
committed
REF: Simplify weak reference handling by removing threading compatibility checks
1 parent 0ed7a91 commit 3718bea

File tree

1 file changed

+15
-33
lines changed

1 file changed

+15
-33
lines changed

pandas/_libs/internals.pyx

Lines changed: 15 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,9 @@ from pandas._libs.util cimport (
2626
is_integer_object,
2727
)
2828

29-
# At the top of the file:
30-
DEF CYTHON_COMPATIBLE_WITH_FREE_THREADING = False # Or import from external config as needed
29+
# Use object-based weakref API (works across Cython versions)
30+
from cpython.weakref cimport PyWeakref_GetObject
3131

32-
IF CYTHON_COMPATIBLE_WITH_FREE_THREADING:
33-
from cpython.ref cimport Py_DECREF
34-
from cpython.weakref cimport PyWeakref_GetRef
35-
else:
36-
from cpython.weakref cimport PyWeakref_GetObject
37-
3832

3933
cdef extern from "Python.h":
4034
PyObject* Py_None
@@ -914,26 +908,13 @@ cdef class BlockValuesRefs:
914908
# if force=False. Clearing for every insertion causes slowdowns if
915909
# all these objects stay alive, e.g. df.items() for wide DataFrames
916910
# see GH#55245 and GH#55008
917-
IF CYTHON_COMPATIBLE_WITH_FREE_THREADING:
918-
cdef PyObject* pobj
919-
cdef bint status
920-
921-
if force or len(self.referenced_blocks) > self.clear_counter:
922-
IF CYTHON_COMPATIBLE_WITH_FREE_THREADING:
923-
new_referenced_blocks = []
924-
for ref in self.referenced_blocks:
925-
status = PyWeakref_GetRef(ref, &pobj)
926-
if status == -1:
927-
return
928-
elif status == 1:
929-
new_referenced_blocks.append(ref)
930-
Py_DECREF(<object>pobj)
931-
self.referenced_blocks = new_referenced_blocks
932-
ELSE:
933-
self.referenced_blocks = [
934-
ref for ref in self.referenced_blocks
935-
if PyWeakref_GetObject(ref) != Py_None
936-
]
911+
# No compile-time IF: always use object-based weakref check
912+
if force or len(self.referenced_blocks) > self.clear_counter:
913+
new_referenced_blocks = []
914+
for ref in self.referenced_blocks:
915+
if PyWeakref_GetObject(ref) != Py_None:
916+
new_referenced_blocks.append(ref)
917+
self.referenced_blocks = new_referenced_blocks
937918

938919
nr_of_refs = len(self.referenced_blocks)
939920
if nr_of_refs < self.clear_counter // 2:
@@ -953,11 +934,12 @@ cdef class BlockValuesRefs:
953934
blk : Block
954935
The block that the new references should point to.
955936
"""
956-
IF CYTHON_COMPATIBLE_WITH_FREE_THREADING:
957-
with cython.critical_section(self):
958-
self._add_reference_maybe_locked(blk)
959-
ELSE:
960-
self._add_reference_maybe_locked(blk)
937+
try:
938+
with cython.critical_section(self):
939+
self._add_reference_maybe_locked(blk)
940+
except AttributeError:
941+
# Older Cython/runtime: fall back
942+
self._add_reference_maybe_locked(blk)
961943

962944
def _add_index_reference_maybe_locked(self, index: object) -> None:
963945
self._clear_dead_references()

0 commit comments

Comments
 (0)