[pypy-svn] r57976 - in pypy/branch/cross-compilation/pypy/translator/benchmark: . test

fijal at codespeak.net fijal at codespeak.net
Mon Sep 8 17:05:58 CEST 2008


Author: fijal
Date: Mon Sep  8 17:05:54 2008
New Revision: 57976

Modified:
   pypy/branch/cross-compilation/pypy/translator/benchmark/bench_mem.py
   pypy/branch/cross-compilation/pypy/translator/benchmark/test/test_bench_mem.py
Log:
More support for running cooperative benchmarks


Modified: pypy/branch/cross-compilation/pypy/translator/benchmark/bench_mem.py
==============================================================================
--- pypy/branch/cross-compilation/pypy/translator/benchmark/bench_mem.py	(original)
+++ pypy/branch/cross-compilation/pypy/translator/benchmark/bench_mem.py	Mon Sep  8 17:05:54 2008
@@ -53,6 +53,7 @@
     realos = os
     
     def __init__(self, name, args):
+        self.pid = -1
         signal.signal(signal.SIGCHLD, lambda a,b: self.close())
         self.pid = run_child(name, args)
         self.results = []
@@ -84,6 +85,32 @@
     def __del__(self):
         self.close()
 
+def run_cooperative(func):
+    """ The idea is that we fork() and execute the function func in one
+    process. In parent process we measure private memory obtained by a process
+    when we read anything in pipe. We send back that we did that
+    """
+    parentread, childwrite = os.pipe()
+    childread, parentwrite = os.pipe()
+    pid = os.fork()
+    if not pid:
+        os.close(parentread)
+        os.close(parentwrite)
+        try:
+            func(lambda : os.read(childread, 1),
+                 lambda x: os.write(childwrite, x))
+        except (SystemExit, KeyboardInterrupt):
+            pass
+        except:
+            import traceback
+            traceback.print_tb(sys.exc_info()[2])
+        os._exit(1)
+    os.close(childread)
+    os.close(childwrite)
+    return (lambda : os.read(parentread, 1),
+            lambda x: os.write(parentwrite, x),
+            pid)
+
 def run_child(name, args):
     pid = os.fork()
     if not pid:

Modified: pypy/branch/cross-compilation/pypy/translator/benchmark/test/test_bench_mem.py
==============================================================================
--- pypy/branch/cross-compilation/pypy/translator/benchmark/test/test_bench_mem.py	(original)
+++ pypy/branch/cross-compilation/pypy/translator/benchmark/test/test_bench_mem.py	Mon Sep  8 17:05:54 2008
@@ -23,6 +23,17 @@
         '/lib/libncurses.so.5.6' : 60,
        }
 
+def test_run_cooperative():
+    def f(read, write):
+        x = read()
+        assert x == '3'
+        write('4')
+    
+    read, write, pid = bench_mem.run_cooperative(f)
+    assert pid
+    write('3')
+    assert read() == '4'
+
 example_data = '''
 08048000-0813f000 r-xp 00000000 fd:00 75457      /usr/bin/python2.5
 Size:                988 kB



More information about the Pypy-commit mailing list