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?
On Mon, Jan 13, 2014 at 3:16 PM, Dirk Bächle <[email protected]> wrote: > On 13.01.2014 20:18, Gary Oberbrunner wrote: > >> Dirk, and others: I tracked down my spurious rebuild to the addition of >> caching changed-status in File.changed() in Node/FS.py. If I remove that >> caching code I don't get the rebuilds: >> >> diff --git a/src/engine/SCons/Node/FS.py b/src/engine/SCons/Node/FS.py >> --- a/src/engine/SCons/Node/FS.py >> +++ b/src/engine/SCons/Node/FS.py >> @@ -3043,13 +3043,15 @@ >> but we allow the return value to get cached after the reference >> to the Executor got released in release_target_info(). >> """ >> - if node is None: >> + allow_caching = False >> + if node is None and allow_caching: # try this >> try: >> return self._memo['changed'] >> except KeyError: >> pass >> has_changed = SCons.Node.Node.changed(self, node) >> + if allow_caching: >> self._memo['changed'] = has_changed >> return has_changed >> I also had to add this code to fix an exception when the file doesn't >> have an executor. >> >> diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__ >> init__.py >> --- a/src/engine/SCons/Node/__init__.py >> +++ b/src/engine/SCons/Node/__init__.py >> @@ -1090,7 +1090,10 @@ >> if t: Trace(': %s changed' % child) >> result = True >> + if self.get_executor(): >> contents = self.get_executor().get_contents() >> + else: >> + contents = None >> if self.has_builder(): >> import SCons.Util >> newsig = SCons.Util.MD5signature(contents) >> >> Dirk, what do you think? I'll play with this version for a while. >> >> > Okay, these both places are related by the call of > SCons.Node.Node.changed() from SCons.Node.FS.File.changed() (one calls the > other). What's supposed to happen is: in File.release_target_info() the > executor gets released. Before this, the changed() method is called, such > that it caches its value in self._memo['changed']. > If this doesn't work as expected, this would mean the File.changed() gets > called much later sometimes, after the executor got released *and* the > self._memo was reset. Can you try and get a stacktrace for when that > happens? > > It's crucial to be able to release the executor early...if we can't do it, > there won't be much of a memory improvement. > > Regards, > > Dirk > > > > _______________________________________________ > Scons-dev mailing list > [email protected] > http://two.pairlist.net/mailman/listinfo/scons-dev > -- Gary
_______________________________________________ Scons-dev mailing list [email protected] http://two.pairlist.net/mailman/listinfo/scons-dev
