It isn't possible to temporarily resurrect objects safely in the Py3.15t limited API
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Python
- Sterne
- 77.2k
- Forks
- 35.9k
- PR-Merge-Kennzahlen
- PR-Kennzahlen ausstehend
Beschreibung
Bug report
Bug description:
In Cython we do something like
Py_SET_REFCNT(o, Py_REFCNT(o) + 1);
// Run user implemented deallocation code
Py_SET_REFCNT(o, Py_REFCNT(o) - 1);
The reason for this is that we don't want any refcounting (e.g. of temps) within the user code to accidentally trigger a recursive call to dealloc (the user code really shouldn't resurrect the object and it's their own problem if they do, but it is reasonable for it to generate temporaries, which may well be out of their control anyway).
This turns out not to be thread-safe in the freethreaded build because it makes TryIncRef succeed. Outside the limited API it's possible to fix by manual access to the reference count, but obviously not inside the limited API.
It would be nice to have a way of to avoid this.
- Most convenient would be to properly access
_PyObject_ResurrectStartand_PyObject_ResurrectEnd. - The other thing that could work is some way to defer the deallocation until the next GC cycle (when I think any
TryIncRefs would have fall out of scope anyway). I suspect I could manually arrange to do that, although it feels fragile, possibly relies on the GC being single-threaded, and which I haven't tested (so may not work...)
CPython versions tested on:
3.15
Operating systems tested on:
No response
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginnen Sie mit der Überprüfung der begrenzten API-Oberfläche, die an der Refcount-Wiederauferstehung und dem hier beschriebenen free-threaded TryIncRef-Verhalten beteiligt ist, und vergleichen Sie sie anschließend mit _PyObject_ResurrectStart und _PyObject_ResurrectEnd sowie mit dem Cython-Issue #7769. Als abgeschlossen gilt die Definition eines threadsicheren limited-API-Mechanismus, der eine unsichere vorübergehende Wiederauferstehung während des Deallocationscodes von Benutzern vermeidet.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- c, python
- Bereich
- api
- Issue-Typ
- Feature
- Schwierigkeit
- 5/5
- Geschätzter Aufwand
- Über eine Woche
- Aktivitätsstatus
- Ruhig
- Klarheit
- Muss geklärt werden
- Anfängerfreundlichkeit
- 35/100