pybind/pybind11

[BUG] pybind11::cast is not thread safe

Open

#2.765 geöffnet am 31. Dez. 2020

Auf GitHub ansehen
 (21 Kommentare) (0 Reaktionen) (0 zugewiesene Personen)C++ (2.005 Forks)batch import
bugcastershelp wanted

Repository-Metriken

Stars
 (14.677 Stars)
PR-Merge-Metriken
 (Durchschn. Merge 5T 2h) (10 gemergte PRs in 30 T)

Beschreibung

in particular use of loader_life_support seems problematic. This function keeps state in the global loader_patient_stack: https://github.com/pybind/pybind11/blob/b7dfe5cc84ca1891b50e728e83c9b5b393cf5272/include/pybind11/detail/internals.h#L105 In the case where a cast can release the GIL, two thread's push/pop of loader_patient_stack can become interleaved.

While releasing the GIL in a conversion seems like a bad idea, it can be surprisingly hard to avoid. Any cast that results in the bytecode interpreter being run (either directly or through something like a __del__ method) can cause python itself to release GIL (sys.setswitchinterval).

Contributor Guide