[pypy-svn] r40629 - pypy/dist/pypy/translator/goal

mwh at codespeak.net mwh at codespeak.net
Sat Mar 17 10:55:08 CET 2007


Author: mwh
Date: Sat Mar 17 10:55:05 2007
New Revision: 40629

Modified:
   pypy/dist/pypy/translator/goal/multibuild.py
Log:
run builds in a subprocess to avoid massive memory growth.
run builds in random order, so as to not spend the first 12 hours the script
runs for finding out that stackless doesn't work with llvm :/


Modified: pypy/dist/pypy/translator/goal/multibuild.py
==============================================================================
--- pypy/dist/pypy/translator/goal/multibuild.py	(original)
+++ pypy/dist/pypy/translator/goal/multibuild.py	Sat Mar 17 10:55:05 2007
@@ -3,7 +3,7 @@
 from pypy.translator.goal import translate
 from pypy.translator.goal import targetpypystandalone
 from pypy.translator.driver import TranslationDriver
-import os, sys, traceback
+import os, sys, traceback, random
 
 def longoptfromname(config, name):
     from pypy.config.makerestdoc import get_cmdline
@@ -52,20 +52,11 @@
     return 'pypy-%s-%d%s'%(backend, rev, suffix)
 
 def _build(config, exe_name):
-    try:
-        driver = TranslationDriver.from_targetspec(
-            targetpypystandalone.__dict__,
-            config=config)
-        driver.exe_name = exe_name
-        driver.compile()
-    except (SystemExit, KeyboardInterrupt):
-        traceback.print_exc()
-        raise
-    except:
-        traceback.print_exc()
-        return "failed"
-    else:
-        return "worked"
+    driver = TranslationDriver.from_targetspec(
+        targetpypystandalone.__dict__,
+        config=config)
+    driver.exe_name = exe_name
+    driver.compile()
 
 def build_pypy_with_options(basedir, opts):
     config = get_pypy_config(translate.OVERRIDES, translating=True)
@@ -80,18 +71,31 @@
     print exe_name,
     sys.stdout.flush()
 
-    se = sys.stderr
-    so = sys.stdout
-    try:
-        logfile = sys.stderr = sys.stdout = open(exe_name + '-log', 'w')
-        r = _build(config, exe_name)
-    finally:
-        sys.stderr = se
-        sys.stdout = so
-        logfile.close()
+    pid = os.fork()
 
-    print r
-    return exe_name, r
+    if pid == 0:
+        logfile = open(exe_name + '-log', 'w')
+        davenull = os.open('/dev/null', os.O_RDONLY)
+        os.dup2(davenull, 0)
+        os.dup2(logfile.fileno(), 1)
+        os.dup2(logfile.fileno(), 2)
+        try:
+            try:
+                r = _build(config, exe_name)
+            except:
+                os._exit(1)
+            else:
+                os._exit(0)
+        finally:
+            logfile.close()
+    else:
+        pid, status = os.waitpid(pid, 0)
+        if status:
+            r = 'failed'
+        else:
+            r = 'succeeded'
+        print r
+        return exe_name, r
 
 def get_options(fname):
     def gen_opts(sofar, remaining):
@@ -115,7 +119,9 @@
     basedir = sys.argv[1]
     optionsfile = sys.argv[2]
     results = []
-    for opts in get_options(optionsfile):
+    options = list(get_options(optionsfile))
+    random.shuffle(options)
+    for opts in options:
         results.append(build_pypy_with_options(basedir, opts))
     out = open(os.path.join(basedir, 'results'), 'w')
     for exe, r in results:



More information about the Pypy-commit mailing list