Bug 358497 - Find Uses cannot be canceled
Summary: Find Uses cannot be canceled
Status: CONFIRMED
Alias: None
Product: kdevelop
Classification: Applications
Component: general (show other bugs)
Version: 4.90.91
Platform: Compiled Sources Linux
: HI normal
Target Milestone: ---
Assignee: kdevelop-bugs-null
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2016-01-24 19:05 UTC by David Faure
Modified: 2016-10-21 00:02 UTC (History)
1 user (show)

See Also:
Latest Commit:
Version Fixed In:
Sentry Crash Report:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description David Faure 2016-01-24 19:05:52 UTC
I used the shortcut for "Find Uses" on QLatin1String by mistake, in the kio.git project.
KDevelop froze with 100% CPU usage for a very long time.

Yes there are lots of hits, so I understanad it needs to compute for a long time, but that should keep the GUI responsive (-> chunk the work or use a thread). As a user I should be able to cancel once I realize my mistake.

Reproducible: Always


Actual Results:  
#0  0x00007f4812bb49ec in QVector<QPostEvent>::at (this=0x88d5a0, i=80942) at ../../include/QtCore/../../src/corelib/tools/qvector.h:418
#1  0x00007f4812de93ae in QCoreApplication::removePostedEvents (receiver=0xd9b9b40, eventType=0) at kernel/qcoreapplication.cpp:1697
#2  0x00007f4813bf36d2 in QWidget::~QWidget (this=0xd9b9b40, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1666
#3  0x00007f4813d62b9e in QFrame::~QFrame (this=0xd9b9b40, __in_chrg=<optimized out>) at widgets/qframe.cpp:256
#4  0x00007f4813d671e8 in QLabel::~QLabel (this=0xd9b9b40, __in_chrg=<optimized out>) at widgets/qlabel.cpp:243
#5  0x00007f4813d6721e in QLabel::~QLabel (this=0xd9b9b40, __in_chrg=<optimized out>) at widgets/qlabel.cpp:247
#6  0x00007f4812e23058 in QObjectPrivate::deleteChildren (this=0xd9b5ba0) at kernel/qobject.cpp:1963
#7  0x00007f4813bf36be in QWidget::~QWidget (this=0xd9aadc0, __in_chrg=<optimized out>) at kernel/qwidget.cpp:1664
#8  0x00007f4813d62b9e in QFrame::~QFrame (this=0xd9aadc0, __in_chrg=<optimized out>) at widgets/qframe.cpp:256
#9  0x00007f4813e0881d in QAbstractScrollArea::~QAbstractScrollArea (this=0xd9aadc0, __in_chrg=<optimized out>) at widgets/qabstractscrollarea.cpp:575
#10 0x00007f4813e0f2c4 in QScrollArea::~QScrollArea (this=0xd9aadc0, __in_chrg=<optimized out>) at widgets/qscrollarea.cpp:166
#11 0x00007f48100a588f in KDevelop::NavigatableWidgetList::~NavigatableWidgetList (this=0xd9aadc0) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:195
#12 0x00007f48101495a5 in KDevelop::ContextUsesWidget::~ContextUsesWidget (this=0xd9aadc0) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.h:89
#13 0x00007f48101495c9 in KDevelop::ContextUsesWidget::~ContextUsesWidget (this=0xd9aadc0) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.h:89
#14 0x00007f48100a7e51 in buildContextUses (code=..., declarations=QList<KDevelop::IndexedDeclaration> = {...}, context=0xd7c8c70) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:455
#15 0x00007f48100a7f37 in buildContextUses (code=..., declarations=QList<KDevelop::IndexedDeclaration> = {...}, context=0xd7c8bd0) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:459
#16 0x00007f48100a7f37 in buildContextUses (code=..., declarations=QList<KDevelop::IndexedDeclaration> = {...}, context=0xd8eea40) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:459
#17 0x00007f48100a83f4 in KDevelop::TopContextUsesWidget::setExpanded (this=0xce47990, expanded=true) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:487
#18 0x00007f48100a95d8 in KDevelop::UsesWidget::UsesWidgetCollector::processUses (this=0x2dadc50, topContext=...) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:644
#19 0x00007f48100b275a in KDevelop::UsesCollector::updateReady (this=0x2dadc50, url=..., topContext=...) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/usescollector.cpp:402
#20 0x00007f4810146197 in KDevelop::UsesCollector::qt_static_metacall (_o=0x2dadc50, _c=QMetaObject::InvokeMetaMethod, _id=3, _a=0x7ffe33801020) at /d/kde/build/5/extragear/kdevelop/kdevplatform/language/moc_usescollector.cpp:94
#21 0x00007f4812df46af in QMetaMethod::invoke (this=0x7ffe338014e0, object=0x2dadc50, connectionType=Qt::DirectConnection, returnValue=..., val0=..., val1=..., val2=..., val3=..., val4=..., val5=..., val6=..., val7=..., val8=..., val9=...) at kernel/qmetaobject.cpp:2211
#22 0x00007f4812df3b9a in QMetaObject::invokeMethod (obj=0x2dadc50, member=0x7f481014dd52 "updateReady", type=Qt::DirectConnection, ret=..., val0=..., val1=..., val2=..., val3=..., val4=..., val5=..., val6=..., val7=..., val8=..., val9=...) at kernel/qmetaobject.cpp:1478
#23 0x00007f480ff0eeef in QMetaObject::invokeMethod (obj=0x2dadc50, member=0x7f481014dd52 "updateReady", type=Qt::DirectConnection, val0=..., val1=..., val2=..., val3=..., val4=..., val5=..., val6=..., val7=..., val8=..., val9=...) at /d/qt/5/kde/qtbase/include/QtCore/../../src/corelib/kernel/qobjectdefs.h:412
#24 0x00007f480ff5f261 in KDevelop::DUChain::updateContextForUrl (this=0x1e9cc40, document=..., minFeatures=KDevelop::TopDUContext::Features::AllDeclarationsContextsAndUses, notifyReady=0x2dadc50, priority=1) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/duchain.cpp:1678
#25 0x00007f48100b1102 in KDevelop::UsesCollector::startCollecting (this=0x2dadc50) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/usescollector.cpp:296 
#26 0x00007f48100a8a83 in KDevelop::UsesWidget::UsesWidget (this=0x6f6dd00, declaration=..., customCollector=...) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/useswidget.cpp:535
#27 0x00007f4810094694 in KDevelop::UsesNavigationContext::UsesNavigationContext (this=0xcbf910, declaration=..., previousContext=0x433d640) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/usesnavigationcontext.cpp:30
#28 0x00007f481008e289 in KDevelop::AbstractNavigationContext::execute (this=0x433d640, action=...) at /d/kde/src/5/extragear/kdevelop/kdevplatform/language/duchain/navigation/abstractnavigationcontext.cpp:183
#29 0x00007f47cdfa0ec8 in ContextBrowserPlugin::showUsesDelayed (this=0x23e4c30, declaration=...) at /d/kde/src/5/extragear/kdevelop/kdevplatform/plugins/contextbrowser/contextbrowser.cpp:375

The constructor of a UsesWidget triggers the destructor of another UsesWidget??


447│ QList<ContextUsesWidget*> buildContextUses(const CodeRepresentation& code, QList<IndexedDeclaration> declarations, DUContext* context) {
448│   QList<ContextUsesWidget*> ret;
449│
450│   if(!context->parentContext() || isNewGroup(context->parentContext(), context)) {
451│     ContextUsesWidget* created = new ContextUsesWidget(code, declarations, context);
452│     if(created->hasItems())
453│       ret << created;
454│     else
455├>        delete created;
456│   }

Creating widgets and deleting them right away sounds very slow, when done in a loop (the caller has a loop).
Comment 1 Kevin Funk 2016-10-20 23:55:28 UTC
For the one planning to work on this: We should probably just drop the hugely inefficient implementation of the Uses Widget feature (one QWidget per use, for instance... sic!) and instead base it on a proper Qt model.