Skip to content

Commit 269327b

Browse files
committed
Free tstate on python 3.7+ on finalize_interpreter
1 parent 3735249 commit 269327b

File tree

2 files changed

+7
-0
lines changed

2 files changed

+7
-0
lines changed

include/pybind11/detail/internals.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ inline PyObject *make_object_base_type(PyTypeObject *metaclass);
2525
# define PYBIND11_TLS_GET_VALUE(key) PyThread_tss_get((key))
2626
# define PYBIND11_TLS_REPLACE_VALUE(key, value) PyThread_tss_set((key), (value))
2727
# define PYBIND11_TLS_DELETE_VALUE(key) PyThread_tss_set((key), nullptr)
28+
# define PYBIND11_TLS_FREE(key) PyThread_tss_free(key)
2829
#else
2930
// Usually an int but a long on Cygwin64 with Python 3.x
3031
# define PYBIND11_TLS_KEY_INIT(var) decltype(PyThread_create_key()) var = 0
@@ -43,6 +44,7 @@ inline PyObject *make_object_base_type(PyTypeObject *metaclass);
4344
# define PYBIND11_TLS_REPLACE_VALUE(key, value) \
4445
PyThread_set_key_value((key), (value))
4546
# endif
47+
# define PYBIND11_TLS_FREE(key) (void)key
4648
#endif
4749

4850
// Python loads modules by default with dlopen with the RTLD_LOCAL flag; under libc++ and possibly

include/pybind11/embed.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,11 @@ inline void finalize_interpreter() {
158158
if (builtins.contains(id) && isinstance<capsule>(builtins[id]))
159159
internals_ptr_ptr = capsule(builtins[id]);
160160

161+
#if defined(WITH_THREAD)
162+
if (internals_ptr_ptr && *internals_ptr_ptr)
163+
PYBIND11_TLS_FREE((*internals_ptr_ptr)->tstate);
164+
#endif
165+
161166
Py_Finalize();
162167

163168
if (internals_ptr_ptr) {

0 commit comments

Comments
 (0)