|  | # 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:])) |