Merge lp:~uriboni/unity-2d/panel-segv-logoff into lp:unity-2d/3.0

Proposed by Ugo Riboni
Status: Merged
Approved by: Florian Boucault
Approved revision: 416
Merged at revision: 416
Proposed branch: lp:~uriboni/unity-2d/panel-segv-logoff
Merge into: lp:unity-2d/3.0
Diff against target: 53 lines (+12/-7)
2 files modified
libunity-2d-private/src/keyboardmodifiersmonitor.cpp (+11/-6)
libunity-2d-private/src/keyboardmodifiersmonitor.h (+1/-1)
To merge this branch: bzr merge lp:~uriboni/unity-2d/panel-segv-logoff
Reviewer Review Type Date Requested Status
Aurélien Gâteau (community) Needs Fixing
Florian Boucault Pending
Review via email: mp+51342@code.launchpad.net

Description of the change

[panel] Fix a bug when exiting the panel cleanly (i.e. on logoff)

To post a comment you must log in.
Revision history for this message
Aurélien Gâteau (agateau) wrote :

Sorry but that fix is wrong: it causes the filter to be leaked because it is never deleted.

It does not matter much to the end user but this kind of errors leads to more false positives when hunting for memleaks with valgrind. It also could come back for other X11EventFilters. A better fix would be to delete all filters in Unity2dApplication destructor with:

  qDeleteAll(m_x11EventFilters);

This should fix the problem because right now the filters are deleted by the QObject destructor of Unity2dApplication. At this point the m_x11EventFilters list does not exist anymore, hence the crash. Deleting filters in Unity2dApplication destructor will ensure filters are deleted *before* the m_x11EventFilters list is deleted.

(Oh, and this could quite easily be unit-tested I think)

review: Needs Fixing

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'libunity-2d-private/src/keyboardmodifiersmonitor.cpp'
2--- libunity-2d-private/src/keyboardmodifiersmonitor.cpp 2011-01-26 15:50:26 +0000
3+++ libunity-2d-private/src/keyboardmodifiersmonitor.cpp 2011-02-25 18:02:14 +0000
4@@ -51,17 +51,22 @@
5 int m_modifiers;
6 };
7
8-KeyboardModifiersMonitor::KeyboardModifiersMonitor(QObject* parent)
9-: QObject(parent)
10+KeyboardModifiersMonitor::KeyboardModifiersMonitor()
11+: QObject(NULL)
12 , d(new KeyboardModifiersMonitorPrivate)
13 {
14 if (sXkbBaseEventType == 0) {
15 setupXkb();
16 }
17
18- Unity2dApplication* app = Unity2dApplication::instance();
19- Q_ASSERT(app);
20- Unity2dApplication::instance()->installX11EventFilter(this);
21+ Unity2dApplication* application;
22+ application = qobject_cast<Unity2dApplication*>(QApplication::instance());
23+ if (application == NULL) {
24+ qWarning() << "The application is not an Unity2dApplication."
25+ "Modifiers will not be monitored.";
26+ } else {
27+ Unity2dApplication::instance()->installX11EventFilter(this);
28+ }
29 }
30
31 KeyboardModifiersMonitor::~KeyboardModifiersMonitor()
32@@ -71,7 +76,7 @@
33
34 KeyboardModifiersMonitor* KeyboardModifiersMonitor::instance()
35 {
36- static KeyboardModifiersMonitor* monitor = new KeyboardModifiersMonitor(Unity2dApplication::instance());
37+ static KeyboardModifiersMonitor* monitor = new KeyboardModifiersMonitor();
38 return monitor;
39 }
40
41
42=== modified file 'libunity-2d-private/src/keyboardmodifiersmonitor.h'
43--- libunity-2d-private/src/keyboardmodifiersmonitor.h 2011-01-26 15:50:26 +0000
44+++ libunity-2d-private/src/keyboardmodifiersmonitor.h 2011-02-25 18:02:14 +0000
45@@ -42,7 +42,7 @@
46 {
47 Q_OBJECT
48 public:
49- KeyboardModifiersMonitor(QObject* parent=0);
50+ KeyboardModifiersMonitor();
51 ~KeyboardModifiersMonitor();
52
53 Qt::KeyboardModifiers keyboardModifiers() const;

Subscribers

People subscribed via source and target branches

to all changes: