File 0002-Ensure-categories.xml-is-only-fetched-once-in-parall.patch of Package attica-qt5.17058

From 7851e94cb6ba7e0e3cfb4661eb525de6aa729472 Mon Sep 17 00:00:00 2001
From: Aleix Pol <aleixpol@kde.org>
Date: Wed, 22 Sep 2021 16:19:39 +0200
Subject: [PATCH 2/2] Ensure categories.xml is only fetched once in parallel

Otherwise we overload the server that is returning them fairly slowly
anyway (2 to 3 seconds?). It seems like it serves these sequentially as
well, which makes Discover startup stuttery.

(cherry picked from commit 04bd6dcd39895ce3637145e719c3c427bc7f1ca1)
---
 src/atticabasejob.cpp |  7 +++----
 src/provider.cpp      | 15 +++++++++++++--
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/src/atticabasejob.cpp b/src/atticabasejob.cpp
index 39b3a04..9ec965b 100644
--- a/src/atticabasejob.cpp
+++ b/src/atticabasejob.cpp
@@ -122,11 +122,10 @@ void BaseJob::dataFinished()
 
 void BaseJob::start()
 {
-    if (d->started) {
-        return;
+    if (!d->started) {
+        d->started = true;
+        QTimer::singleShot(0, this, &BaseJob::doWork);
     }
-    d->started = true;
-    QTimer::singleShot(0, this, &BaseJob::doWork);
 }
 
 void BaseJob::doWork()
diff --git a/src/provider.cpp b/src/provider.cpp
index 53495a3..3cbe8a9 100644
--- a/src/provider.cpp
+++ b/src/provider.cpp
@@ -63,6 +63,7 @@
 #include <QDebug>
 #include <QUrlQuery>
 #include <QNetworkReply>
+#include <QThreadStorage>
 #include <QFile>
 #include <QCoreApplication>
 
@@ -1038,8 +1039,18 @@ ListJob<Category> *Provider::requestCategories()
         return nullptr;
     }
 
-    QUrl url = createUrl(QLatin1String("content/categories"));
-    ListJob<Category> *job = new ListJob<Category>(d->m_internals, createRequest(url));
+    const QUrl url = createUrl(QLatin1String("content/categories"));
+
+    // Thread-local cache of categories requests. They are fairly slow and block startup
+    static QThreadStorage<QHash<QUrl, ListJob<Category> *>> reqs;
+    ListJob<Category> *job = reqs.localData().value(url);
+    if (!job) {
+        job = new ListJob<Category>(d->m_internals, createRequest(url));
+        QObject::connect(job, &BaseJob::finished, [url] {
+            reqs.localData().remove(url);
+        });
+        reqs.localData().insert(url, job);
+    }
     return job;
 }
 
-- 
2.33.0

openSUSE Build Service is sponsored by