diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-06-10 14:07:29 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-06-13 08:44:23 +0200 |
commit | 0e70b038a6a777cf1001fd2fbf75336b6ddfa047 (patch) | |
tree | 3c46dddba71a3b3ffbd105ef6ab92d037d86ebe7 | |
parent | dba47a16b805f03788f77846bc7ae48d0cc2d095 (diff) |
libshiboken: Fix hangs introduced by mutex
Use a recursive mutex since nested locks can occur in
~BindingManager.
Amends e141ea41cf6f2840281ab6e52b0861a6d1dcc137.
Change-Id: I2dee3da70fe855859b3917e6ac775b8c5cdf5da7
Reviewed-by: Christian Tismer <tismer@stackless.com>
(cherry picked from commit a2005503162fd707d71027712f13f6b9454e78ad)
(cherry picked from commit dfae9541544b64174738ff9383607d2040b2d2ff)
Reviewed-by: Simo Fält <simo.falt@qt.io>
-rw-r--r-- | sources/shiboken2/libshiboken/bindingmanager.cpp | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/sources/shiboken2/libshiboken/bindingmanager.cpp b/sources/shiboken2/libshiboken/bindingmanager.cpp index 9e658c41d..658f085ac 100644 --- a/sources/shiboken2/libshiboken/bindingmanager.cpp +++ b/sources/shiboken2/libshiboken/bindingmanager.cpp @@ -128,7 +128,7 @@ struct BindingManager::BindingManagerPrivate { // QObject::metaObject() and elsewhere from threads without GIL, causing // crashes for example in retrieveWrapper(). std::shared_mutex was rejected due to: // https://stackoverflow.com/questions/50972345/when-is-stdshared-timed-mutex-slower-than-stdmutex-and-when-not-to-use-it - std::mutex wrapperMapLock; + std::recursive_mutex wrapperMapLock; Graph classHierarchy; DestructorEntries deleteInMainThread; bool destroying; @@ -144,7 +144,7 @@ bool BindingManager::BindingManagerPrivate::releaseWrapper(void *cptr, SbkObject // The wrapper argument is checked to ensure that the correct wrapper is released. // Returns true if the correct wrapper is found and released. // If wrapper argument is NULL, no such check is performed. - std::lock_guard<std::mutex> guard(wrapperMapLock); + std::lock_guard<std::recursive_mutex> guard(wrapperMapLock); auto iter = wrapperMapper.find(cptr); if (iter != wrapperMapper.end() && (wrapper == nullptr || iter->second == wrapper)) { wrapperMapper.erase(iter); @@ -156,7 +156,7 @@ bool BindingManager::BindingManagerPrivate::releaseWrapper(void *cptr, SbkObject void BindingManager::BindingManagerPrivate::assignWrapper(SbkObject *wrapper, const void *cptr) { assert(cptr); - std::lock_guard<std::mutex> guard(wrapperMapLock); + std::lock_guard<std::recursive_mutex> guard(wrapperMapLock); auto iter = wrapperMapper.find(cptr); if (iter == wrapperMapper.end()) wrapperMapper.insert(std::make_pair(cptr, wrapper)); @@ -183,7 +183,7 @@ BindingManager::~BindingManager() * the BindingManager is being destroyed the interpreter is alredy * shutting down. */ if (Py_IsInitialized()) { // ensure the interpreter is still valid - std::lock_guard<std::mutex> guard(m_d->wrapperMapLock); + std::lock_guard<std::recursive_mutex> guard(m_d->wrapperMapLock); while (!m_d->wrapperMapper.empty()) { Object::destroy(m_d->wrapperMapper.begin()->second, const_cast<void *>(m_d->wrapperMapper.begin()->first)); } @@ -199,7 +199,7 @@ BindingManager &BindingManager::instance() { bool BindingManager::hasWrapper(const void *cptr) { - std::lock_guard<std::mutex> guard(m_d->wrapperMapLock); + std::lock_guard<std::recursive_mutex> guard(m_d->wrapperMapLock); return m_d->wrapperMapper.find(cptr) != m_d->wrapperMapper.end(); } @@ -260,7 +260,7 @@ void BindingManager::addToDeletionInMainThread(const DestructorEntry &e) SbkObject *BindingManager::retrieveWrapper(const void *cptr) { - std::lock_guard<std::mutex> guard(m_d->wrapperMapLock); + std::lock_guard<std::recursive_mutex> guard(m_d->wrapperMapLock); auto iter = m_d->wrapperMapper.find(cptr); if (iter == m_d->wrapperMapper.end()) return nullptr; @@ -350,7 +350,7 @@ SbkObjectType *BindingManager::resolveType(void **cptr, SbkObjectType *type) std::set<PyObject *> BindingManager::getAllPyObjects() { std::set<PyObject *> pyObjects; - std::lock_guard<std::mutex> guard(m_d->wrapperMapLock); + std::lock_guard<std::recursive_mutex> guard(m_d->wrapperMapLock); const WrapperMap &wrappersMap = m_d->wrapperMapper; auto it = wrappersMap.begin(); for (; it != wrappersMap.end(); ++it) |