# 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 " sys.exit(1) output_file = sys.argv.pop(1) sys.exit(measure_link_vsize(output_file, sys.argv[1:]))