summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Deegan <bill@baddogconsulting.com>2019-08-20 22:11:41 (GMT)
committerGitHub <noreply@github.com>2019-08-20 22:11:41 (GMT)
commitb087c443c413918e46cec5ae4175155ab23ab8ac (patch)
treebd9bc59dbe331912328998b0723795b38543879f
parentce8f7eccdbcb626baa4a036dd8230268a5c35192 (diff)
parentba502ccd74df9f8411fdb63345a8a070b3764a49 (diff)
downloadSCons-b087c443c413918e46cec5ae4175155ab23ab8ac.zip
SCons-b087c443c413918e46cec5ae4175155ab23ab8ac.tar.gz
SCons-b087c443c413918e46cec5ae4175155ab23ab8ac.tar.bz2
Merge pull request #3427 from chasinglogic/files-ninfo
Improve threading performance by sharing NodeInfo across threads
-rwxr-xr-xsrc/CHANGES.txt6
-rw-r--r--src/engine/SCons/Node/FSTests.py7
-rw-r--r--src/engine/SCons/Node/__init__.py8
3 files changed, 11 insertions, 10 deletions
diff --git a/src/CHANGES.txt b/src/CHANGES.txt
index 3efb734..6450da5 100755
--- a/src/CHANGES.txt
+++ b/src/CHANGES.txt
@@ -6,9 +6,11 @@
RELEASE VERSION/DATE TO BE FILLED IN LATER
- From John Doe:
+ From Mathew Robinson:
- - Whatever John Doe did.
+ - Improved threading performance by ensuring NodeInfo is shared
+ across threads. Results in ~13% improvement for parallel builds
+ (-j# > 1) with many shared nodes.
RELEASE 3.1.1 - Mon, 07 Aug 2019 20:09:12 -0500
diff --git a/src/engine/SCons/Node/FSTests.py b/src/engine/SCons/Node/FSTests.py
index 72eaba7..eddfdf0 100644
--- a/src/engine/SCons/Node/FSTests.py
+++ b/src/engine/SCons/Node/FSTests.py
@@ -2545,11 +2545,10 @@ class FileTestCase(_tempdirTestCase):
def get_ninfo(self):
""" mocked to ensure csig will equal the filename"""
- try:
- return self.ninfo
- except AttributeError:
- self.ninfo = FakeNodeInfo(self.name, self.timestamp)
+ if self.ninfo is not None:
return self.ninfo
+ self.ninfo = FakeNodeInfo(self.name, self.timestamp)
+ return self.ninfo
def get_csig(self):
ninfo = self.get_ninfo()
diff --git a/src/engine/SCons/Node/__init__.py b/src/engine/SCons/Node/__init__.py
index 572465f..daf79ba 100644
--- a/src/engine/SCons/Node/__init__.py
+++ b/src/engine/SCons/Node/__init__.py
@@ -614,6 +614,7 @@ class Node(object, with_metaclass(NoSlotsPyPy)):
self._func_rexists = 1
self._func_get_contents = 0
self._func_target_from_source = 0
+ self.ninfo = None
self.clear_memoized_values()
@@ -1131,11 +1132,10 @@ class Node(object, with_metaclass(NoSlotsPyPy)):
return ninfo
def get_ninfo(self):
- try:
- return self.ninfo
- except AttributeError:
- self.ninfo = self.new_ninfo()
+ if self.ninfo is not None:
return self.ninfo
+ self.ninfo = self.new_ninfo()
+ return self.ninfo
def new_binfo(self):
binfo = self.BuildInfo()