]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-42251: Add gettrace and getprofile to threading (GH-23125)
authorMario Corchero <mcorcherojim@bloomberg.net>
Wed, 4 Nov 2020 09:27:43 +0000 (10:27 +0100)
committerGitHub <noreply@github.com>
Wed, 4 Nov 2020 09:27:43 +0000 (09:27 +0000)
This allows to retrieve the functions that were set in these two, which might differ from sys.gettrace and sys.getprofile within a thread.

Doc/library/threading.rst
Doc/whatsnew/3.10.rst
Lib/test/test_threading.py
Lib/threading.py
Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst [new file with mode: 0644]

index 7eb12fe116bd2da6dd642a44375f1258bca25417..e05486f7d08494f442097166127f82e67020efa1 100644 (file)
@@ -121,6 +121,17 @@ This module defines the following functions:
    :meth:`~Thread.run` method is called.
 
 
+.. function:: gettrace()
+
+   .. index::
+      single: trace function
+      single: debugger
+
+   Get the trace function as set by :func:`settrace`.
+
+   .. versionadded:: 3.10
+
+
 .. function:: setprofile(func)
 
    .. index:: single: profile function
@@ -130,6 +141,15 @@ This module defines the following functions:
    :meth:`~Thread.run` method is called.
 
 
+.. function:: getprofile()
+
+   .. index:: single: profile function
+
+   Get the profiler function as set by :func:`setprofile`.
+
+   .. versionadded:: 3.10
+
+
 .. function:: stack_size([size])
 
    Return the thread stack size used when creating new threads.  The optional
index 60dee0c6bd1651b2ff1871099b07343fbd9f9b5f..89fc300778290a9d510fae707fce583c73a6a52c 100644 (file)
@@ -224,6 +224,14 @@ Add :data:`sys.orig_argv` attribute: the list of the original command line
 arguments passed to the Python executable.
 (Contributed by Victor Stinner in :issue:`23427`.)
 
+threading
+---------
+
+Added :func:`threading.gettrace` and :func:`threading.getprofile` to
+retrieve the functions set by :func:`threading.settrace` and
+:func:`threading.setprofile` respectively.
+(Contributed by Mario Corchero in :issue:`42251`.)
+
 types
 -----
 
index 2f0f3ae0946a579b5e4f0caa974514ffbb3346a3..e0e5406ac26a1e7f56552f804d9880110ee8883b 100644 (file)
@@ -765,6 +765,27 @@ class ThreadTests(BaseTestCase):
         finally:
             sys.settrace(old_trace)
 
+    def test_gettrace(self):
+        def noop_trace(frame, event, arg):
+            # no operation
+            return noop_trace
+        old_trace = threading.gettrace()
+        try:
+            threading.settrace(noop_trace)
+            trace_func = threading.gettrace()
+            self.assertEqual(noop_trace,trace_func)
+        finally:
+            threading.settrace(old_trace)
+
+    def test_getprofile(self):
+        def fn(*args): pass
+        old_profile = threading.getprofile()
+        try:
+            threading.setprofile(fn)
+            self.assertEqual(fn, threading.getprofile())
+        finally:
+            threading.setprofile(old_profile)
+
     @cpython_only
     def test_shutdown_locks(self):
         for daemon in (False, True):
index 06c77f70fe74f59e186ddf751a795336f82fef70..d4fe649e4f04b53dd7d2cefae29bc93e01429229 100644 (file)
@@ -28,7 +28,7 @@ __all__ = ['get_ident', 'active_count', 'Condition', 'current_thread',
            'Event', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Thread',
            'Barrier', 'BrokenBarrierError', 'Timer', 'ThreadError',
            'setprofile', 'settrace', 'local', 'stack_size',
-           'excepthook', 'ExceptHookArgs']
+           'excepthook', 'ExceptHookArgs', 'gettrace', 'getprofile']
 
 # Rename some stuff so "from threading import *" is safe
 _start_new_thread = _thread.start_new_thread
@@ -65,6 +65,10 @@ def setprofile(func):
     global _profile_hook
     _profile_hook = func
 
+def getprofile():
+    """Get the profiler function as set by threading.setprofile()."""
+    return _profile_hook
+
 def settrace(func):
     """Set a trace function for all threads started from the threading module.
 
@@ -75,6 +79,10 @@ def settrace(func):
     global _trace_hook
     _trace_hook = func
 
+def gettrace():
+    """Get the trace function as set by threading.settrace()."""
+    return _trace_hook
+
 # Synchronization classes
 
 Lock = _allocate_lock
diff --git a/Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst b/Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst
new file mode 100644 (file)
index 0000000..7435c83
--- /dev/null
@@ -0,0 +1,3 @@
+Added :func:`threading.gettrace` and :func:`threading.getprofile` to
+retrieve the functions set by :func:`threading.settrace` and
+:func:`threading.setprofile` respectively. Patch by Mario Corchero.