Fix a crash in the "update signature action".
The problem seems to be that the DUChain is readlocked in
AbstractNavigationWidgetPrivate::anchorClicked
(see also [2]),
which then proceeds through the following (backtrace-like) call chain
#9 AdaptSignatureAction::execute()
(at plugins/clang/codegen/adaptsignatureaction.cpp:83)
#10 ProblemNavigationContext::executeAction(int)
(at kdevplatform/language/duchain/navigation/problemnavigationcontext.cpp:258)
#11 ProblemNavigationContext::executeKeyAction(QString const&)
(at kdevplatform/language/duchain/navigation/problemnavigationcontext.cpp:243)
#12 AbstractNavigationContext::execute(KDevelop::NavigationAction const&)
(at kdevplatform/language/duchain/navigation/abstractnavigationcontext.cpp:183)
#13 AbstractNavigationContext::acceptLink(QString const&)
(at kdevplatform/language/duchain/navigation/abstractnavigationcontext.cpp:487)
#14 AbstractNavigationWidgetPrivate::anchorClicked
which ends at
plugins/clang/codegen/adaptsignatureaction.cpp:83
with an ENSURE_CHAIN_NOT_LOCKED
macro, which asserts.
However, the lock in anchorClicked
was added there in
commit ff72bc32 to fix bug 386901 ([1]) so it cannot
just be removed. The callchain triggering the 386901 bug looks
as follows:
#0 FunctionDefinition::declaration
(at kdevplatform/language/duchain/functiondefinition.cpp:52)
#1 FunctionDefinition::declaration
(at kdevplatform/language/duchain/functiondefinition.cpp:52)
#2 AbstractDeclarationNavigationContext::AbstractDeclarationNavigationContext
(at kdevplatform/language/duchain/navigation/abstractdeclarationnavigationcontext.cpp:67)
#3 DeclarationNavigationContext::AbstractDeclarationNavigationContext
(at plugins/clang/duchain/navigationwidget.cpp:38)
#4 ClangNavigationWidget::ClangNavigationWidget
(at plugins/clang/duchain/navigationwidget.cpp:98)
#5 ClangDUContext<KDevelop::TopDUContext, 140>::createNavigationWidget
(at plugins/clang/duchain/clangducontext.cpp:46)
#6 AbstractNavigationContext::registerChild
(at kdevplatform/language/duchain/navigation/abstractnavigationcontext.cpp:281)
#7 AbstractNavigationContext::execute
(at kdevplatform/language/duchain/navigation/abstractnavigationcontext.cpp:201)
#8 AbstractNavigationContext::acceptLink
(at kdevplatform/language/duchain/navigation/abstractnavigationcontext.cpp:487)
#9 AbstractNavigationWidgetPrivate::anchorClicked
(at kdevplatform/language/duchain/navigation/abstractnavigationwidget.cpp:285)\
which hits an assert at
kdevplatform/language/duchain/functiondefinition.cpp:52
in the ENSURE_CAN_READ
macro.
This commit moves the lock from anchorClicked
into
AbstractNavigationContext::registerChild
, which is the
last opportunity for a lock before a language-plugin specific
method is called (so that the bug does not reappear in
other language plugins).
References
[1] https://bugs.kde.org/show_bug.cgi?id=386901
[2] https://phabricator.kde.org/D22182