aboutsummaryrefslogtreecommitdiffstats
path: root/community/attica/0001-Ensure-categories-xml-is-only-fetched-once-in-parallel.patch
blob: f7b5b47d899c672d9b04939bbb3fdb2bd16baf18 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
commit 7c38c8cf28a4d0d667e23ddfaaf38a955d65bf3e
Author: Aleix Pol <aleixpol@kde.org>
Date:   Wed Sep 22 16:19:39 2021 +0200

    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.

diff --git a/src/atticabasejob.cpp b/src/atticabasejob.cpp
index 99acf4f..e65d556 100644
--- a/src/atticabasejob.cpp
+++ b/src/atticabasejob.cpp
@@ -26,6 +26,7 @@ public:
     PlatformDependent *m_internals;
     QNetworkReply *m_reply;
     bool aborted{false};
+    bool started = false;
 
     Private(PlatformDependent *internals)
         : m_internals(internals)
@@ -120,7 +121,10 @@ void BaseJob::dataFinished()
 
 void BaseJob::start()
 {
-    QTimer::singleShot(0, this, &BaseJob::doWork);
+    if (!d->started) {
+        d->started = true;
+        QTimer::singleShot(0, this, &BaseJob::doWork);
+    }
 }
 
 void BaseJob::doWork()
diff --git a/src/provider.cpp b/src/provider.cpp
index 9e4da64..b994ce9 100644
--- a/src/provider.cpp
+++ b/src/provider.cpp
@@ -64,6 +64,7 @@
 #include <QFile>
 #include <QNetworkAccessManager>
 #include <QNetworkReply>
+#include <QThreadStorage>
 #include <QUrlQuery>
 
 using namespace Attica;
@@ -1134,8 +1135,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;
 }