Flutter Engine
The Flutter Engine
get_concurrent_links.py
Go to the documentation of this file.
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.
4
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.
7
8import os
9import re
10import subprocess
11import sys
12
13
15 # Inherit the legacy environment variable for people that have set it in GYP.
16 pool_size = int(os.getenv('GYP_LINK_CONCURRENCY', 0))
17 if pool_size:
18 return pool_size
19
20 if sys.platform in ('win32', 'cygwin'):
21 import ctypes
22
23 class MEMORYSTATUSEX(ctypes.Structure):
24 _fields_ = [
25 ("dwLength", ctypes.c_ulong),
26 ("dwMemoryLoad", ctypes.c_ulong),
27 ("ullTotalPhys", ctypes.c_ulonglong),
28 ("ullAvailPhys", ctypes.c_ulonglong),
29 ("ullTotalPageFile", ctypes.c_ulonglong),
30 ("ullAvailPageFile", ctypes.c_ulonglong),
31 ("ullTotalVirtual", ctypes.c_ulonglong),
32 ("ullAvailVirtual", ctypes.c_ulonglong),
33 ("sullAvailExtendedVirtual", ctypes.c_ulonglong),
34 ]
35
36 stat = MEMORYSTATUSEX(dwLength=ctypes.sizeof(MEMORYSTATUSEX))
37 ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat))
38
39 mem_limit = max(1, stat.ullTotalPhys // (4 * (2**30))) # total / 4GB
40 hard_cap = max(1, int(os.getenv('GYP_LINK_CONCURRENCY_MAX', 2**32)))
41 return min(mem_limit, hard_cap)
42 elif sys.platform.startswith('linux'):
43 if os.path.exists("/proc/meminfo"):
44 with open("/proc/meminfo") as meminfo:
45 memtotal_re = re.compile(r'^MemTotal:\s*(\d*)\s*kB')
46 for line in meminfo:
47 match = memtotal_re.match(line)
48 if not match:
49 continue
50 # Allow 8Gb per link on Linux because Gold is quite memory hungry
51 return max(1, int(match.group(1)) // (8 * (2**20)))
52 return 1
53 elif sys.platform == 'darwin':
54 try:
55 avail_bytes = int(
56 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
60 except Exception:
61 return 1
62 else:
63 # TODO(scottmg): Implement this for other platforms.
64 return 1
65
66
static float max(float r, float g, float b)
Definition: hsl.cpp:49
static float min(float r, float g, float b)
Definition: hsl.cpp:48
def print(*args, **kwargs)
Definition: run_tests.py:49