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

List:       kdevelop-devel
Subject:    Re: Dependencies of parse-jobs
From:       Milian Wolff <mail () milianw ! de>
Date:       2012-02-13 13:05:48
Message-ID: 1827780.zqhVqO0G5N () minime
[Download RAW message or body]

On Monday 13 February 2012 09:54:02 David Nolden wrote:
> 2012/2/12 Sven Brauch <svenbrauch@googlemail.com>:
> > Hi there,
> > =

> > PovAddict and I were tracking a bug (in the python plugin) a few days
> > ago which turned out to be caused by the order in which documents are
> > parsed to be wrong (as in, not like I wanted it to be, heh).
> > Currently, I'm doing this: If document A is parsed and an "import"
> > (same like #include in c++) is encountered, a parse job is created for
> > the imported document using
> >    DUChain::self()->updateContextForUrl(...)
> > with a priority that has a lower value than the current parse job (and
> > thus a higher priority (who invented this?)). Then the current
> =

> This one was my fault, I followed the linux priority logic, which
> later showed to suck hard. :-)
> =

> > document is marked as "needs update", and after the parse job
> > finished, it's registered for a re-parse again (that's done inside
> > parsejob::run) with a lower priority than it had before (I'll use the
> > word "priority" as everybody expects it to be used from now on):
> >  =

> >  KDevelop::ICore::self()->languageController()->backgroundParser()->add=
Do
> > cument(...) Now, that roughly works, but not quite; sometimes, the
> > documents are not parsed exactly in the order their priorities suggests.
> > I guess that is to be expected -- but what else is there except
> > priorities that can be used to "sort" parse jobs?
> > =

> > Here's the TL;DR version: What's the "good" way of forcing document A
> > to be re-parsed as soon as there's a top-context for B available which
> > satisfies the required $minimum_features? How does C++ do this? I
> > looked into the code, but couldn't quite find anything related to that
> > (it's a huge project...).
> > =

> > Any help would be appreciated. :)
> > =

> > Greetings,
> > Sven
> =

> In C++, included documents may depend on other documents included
> earlier, and thus they must be parsed right in-place.
> =

> You could do the same, by simply creating a new parse-job in-place and
> starting it recursively. You just need to care about preventing
> infinite recursion and multiple running parse-jobs f=FCr the same
> document. The question is what would be the correct way to deal with
> such recursion.
> =

> In a language where such recursion is allowed, the correct solution
> would probably be a multi-pass parsing: When you encounter an include,
> parse it in a "simplified" mode (just creating declarations for the
> symbol-table, but without building uses and/or types etc.), and later
> re-parse it in full mode after the "simplified" mode has been finished
> for all includes.

I've done this for PHP and it's simply a workaround with its own set of bug=
s. =

The way Sven does it (or tries to do it) is the only right way. I.e.: Don't =

even try this imo. For PHP I want to get rid of the "simplified" mode and u=
se =

the "proper" multipass as well.

So, if the priorities alone won't help then I assume it's a kind of a race =

condition. See, as long as you have one parse thread, the priority queue =

should be all that is required to keep things in order. Now with more threa=
ds, =

the dependency could be started in Thread A and the re-parse in Thread B, =

still failing to find a context for the dependency (it's still parsed in =

Thread A)...

I'm unsure how to handle this properly, a quick'n'dirty version would be to =

figure out "is dependency still parsing?" and - if so - waits on the =

UrlParseLock until the dependency has finished...

A cleaner solution - and faster since less threads need to wait - oh and al=
so =

less error prone, the above can easily deadlock on recursive includes ;-) - =

would be to use the addDocument() callback function. I.e. write some kind o=
f =

class that mapps file -> dependencies and adds the latter to the background =

parser. It then also listens to the callback and creates a new job once all =

dependencies have finished parsing...

What do you think?

Bye

-- =

Milian Wolff
mail@milianw.de
http://milianw.de

-- =

KDevelop-devel mailing list
KDevelop-devel@kdevelop.org
https://barney.cs.uni-potsdam.de/mailman/listinfo/kdevelop-devel
[prev in list] [next in list] [prev in thread] [next in thread] 

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