gecko/config/link.py

61 lines
2.0 KiB
Python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import expandlibs_exec
import sys
import threading
import time
from win32 import procmem
def measure_vsize_threadfunc(proc, output_file):
"""
Measure the virtual memory usage of |proc| at regular intervals
until it exits, then print the maximum value and write it to
|output_file|. Also, print something to the console every
half an hour to prevent the build job from getting killed when
linking a large PGOed binary.
"""
maxvsize = 0
idleTime = 0
while proc.returncode is None:
maxvsize, vsize = procmem.get_vmsize(proc._handle)
time.sleep(0.5)
idleTime += 0.5
if idleTime > 30 * 60:
print "Still linking, 30 minutes passed..."
sys.stdout.flush()
idleTime = 0
print "TinderboxPrint: linker max vsize: %d" % maxvsize
with open(output_file, "w") as f:
f.write("%d\n" % maxvsize)
def measure_link_vsize(output_file, args):
"""
Execute |args|, and measure the maximum virtual memory usage of the process,
printing it to stdout when finished.
"""
# This needs to be a list in order for the callback to set the
# variable properly with python-2's scoping rules.
t = [None]
def callback(proc):
t[0] = threading.Thread(target=measure_vsize_threadfunc,
args=(proc, output_file))
t[0].start()
exitcode = expandlibs_exec.main(args, proc_callback=callback)
# Wait for the background thread to finish.
t[0].join()
return exitcode
if __name__ == "__main__":
if sys.platform != "win32":
print >>sys.stderr, "link.py is only for use on Windows!"
sys.exit(1)
if len(sys.argv) < 3:
print >>sys.stderr, "Usage: link.py <output filename> <commandline>"
sys.exit(1)
output_file = sys.argv.pop(1)
sys.exit(measure_link_vsize(output_file, sys.argv[1:]))