Set CppOwnership for managed QObjects returned by Q_INVOKABLES
I'm 99% sure of the recent crashes we've been seeing are double-frees, the QCache one me and Duha encountered must be one. The QCache is in charge of the one in ContentProvider, so it will sometimes try to delete or access something already destroyed by the QML engine. While I'm at it, I also made sure to check every other Q_INVOKABLE to ensure we don't hit this elsewhere. CCBUG: 502747
This commit is contained in:
@@ -96,7 +96,9 @@ void RoomListModel::doResetModel()
|
|||||||
|
|
||||||
NeoChatRoom *RoomListModel::roomAt(int row) const
|
NeoChatRoom *RoomListModel::roomAt(int row) const
|
||||||
{
|
{
|
||||||
return m_rooms.at(row);
|
auto room = m_rooms.at(row);
|
||||||
|
QQmlEngine::setObjectOwnership(room, QQmlEngine::CppOwnership);
|
||||||
|
return room;
|
||||||
}
|
}
|
||||||
|
|
||||||
void RoomListModel::doAddRoom(Room *r)
|
void RoomListModel::doAddRoom(Room *r)
|
||||||
@@ -309,6 +311,7 @@ NeoChatRoom *RoomListModel::roomByAliasOrId(const QString &aliasOrId)
|
|||||||
{
|
{
|
||||||
for (const auto &room : std::as_const(m_rooms)) {
|
for (const auto &room : std::as_const(m_rooms)) {
|
||||||
if (room->aliases().contains(aliasOrId) || room->id() == aliasOrId) {
|
if (room->aliases().contains(aliasOrId) || room->id() == aliasOrId) {
|
||||||
|
QQmlEngine::setObjectOwnership(room, QQmlEngine::CppOwnership);
|
||||||
return room;
|
return room;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,9 @@ MessageContentModel *ContentProvider::contentModelForEvent(NeoChatRoom *room, co
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!m_eventContentModels.contains(evtOrTxnId)) {
|
if (!m_eventContentModels.contains(evtOrTxnId)) {
|
||||||
m_eventContentModels.insert(evtOrTxnId, new MessageContentModel(room, evtOrTxnId, isReply));
|
auto model = new MessageContentModel(room, evtOrTxnId, isReply);
|
||||||
|
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
|
||||||
|
m_eventContentModels.insert(evtOrTxnId, model);
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_eventContentModels.object(evtOrTxnId);
|
return m_eventContentModels.object(evtOrTxnId);
|
||||||
@@ -80,7 +82,9 @@ ThreadModel *ContentProvider::modelForThread(NeoChatRoom *room, const QString &t
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!m_threadModels.contains(threadRootId)) {
|
if (!m_threadModels.contains(threadRootId)) {
|
||||||
m_threadModels.insert(threadRootId, new ThreadModel(threadRootId, room));
|
auto model = new ThreadModel(threadRootId, room);
|
||||||
|
QQmlEngine::setObjectOwnership(model, QQmlEngine::CppOwnership);
|
||||||
|
m_threadModels.insert(threadRootId, model);
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_threadModels.object(threadRootId);
|
return m_threadModels.object(threadRootId);
|
||||||
@@ -100,7 +104,9 @@ PollHandler *ContentProvider::handlerForPoll(NeoChatRoom *room, const QString &e
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!m_pollHandlers.contains(eventId)) {
|
if (!m_pollHandlers.contains(eventId)) {
|
||||||
m_pollHandlers.insert(eventId, new PollHandler(room, eventId));
|
auto pollHandler = new PollHandler(room, eventId);
|
||||||
|
QQmlEngine::setObjectOwnership(pollHandler, QQmlEngine::CppOwnership);
|
||||||
|
m_pollHandlers.insert(eventId, pollHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
return m_pollHandlers.object(eventId);
|
return m_pollHandlers.object(eventId);
|
||||||
|
|||||||
Reference in New Issue
Block a user