[Scons-dev] please try latest default branch
Gary Oberbrunner
garyo at oberbrunner.com
Tue Jan 28 17:57:26 EST 2014
More results, no fix yet.
The generated file all-defuns.c I mentioned before is definitely part of
the problem. I back-ported the tracing code I wrote to just before Dirk's
memory optimization. In that version, near the beginning of the build
phase something calls node.is_up_to_date() on all-defuns.c and it says it
has changed, due to depending on a dir "mkl" which is in no_state (i.e.
hasn't been evaluated yet). In Dirk's version, this result gets cached,
which seems sensible. But in the old version, when the taskmaster
considers that all-defuns.c node, and calls is_up_to_date(), now it
correctly returns True, because by now the mkl dir has been evaluated and
it's in up-to-date state. So it's definitely the caching that's causing
the trouble, but I don't understand why is_up_to_date should return
different values at different times -- especially go from false to true
before anything's been built. Perhaps there's another bug in the code
which Dirk's patch exposes?
I would think is_up_to_date() should never assume that being unprocessed
(i.e. no_state) means not up-to-date; I'd think it should have scanned the
no_state node before its dependents. Anyone have any clues?
On Sun, Jan 26, 2014 at 11:15 AM, Gary Oberbrunner <garyo at oberbrunner.com>wrote:
> I'm continuing to track this down. No solid results so far (but I'm
> adding lots of tracing code). I have a generated source file,
> all-defuns.c, that depends (using Depends) on a dir (mkl), and it
> seems like with the new code while the taskmaster is checking
> all-defuns.obj it checks all-defuns.c, which calls Dir.changed() on
> the dir, which just checks the node.state -- and the state is
> no_state, i.e. it hasn't been evaluated yet, which changed()
> interprets as being changed, so it decides to regenerate the source
> file all-defuns.c. Later, when the taskmaster gets to checking the
> mkl dir, it finds all of its children are up to date and marks it up
> to date, but it's too late by then. I suspect (?) something in the
> taskmaster updates but will have to keep poking at it.
>
> On Tue, Jan 14, 2014 at 1:39 PM, Dirk Bächle <tshortik at gmx.de> wrote:
> > On 14.01.2014 14:44, Gary Oberbrunner wrote:
> >>
> >> OK, I'll try that. I guess the approach should be to set a new
> >> (temporary) flag in the node when its executor is released, and then
> print a
> >> stack trace if any node with that flag set gets its changed() method
> called?
> >>
> > This flag already exists and it's called "self.released_target_info"
> (check
> > the end of the relase_target_info() method).
> > Then you want to use the KeyError exception path in File.changed() like
> > this:
> >
> > if node is None:
> >
> > try:
> > return self._memo['changed']
> > except KeyError:
> > if self.released_target_info:
> > # We have no executor anymore, but the cached
> "changed"
> > # value doesn't exist either -> print stacktrace!
> >
> >
> > Dirk
> >
> >
> > _______________________________________________
> > Scons-dev mailing list
> > Scons-dev at scons.org
> > http://two.pairlist.net/mailman/listinfo/scons-dev
>
>
>
> --
> Gary
>
--
Gary
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://two.pairlist.net/pipermail/scons-dev/attachments/20140128/fed02bef/attachment.htm>
More information about the Scons-dev
mailing list