1 # Copyright 2014 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file.
5 # This script computs the number of concurrent links we want to run in the build
6 # as a function of machine spec. It's based on GetDefaultConcurrentLinks in GYP.
13 def GetDefaultConcurrentLinks():
14 # Inherit the legacy environment variable for people that have set it in GYP.
15 pool_size
= int(os
.getenv('GYP_LINK_CONCURRENCY', 0))
19 if sys
.platform
in ('win32', 'cygwin'):
22 class MEMORYSTATUSEX(ctypes
.Structure
):
24 ("dwLength", ctypes
.c_ulong
),
25 ("dwMemoryLoad", ctypes
.c_ulong
),
26 ("ullTotalPhys", ctypes
.c_ulonglong
),
27 ("ullAvailPhys", ctypes
.c_ulonglong
),
28 ("ullTotalPageFile", ctypes
.c_ulonglong
),
29 ("ullAvailPageFile", ctypes
.c_ulonglong
),
30 ("ullTotalVirtual", ctypes
.c_ulonglong
),
31 ("ullAvailVirtual", ctypes
.c_ulonglong
),
32 ("sullAvailExtendedVirtual", ctypes
.c_ulonglong
),
35 stat
= MEMORYSTATUSEX(dwLength
=ctypes
.sizeof(MEMORYSTATUSEX
))
36 ctypes
.windll
.kernel32
.GlobalMemoryStatusEx(ctypes
.byref(stat
))
38 # VS 2015 uses 20% more working set than VS 2013 and can consume all RAM
40 mem_limit
= max(1, stat
.ullTotalPhys
/ (5 * (2 ** 30))) # total / 5GB
41 hard_cap
= max(1, int(os
.getenv('GYP_LINK_CONCURRENCY_MAX', 2**32)))
42 return min(mem_limit
, hard_cap
)
43 elif sys
.platform
.startswith('linux'):
44 if os
.path
.exists("/proc/meminfo"):
45 with
open("/proc/meminfo") as meminfo
:
46 memtotal_re
= re
.compile(r
'^MemTotal:\s*(\d*)\s*kB')
48 match
= memtotal_re
.match(line
)
51 # Allow 8Gb per link on Linux because Gold is quite memory hungry
52 return max(1, int(match
.group(1)) / (8 * (2 ** 20)))
54 elif sys
.platform
== 'darwin':
56 avail_bytes
= int(subprocess
.check_output(['sysctl', '-n', 'hw.memsize']))
57 # A static library debug build of Chromium's unit_tests takes ~2.7GB, so
58 # 4GB per ld process allows for some more bloat.
59 return max(1, avail_bytes
/ (4 * (2 ** 30))) # total / 4GB
63 # TODO(scottmg): Implement this for other platforms.
66 print GetDefaultConcurrentLinks()