summaryrefslogtreecommitdiff
blob: 001fbb26ea4c7fef0a8910990f40f2d91ec2208a (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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
From b3c8ad1ad48d65ea77724f94073909dc8ab97596 Mon Sep 17 00:00:00 2001
From: David Edmundson <david@davidedmundson.co.uk>
Date: Sat, 6 Feb 2016 18:02:53 +0000
Subject: [PATCH] Fix crash in activities context menu

Currently we call deleteLater() from inside ::run which is running in a
different thread than the receiving object.
(QThread objects live in the thread that created them, not in the thread
they create)

This patch causes deleteLater to be run in the right thread.

QCoreApplication::postEvent is thread safe but it needs to be in the
right thread to work out the correct event loop level for deferred
delete events.

BUG: 351485
REVIEW: 126955
---
 src/workspace/fileitemplugin/FileItemLinkingPlugin.cpp           | 2 +-
 .../fileitemplugin/FileItemLinkingPluginActionLoader.cpp         | 9 +++++++--
 src/workspace/fileitemplugin/FileItemLinkingPluginActionLoader.h | 4 ++--
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/src/workspace/fileitemplugin/FileItemLinkingPlugin.cpp b/src/workspace/fileitemplugin/FileItemLinkingPlugin.cpp
index a887132..f3f6dde 100644
--- a/src/workspace/fileitemplugin/FileItemLinkingPlugin.cpp
+++ b/src/workspace/fileitemplugin/FileItemLinkingPlugin.cpp
@@ -124,7 +124,7 @@ void FileItemLinkingPlugin::Private::loadAllActions()
         setActions({ action });
 
     } else if (!loaded) {
-        auto loader = new FileItemLinkingPluginActionLoader(items);
+        auto loader = FileItemLinkingPluginActionLoader::create(items);
 
         static FileItemLinkingPluginActionStaticInit init;
 
diff --git a/src/workspace/fileitemplugin/FileItemLinkingPluginActionLoader.cpp b/src/workspace/fileitemplugin/FileItemLinkingPluginActionLoader.cpp
index 3343eb4..b35713d 100644
--- a/src/workspace/fileitemplugin/FileItemLinkingPluginActionLoader.cpp
+++ b/src/workspace/fileitemplugin/FileItemLinkingPluginActionLoader.cpp
@@ -40,6 +40,13 @@
 
 #include "common/dbus/common.h"
 
+FileItemLinkingPluginActionLoader* FileItemLinkingPluginActionLoader::create(const KFileItemListProperties &items)
+{
+    auto l = new FileItemLinkingPluginActionLoader(items);
+    connect(l, &QThread::finished, l, &QObject::deleteLater);
+    return l;
+}
+
 FileItemLinkingPluginActionLoader::FileItemLinkingPluginActionLoader(
     const KFileItemListProperties &items)
     : items(items)
@@ -150,8 +157,6 @@ void FileItemLinkingPluginActionLoader::run()
     }
 
     emit result(actions);
-
-    deleteLater();
 }
 
 Action
diff --git a/src/workspace/fileitemplugin/FileItemLinkingPluginActionLoader.h b/src/workspace/fileitemplugin/FileItemLinkingPluginActionLoader.h
index 50dccc5..5264a45 100644
--- a/src/workspace/fileitemplugin/FileItemLinkingPluginActionLoader.h
+++ b/src/workspace/fileitemplugin/FileItemLinkingPluginActionLoader.h
@@ -33,8 +33,7 @@ class FileItemLinkingPluginActionLoader: public QThread {
     Q_OBJECT
 
 public:
-    FileItemLinkingPluginActionLoader(const KFileItemListProperties &items);
-
+    static FileItemLinkingPluginActionLoader* create(const KFileItemListProperties &items);
     void run() Q_DECL_OVERRIDE;
 
     Action createAction(const QString &activity, bool link,
@@ -46,6 +45,7 @@ Q_SIGNALS:
     void result(const ActionList &actions);
 
 private:
+    FileItemLinkingPluginActionLoader(const KFileItemListProperties &items);
     KFileItemListProperties items;
     KActivities::Consumer activities;
 };
-- 
2.4.10