Removing a TopDUContext
Jonathan Verner
jonathan at temno.eu
Sat May 4 21:25:28 BST 2019
Hi,
I have a probably stupid question... I am slowly getting to the point where my experimental C# plugin becomes usable. However, right now KDevelop crashes on me whenever I close an open file. The crash happens on line 1493 in duchain.cpp in the documentClosed method... There, kdevelop iterates over m_openDocumentContexts and, if the match the url of the document to be closed, they are removed... It seems that one of these context pointers is no longer valid. Now my theory is that this is due to the way I handle constructing the DU Chain. What I do is I always construct a DU Chain from scratch. If a DUChain is already available for the document, I remove it first using:
DUChain::self()->removeDocumentChain(m_top_context);
However, this seems not to remove it from the m_openDocumentContexts list and later leads to a crash (that is my theory, at least---supported by the crashes disappearing when I comment out the removeDocumentChain call :-)). So my question is: How do I dispose of the old DU Chain? Or do I just reuse the TopDUContetx? Doesn't that clutter up memory with old declarations/uses/contexts and interfere with code navigation?
Currently my code looks like this (https://gitlab.com/Verner/duserver/blob/90e9de7d879b46c853d65d3ab2f9622f7468e11f/src/builder.cpp#L328):
328 DUChainWriteLocker lock( DUChain::lock() );
329
330 /* If there was a DU chain for the document, remove it first */
331 m_top_context = DUChainUtils::standardContextForUrl(m_url.toUrl());
332
333
334 if (m_top_context) {
335 qCDebug(PLUGIN_DUSERVER) << "Removing top DU Chain";
336 DUChain::self()->removeDocumentChain(m_top_context);
337 }
338
339 /* Create a new top DU chain for the document */
340 ParsingEnvironmentFile* file = new ParsingEnvironmentFile(m_url);
341 // file->setLanguage(DUServerLang::languageString());
342 m_top_context = new TopDUContext(m_url, RangeInRevision( CursorInRevision( 0, 0 ), CursorInRevision( INT_MAX, INT_MAX ) ), file);
343 m_top_context->setType( DUContext::Global );
344
345 /* Register the DU chain */
346 DUChain::self()->addDocumentChain( m_top_context );
347
348 /* Build the DU chain */
349 for(const TreeNode &node: m_root->children())
350 build(node, m_top_context);
351
352 build_uses();
353
354 return m_top_context;
So I guess the code on 336 should be replaced with something else... Perhaps the whole condition on 334 should be inverted and the construction
of the new TopDUContext on line 342 and following be moved inside?
Best,
Jonathan
--
Jonathan Verner, PhD
Department of Logic, Charles University
Palachovo nám. 2, 116 38 Praha 1
Czech Republic
More information about the KDevelop-devel
mailing list