Skip to content

Commit

Permalink
kde-frameworks/knewstuff: Add upstream crashfix
Browse files Browse the repository at this point in the history
Upstream commit 243ea6155b28457c8b1441fee8ab1037828d21ba

See also: https://mail.kde.org/pipermail/distributions/2020-December/000910.html
KDE-bug: https://bugs.kde.org/show_bug.cgi?id=429442
Package-Manager: Portage-3.0.12, Repoman-3.0.2
Signed-off-by: Andreas Sturmlechner <[email protected]>
  • Loading branch information
a17r committed Dec 19, 2020
1 parent 2a023eb commit e8191b8
Show file tree
Hide file tree
Showing 2 changed files with 177 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
From 243ea6155b28457c8b1441fee8ab1037828d21ba Mon Sep 17 00:00:00 2001
From: Dan Leinir Turthra Jensen <[email protected]>
Date: Mon, 14 Dec 2020 21:11:51 +0000
Subject: [PATCH] Add a dptr to Cache, and move the throttle timer there to fix
crash

Previously, the throttle timer was a raw static, but it was also a parented qobject, which means that when the cache was deleted, so was the timer, but the variable was not reset. Consequently, things would crash left and right later on. So, to alleviate this, and hopefully avoid future issues, introduce a dptr, stick the timer there, and move the logic to that private class as well.

BUG:429442

FIXED-IN:5.78
---
src/core/cache.cpp | 41 ++++++++++++++++++++++++++++++-----------
src/core/cache.h | 7 +++++--
2 files changed, 35 insertions(+), 13 deletions(-)

diff --git a/src/core/cache.cpp b/src/core/cache.cpp
index 0395045c..ace7be4e 100644
--- a/src/core/cache.cpp
+++ b/src/core/cache.cpp
@@ -11,17 +11,42 @@
#include <QDir>
#include <QFileInfo>
#include <QFileSystemWatcher>
+#include <QPointer>
#include <QTimer>
#include <QXmlStreamReader>
#include <qstandardpaths.h>
#include <knewstuffcore_debug.h>

+class KNSCore::CachePrivate {
+public:
+ CachePrivate(Cache* qq)
+ : q(qq)
+ {}
+ ~CachePrivate() {}
+
+ Cache* q;
+ QHash<QString, EntryInternal::List> requestCache;
+
+ QPointer<QTimer> throttleTimer;
+ void throttleWrite() {
+ if (!throttleTimer) {
+ throttleTimer = new QTimer(q);
+ QObject::connect(throttleTimer, &QTimer::timeout, q, [this](){ q->writeRegistry(); });
+ throttleTimer->setSingleShot(true);
+ throttleTimer->setInterval(1000);
+ }
+ throttleTimer->start();
+ }
+};
+
using namespace KNSCore;

typedef QHash<QString, QWeakPointer<Cache> > CacheHash;
Q_GLOBAL_STATIC(CacheHash, s_caches)

-Cache::Cache(const QString &appName): QObject(nullptr)
+Cache::Cache(const QString &appName)
+ : QObject(nullptr)
+ , d(new CachePrivate(this))
{
m_kns2ComponentName = appName;

@@ -280,36 +305,30 @@ void Cache::registerChangedEntry(const KNSCore::EntryInternal &entry)
if (entry.status() == KNS3::Entry::Updating || entry.status() == KNS3::Entry::Installing) {
return;
}
- static QTimer* writeThrottle{nullptr};
- if (!writeThrottle) {
- writeThrottle = new QTimer(this);
- connect(writeThrottle, &QTimer::timeout, this, [this](){ writeRegistry(); });
- writeThrottle->setInterval(1000);
- }
if (!property("reloadingRegistry").toBool()) {
setProperty("dirty", true);
cache.remove(entry); // If value already exists in the set, the set is left unchanged
cache.insert(entry);
- writeThrottle->start();
+ d->throttleWrite();
}
}

void Cache::insertRequest(const KNSCore::Provider::SearchRequest &request, const KNSCore::EntryInternal::List &entries)
{
// append new entries
- auto &cacheList = requestCache[request.hashForRequest()];
+ auto &cacheList = d->requestCache[request.hashForRequest()];
for (const auto &entry : entries) {
if (!cacheList.contains(entry)) {
cacheList.append(entry);
}
}
- qCDebug(KNEWSTUFFCORE) << request.hashForRequest() << " add: " << entries.size() << " keys: " << requestCache.keys();
+ qCDebug(KNEWSTUFFCORE) << request.hashForRequest() << " add: " << entries.size() << " keys: " << d->requestCache.keys();
}

EntryInternal::List Cache::requestFromCache(const KNSCore::Provider::SearchRequest &request)
{
qCDebug(KNEWSTUFFCORE) << request.hashForRequest();
- return requestCache.value(request.hashForRequest());
+ return d->requestCache.value(request.hashForRequest());
}

void KNSCore::Cache::removeDeletedEntries()
diff --git a/src/core/cache.h b/src/core/cache.h
index 06e95ab4..73ea7c61 100644
--- a/src/core/cache.h
+++ b/src/core/cache.h
@@ -16,9 +16,11 @@

#include "knewstuffcore_export.h"

+#include <memory.h>
+
namespace KNSCore
{
-
+class CachePrivate;
class KNEWSTUFFCORE_EXPORT Cache : public QObject
{
Q_OBJECT
@@ -99,7 +101,8 @@ private:
QString m_kns2ComponentName;

QSet<EntryInternal> cache;
- QHash<QString, EntryInternal::List> requestCache;
+
+ std::unique_ptr<CachePrivate> d;
};

}
--
GitLab

42 changes: 42 additions & 0 deletions kde-frameworks/knewstuff/knewstuff-5.77.0-r1.ebuild
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Copyright 1999-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=7

ECM_TEST="false"
PVCUT=$(ver_cut 1-2)
QTMIN=5.15.1
inherit ecm kde.org

DESCRIPTION="Framework for downloading and sharing additional application data"

LICENSE="LGPL-2+"
KEYWORDS="~amd64 ~arm ~arm64 ~ppc64 ~x86"
IUSE=""

DEPEND="
>=dev-qt/qtdeclarative-${QTMIN}:5
>=dev-qt/qtgui-${QTMIN}:5
>=dev-qt/qtnetwork-${QTMIN}:5
>=dev-qt/qtwidgets-${QTMIN}:5
>=dev-qt/qtxml-${QTMIN}:5
=kde-frameworks/attica-${PVCUT}*:5
=kde-frameworks/karchive-${PVCUT}*:5
=kde-frameworks/kcompletion-${PVCUT}*:5
=kde-frameworks/kconfig-${PVCUT}*:5
=kde-frameworks/kcoreaddons-${PVCUT}*:5
=kde-frameworks/ki18n-${PVCUT}*:5
=kde-frameworks/kiconthemes-${PVCUT}*:5
=kde-frameworks/kio-${PVCUT}*:5
=kde-frameworks/kitemviews-${PVCUT}*:5
=kde-frameworks/kpackage-${PVCUT}*:5
=kde-frameworks/kservice-${PVCUT}*:5
=kde-frameworks/ktextwidgets-${PVCUT}*:5
=kde-frameworks/kwidgetsaddons-${PVCUT}*:5
=kde-frameworks/kxmlgui-${PVCUT}*:5
"
RDEPEND="${DEPEND}
>=kde-frameworks/kirigami-${PVCUT}:5
"

PATCHES=( "${FILESDIR}/${P}-add-dptr-to-cache.patch" ) # KDE-bug 429442

0 comments on commit e8191b8

Please sign in to comment.