[pypy-commit] pypy py3.3: Add "all_threads" parameter to faulthandler.enable().

amauryfa noreply at buildbot.pypy.org
Sun Oct 5 20:22:54 CEST 2014


Author: Amaury Forgeot d'Arc <amauryfa at gmail.com>
Branch: py3.3
Changeset: r73792:827283240a44
Date: 2014-09-18 00:33 +0200
http://bitbucket.org/pypy/pypy/changeset/827283240a44/

Log:	Add "all_threads" parameter to faulthandler.enable().

diff --git a/pypy/module/faulthandler/interp_faulthandler.py b/pypy/module/faulthandler/interp_faulthandler.py
--- a/pypy/module/faulthandler/interp_faulthandler.py
+++ b/pypy/module/faulthandler/interp_faulthandler.py
@@ -6,6 +6,8 @@
 from rpython.translator.tool.cbuild import ExternalCompilationInfo
 from pypy.interpreter.error import OperationError, oefmt
 
+MAX_NTHREADS = 100
+
 cwd = py.path.local(__file__).dirpath()
 eci = ExternalCompilationInfo(
     includes=[cwd.join('faulthandler.h')],
@@ -43,12 +45,18 @@
 class FatalErrorState(object):
     def __init__(self, space):
         self.enabled = False
+        self.all_threads = True
 
-def enable(space):
-    space.fromcache(FatalErrorState).enabled = True
+ at unwrap_spec(w_file=WrappedDefault(None),
+             w_all_threads=WrappedDefault(True))
+def enable(space, w_file, w_all_threads):
+    state = space.fromcache(FatalErrorState)
+    state.enabled = True
+    state.all_threads = bool(space.int_w(w_all_threads))
 
 def disable(space):
-    space.fromcache(FatalErrorState).enabled = False
+    state = space.fromcache(FatalErrorState)
+    state.enabled = False
 
 def is_enabled(space):
     return space.wrap(space.fromcache(FatalErrorState).enabled)
@@ -60,25 +68,40 @@
 @unwrap_spec(w_file=WrappedDefault(None),
              w_all_threads=WrappedDefault(True))
 def dump_traceback(space, w_file, w_all_threads):
-    ec = space.getexecutioncontext()
-    ecs = space.threadlocals.getallvalues()
+    current_ec = space.getexecutioncontext()
+    if space.int_w(w_all_threads):
+        ecs = space.threadlocals.getallvalues()
+    else:
+        ecs = {0: current_ec}
 
     if space.is_none(w_file):
         w_file = space.sys.get('stderr')
     fd = space.c_filedescriptor_w(w_file)
 
-    frame = ec.gettopframe()
-    while frame:
-        code = frame.pycode
-        lineno = frame.get_last_lineno()
-        if code:
-            os.write(fd, "File \"%s\", line %s in %s\n" % (
-                    code.co_filename, lineno, code.co_name))
+    nthreads = 0
+    for thread_ident, ec in ecs.items():
+        if nthreads:
+            os.write(fd, "\n")
+        if nthreads >= MAX_NTHREADS:
+            os.write(fd, "...\n")
+            break
+        if ec is current_ec:
+            os.write(fd, "Current thread 0x%x:\n" % thread_ident)
         else:
-            os.write(fd, "File ???, line %s in ???\n" % (
-                    lineno,))
+            os.write(fd, "Thread 0x%x:\n" % thread_ident)
 
-        frame = frame.f_backref()
+        frame = ec.gettopframe()
+        while frame:
+            code = frame.pycode
+            lineno = frame.get_last_lineno()
+            if code:
+                os.write(fd, "File \"%s\", line %s in %s\n" % (
+                        code.co_filename, lineno, code.co_name))
+            else:
+                os.write(fd, "File ???, line %s in ???\n" % (
+                        lineno,))
+
+            frame = frame.f_backref()
  
 
 @unwrap_spec(w_release_gil=WrappedDefault(False))
diff --git a/pypy/module/faulthandler/test/test_faulthander.py b/pypy/module/faulthandler/test/test_faulthander.py
--- a/pypy/module/faulthandler/test/test_faulthander.py
+++ b/pypy/module/faulthandler/test/test_faulthander.py
@@ -4,13 +4,14 @@
     }
 
     def test_enable(self):
-        import faulthandler
+        import faulthandler, sys
         faulthandler.enable()
         assert faulthandler.is_enabled() is True
+        faulthandler.enable(file=sys.stderr, all_threads=True)
         faulthandler.disable()
         assert faulthandler.is_enabled() is False
 
     def test_dump_traceback(self):
-        import faulthandler
+        import faulthandler, sys
         faulthandler.dump_traceback()
-        
+        faulthandler.dump_traceback(file=sys.stderr, all_threads=True)
diff --git a/pypy/module/faulthandler/test/test_ztranslation.py b/pypy/module/faulthandler/test/test_ztranslation.py
new file mode 100644
--- /dev/null
+++ b/pypy/module/faulthandler/test/test_ztranslation.py
@@ -0,0 +1,4 @@
+from pypy.objspace.fake.checkmodule import checkmodule
+
+def test_faulthandler_translates():
+    checkmodule('faulthandler')


More information about the pypy-commit mailing list