[pypy-svn] r57927 - pypy/branch/cross-compilation/pypy/translator/benchmark

fijal at codespeak.net fijal at codespeak.net
Sun Sep 7 11:15:28 CEST 2008


Author: fijal
Date: Sun Sep  7 11:15:26 2008
New Revision: 57927

Modified:
   pypy/branch/cross-compilation/pypy/translator/benchmark/bench_mem.py
Log:
allow to have -l log option


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	Sun Sep  7 11:15:26 2008
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
-""" Usage: bench_mem.py program_name [arg0] [arg1] ...
+""" Usage: bench_mem.py [-l log] program_name [arg0] [arg1] ...
 """
 import os
 import py
@@ -49,25 +49,33 @@
     realos = os
     
     def __init__(self, name, args):
+        signal.signal(signal.SIGCHLD, lambda a,b: self.close())
         self.pid = run_child(name, args)
+        self.results = []
 
     def loop(self, logfile, interval):
         if isinstance(logfile, basestring):
             logfile = open(logfile, 'w')
         counter = 0
-        while 1:
-            try:
-                res = parse_smaps_output(open('/proc/%d/smaps' % self.pid).read())
-                print >>logfile, counter, ' ', res.private
-            except IOError:
-                self.close()
-                return
-            counter += 1
-            time.sleep(interval)
+        try:
+            while 1:
+                try:
+                    res = parse_smaps_output(open('/proc/%d/smaps' % self.pid).read())
+                    self.results.append((counter, res.private))
+                    if logfile:
+                        print >>logfile, counter, ' ', res.private
+                except IOError:
+                    return
+                counter += 1
+                time.sleep(interval)
+        except (KeyboardInterrupt, SystemExit):
+            os.kill(self.pid, signal.SIGTERM)
+            raise
 
     def close(self):
-        if self.pid:
+        if self.pid != -1:
             self.realos.waitpid(self.pid, 0)
+            self.pid = -1
 
     def __del__(self):
         self.close()
@@ -78,9 +86,27 @@
         os.execvp(name, [name] + args)
     return pid
 
+def parse_options(argv):
+    num = 0
+    logname = None
+    while num < len(argv):
+        arg = argv[num]
+        if arg == '-l':
+            logname = argv[num + 1]
+            num += 1
+        else:
+            name = argv[num]
+            if logname is None:
+                logname = py.path.local(name).basename + '.log'
+            args = argv[num + 1:]
+            return logname, name, args
+        num += 1
+    raise Exception("Wrong arguments: %s" % (argv,))
+
 if __name__ == '__main__':
     if len(sys.argv) < 2:
         print __doc__
         sys.exit(1)
-    cp = ChildProcess(sys.argv[1], sys.argv[2:])
-    cp.loop(sys.stdout, 0.1)
+    logname, name, args = parse_options(sys.argv[1:])
+    cp = ChildProcess(name, args)
+    cp.loop(logname, 0)



More information about the Pypy-commit mailing list