TaskTree: Simplify internals

Drop QSet from StorageThreadData. Drop some asserts that
require locking the mutex.

This change causes the task tree tests execute twice as fast.

Change-Id: I58f6ec509f5fdd26d7f9a95d1223fad3a790cd3d
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Jarek Kobus
2023-12-22 00:33:25 +01:00
parent 6af0f3cc60
commit 778a17bb50

View File

@@ -1218,39 +1218,22 @@ class StorageThreadData
Q_DISABLE_COPY_MOVE(StorageThreadData) Q_DISABLE_COPY_MOVE(StorageThreadData)
public: public:
StorageThreadData(StorageData *storageData); StorageThreadData() = default;
~StorageThreadData();
StoragePtr createStorage();
bool deleteStorage(StoragePtr storagePtr); // Returns true if it was the last storage.
void activateStorage(StoragePtr storagePtr); void activateStorage(StoragePtr storagePtr);
StoragePtr activeStoragePtr() const; StoragePtr activeStoragePtr() const;
bool hasActiveStorage() const { return m_activeStorage; } bool hasActiveStorage() const { return m_activeStorage; }
private: private:
StorageData *m_storageData = nullptr;
QSet<StoragePtr> m_storages;
StoragePtr m_activeStorage = nullptr; StoragePtr m_activeStorage = nullptr;
}; };
class StorageData class StorageData
{ {
public: public:
~StorageData();
StorageThreadData &threadData() { StorageThreadData &threadData() {
QMutexLocker lock(&m_threadDataMutex); QMutexLocker lock(&m_threadDataMutex);
return m_threadDataMap.emplace(QThread::currentThread(), this).first->second; return m_threadDataMap.try_emplace(QThread::currentThread()).first->second;
}
void deleteStorage(StoragePtr storagePtr)
{
if (!threadData().deleteStorage(storagePtr))
return;
QMutexLocker lock(&m_threadDataMutex);
m_threadDataMap.erase(m_threadDataMap.find(QThread::currentThread()));
} }
const StorageBase::StorageConstructor m_constructor = {}; const StorageBase::StorageConstructor m_constructor = {};
@@ -1261,39 +1244,6 @@ public:
std::map<QThread *, StorageThreadData> m_threadDataMap = {}; std::map<QThread *, StorageThreadData> m_threadDataMap = {};
}; };
StorageThreadData::StorageThreadData(StorageData *storageData)
: m_storageData(storageData)
{
QT_CHECK(m_storageData->m_constructor);
QT_CHECK(m_storageData->m_destructor);
}
StorageThreadData::~StorageThreadData()
{
QT_CHECK(m_storages.isEmpty());
// TODO: Issue a warning about the leak instead?
for (void *ptr : std::as_const(m_storages))
m_storageData->m_destructor(ptr);
}
StoragePtr StorageThreadData::createStorage()
{
QT_ASSERT(m_activeStorage == 0, return 0); // TODO: should be allowed?
StoragePtr ptr = m_storageData->m_constructor();
m_storages.insert(ptr);
return ptr;
}
bool StorageThreadData::deleteStorage(StoragePtr storagePtr)
{
QT_ASSERT(m_activeStorage == 0, return false); // TODO: should be allowed?
const auto it = m_storages.constFind(storagePtr);
QT_ASSERT(it != m_storages.constEnd(), return false);
m_storageData->m_destructor(*it);
m_storages.erase(it);
return m_storages.isEmpty();
}
// passing 0 deactivates currently active storage // passing 0 deactivates currently active storage
void StorageThreadData::activateStorage(StoragePtr storagePtr) void StorageThreadData::activateStorage(StoragePtr storagePtr)
{ {
@@ -1316,12 +1266,6 @@ StoragePtr StorageThreadData::activeStoragePtr() const
return m_activeStorage; return m_activeStorage;
} }
StorageData::~StorageData()
{
QMutexLocker lock(&m_threadDataMutex);
QT_CHECK(m_threadDataMap.empty());
}
StorageBase::StorageBase(StorageConstructor ctor, StorageDestructor dtor) StorageBase::StorageBase(StorageConstructor ctor, StorageDestructor dtor)
: m_storageData(new StorageData{ctor, dtor}) : m_storageData(new StorageData{ctor, dtor})
{} {}
@@ -1574,7 +1518,7 @@ public:
StoragePtr storagePtr = m_storages.value(i); StoragePtr storagePtr = m_storages.value(i);
if (m_callStorageDoneHandlersOnDestruction) if (m_callStorageDoneHandlersOnDestruction)
m_taskContainer.m_taskTreePrivate->callDoneHandler(storage, storagePtr); m_taskContainer.m_taskTreePrivate->callDoneHandler(storage, storagePtr);
storage.m_storageData->deleteStorage(storagePtr); storage.m_storageData->m_destructor(storagePtr);
} }
} }
@@ -1711,7 +1655,7 @@ QList<StoragePtr> TaskRuntimeContainer::createStorages(const TaskContainer &cont
{ {
QList<StoragePtr> storages; QList<StoragePtr> storages;
for (const StorageBase &storage : container.m_storageList) { for (const StorageBase &storage : container.m_storageList) {
StoragePtr storagePtr = storage.m_storageData->threadData().createStorage(); StoragePtr storagePtr = storage.m_storageData->m_constructor();
storages.append(storagePtr); storages.append(storagePtr);
container.m_taskTreePrivate->callSetupHandler(storage, storagePtr); container.m_taskTreePrivate->callSetupHandler(storage, storagePtr);
} }