Move function-scope static QThreadStorage objects to namespace scope

to ensure destruction after all function-scope statics and avoid warning
"thread exited after QThreadStorage destroyed".
This commit is contained in:
Mat Sutcliffe
2019-01-05 16:49:20 +00:00
parent 1493106970
commit e7582f2f3c
4 changed files with 9 additions and 4 deletions

View File

@@ -116,6 +116,8 @@ namespace BlackGui
return (mw && mw->isFrameless());
}
static QThreadStorage<QRegularExpression> tsRegex;
bool CGuiUtility::lenientTitleComparison(const QString &title, const QString &comparison)
{
if (title == comparison) { return true; }
@@ -127,7 +129,6 @@ namespace BlackGui
if (t == c) { return true; }
// further unify
static QThreadStorage<QRegularExpression> tsRegex;
if (! tsRegex.hasLocalData()) { tsRegex.setLocalData(QRegularExpression("[^a-z0-9\\s]")); }
const QRegularExpression &regexp = tsRegex.localData();
t = t.remove(regexp);

View File

@@ -50,6 +50,9 @@ namespace BlackMisc
//! \threadsafe
inline std::mt19937 &defaultRandomGenerator()
{
//! \fixme Move rng to namespace scope to ensure destruction after function-local statics
//! and avoid warning "thread exited after QThreadStorage destroyed".
//! This will require careful thought about linkage.
static QThreadStorage<std::mt19937> rng;
if (rng.hasLocalData()) { rng.setLocalData(std::mt19937(static_cast<std::mt19937::result_type>(QRandomGenerator::global()->generate()))); }
return rng.localData();

View File

@@ -17,11 +17,12 @@
namespace BlackMisc
{
static QThreadStorage<std::vector<const CJsonScope *>> g_stack;
//! \private
auto &jsonStack() noexcept
{
static QThreadStorage<std::vector<const CJsonScope *>> stack;
return stack.localData();
return g_stack.localData();
}
// pin vtables to this file

View File

@@ -114,7 +114,7 @@ namespace BlackMisc
static const CLogCategoryList &fromClass()
{
static_assert(sizeof(T) > 0, "T must be a complete type, not forward declared");
static QThreadStorage<CLogCategoryList> list;
static QThreadStorage<CLogCategoryList> list; //! \todo C++17: make list an inline static member variable template
if (! list.hasLocalData())
{
list.localData().appendCategoriesFromMemberFunction(tag<T>(), THasGetLogCategories<T>());