From 2a78abffd85904849a1c9f9c6705f2d5a0d27018 Mon Sep 17 00:00:00 2001 From: Jeremy Maitin-Shepard Date: Thu, 23 Sep 2021 10:36:25 -0700 Subject: [PATCH] Ensure PYBIND11_TLS_REPLACE_VALUE evaluates its arguments only once (#3290) --- include/pybind11/detail/internals.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/include/pybind11/detail/internals.h b/include/pybind11/detail/internals.h index 7c2e49978..98d21eb98 100644 --- a/include/pybind11/detail/internals.h +++ b/include/pybind11/detail/internals.h @@ -84,12 +84,13 @@ inline PyObject *make_object_base_type(PyTypeObject *metaclass); // On CPython < 3.4 and on PyPy, `PyThread_set_key_value` strangely does not set // the value if it has already been set. Instead, it must first be deleted and // then set again. +inline void tls_replace_value(PYBIND11_TLS_KEY_REF key, void *value) { + PyThread_delete_key_value(key); + PyThread_set_key_value(key, value); +} # define PYBIND11_TLS_DELETE_VALUE(key) PyThread_delete_key_value(key) # define PYBIND11_TLS_REPLACE_VALUE(key, value) \ - do { \ - PyThread_delete_key_value((key)); \ - PyThread_set_key_value((key), (value)); \ - } while (false) + ::pybind11::detail::tls_replace_value((key), (value)) # else # define PYBIND11_TLS_DELETE_VALUE(key) PyThread_set_key_value((key), nullptr) # define PYBIND11_TLS_REPLACE_VALUE(key, value) PyThread_set_key_value((key), (value))