[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [kdevplatform] language/codecompletion: Fix the world's most evil typo
From:       Olivier JG <olivier.jg () gmail ! com>
Date:       2015-10-10 20:32:41
Message-ID: E1Zl0or-0004E2-Af () scm ! kde ! org
[Download RAW message or body]

Git commit 3b96df51a8cae12582ca0b6cc3a6c73f4746e19c by Olivier JG.
Committed on 10/10/2015 at 20:36.
Pushed by olivierjg into branch 'master'.

Fix the world's most evil typo

qRegisterMetaType was called with QList<CompletionTreeElement>
and "QList<QExplicitlySharedDataPointer<CompletionTreeElement>>"

This means that when a list of /pointers/ to tree elements is
passed though a queued connection (ie, from the completion worker
thread), QMetaType "copies" the pointer list into a QList of
CompletionTreeElement (actually just a ref-count bump on the list
of pointers' internal data).

Now, if the pointer QList is detached in the slot, when the slot
returns, the QMetaType's stored copy notices that it has the last
copy of the list data, and all the CompletionTreeElementPointers
are destructed with the CompletionTreeElement destructor.

This is sneaky -- because until you notice in the backtrace that
the list is of the wrong type, it looks like the pointers are
deleting their shared data (which has a non-zero reference count)

M  +2    -0    language/codecompletion/codecompletioncontext.h
M  +2    -0    language/codecompletion/codecompletionitem.h
M  +1    -3    language/codecompletion/codecompletionmodel.cpp

http://commits.kde.org/kdevplatform/3b96df51a8cae12582ca0b6cc3a6c73f4746e19c

diff --git a/language/codecompletion/codecompletioncontext.h b/language/cod=
ecompletion/codecompletioncontext.h
index 113d528..0fc7e19 100644
--- a/language/codecompletion/codecompletioncontext.h
+++ b/language/codecompletion/codecompletioncontext.h
@@ -106,4 +106,6 @@ namespace KDevelop {
   };
 }
 =

+Q_DECLARE_METATYPE(KDevelop::CodeCompletionContext::Ptr);
+
 #endif
diff --git a/language/codecompletion/codecompletionitem.h b/language/codeco=
mpletion/codecompletionitem.h
index e4ec3b5..ec42e07 100644
--- a/language/codecompletion/codecompletionitem.h
+++ b/language/codecompletion/codecompletionitem.h
@@ -147,4 +147,6 @@ typedef QExplicitlySharedDataPointer<CompletionTreeElem=
ent> CompletionTreeElemen
 =

 }
 =

+Q_DECLARE_METATYPE(KDevelop::CompletionTreeElementPointer);
+
 #endif
diff --git a/language/codecompletion/codecompletionmodel.cpp b/language/cod=
ecompletion/codecompletionmodel.cpp
index 87a6487..9e12961 100644
--- a/language/codecompletion/codecompletionmodel.cpp
+++ b/language/codecompletion/codecompletionmodel.cpp
@@ -105,9 +105,7 @@ CodeCompletionModel::CodeCompletionModel( QObject * par=
ent )
   , m_mutex(new QMutex)
   , m_thread(0)
 {
-  qRegisterMetaType<QList<CompletionTreeElement> >("QList<QExplicitlyShare=
dDataPointer<CompletionTreeElement> >");
-  qRegisterMetaType<QExplicitlySharedDataPointer<CodeCompletionContext> >(=
"QExplicitlySharedDataPointer<CodeCompletionContext>");
-  qRegisterMetaType<KTextEditor::Cursor>("KTextEditor::Cursor");
+  qRegisterMetaType<KTextEditor::Cursor>();
 }
 =

 void CodeCompletionModel::initialize() {

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic