diff options
author | Mario Corchero <mcorcherojim@bloomberg.net> | 2020-11-04 09:27:43 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-04 09:27:43 (GMT) |
commit | 0001a1b69ecda47b0406daa88c2943877580bcae (patch) | |
tree | 3b9a00c8fc1c9602aa77313e029330b43d81bd93 | |
parent | db6434c474f7389a98b8118ca87fca988416bf33 (diff) | |
download | cpython-0001a1b69ecda47b0406daa88c2943877580bcae.zip cpython-0001a1b69ecda47b0406daa88c2943877580bcae.tar.gz cpython-0001a1b69ecda47b0406daa88c2943877580bcae.tar.bz2 |
bpo-42251: Add gettrace and getprofile to threading (GH-23125)
This allows to retrieve the functions that were set in these two, which might differ from sys.gettrace and sys.getprofile within a thread.
-rw-r--r-- | Doc/library/threading.rst | 20 | ||||
-rw-r--r-- | Doc/whatsnew/3.10.rst | 8 | ||||
-rw-r--r-- | Lib/test/test_threading.py | 21 | ||||
-rw-r--r-- | Lib/threading.py | 10 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst | 3 |
5 files changed, 61 insertions, 1 deletions
diff --git a/Doc/library/threading.rst b/Doc/library/threading.rst index 7eb12fe..e05486f 100644 --- a/Doc/library/threading.rst +++ b/Doc/library/threading.rst @@ -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 diff --git a/Doc/whatsnew/3.10.rst b/Doc/whatsnew/3.10.rst index 60dee0c..89fc300 100644 --- a/Doc/whatsnew/3.10.rst +++ b/Doc/whatsnew/3.10.rst @@ -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 ----- diff --git a/Lib/test/test_threading.py b/Lib/test/test_threading.py index 2f0f3ae..e0e5406 100644 --- a/Lib/test/test_threading.py +++ b/Lib/test/test_threading.py @@ -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): diff --git a/Lib/threading.py b/Lib/threading.py index 06c77f7..d4fe649 100644 --- a/Lib/threading.py +++ b/Lib/threading.py @@ -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 index 0000000..7435c83 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2020-11-03-14-15-35.bpo-42251.6TC32V.rst @@ -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. |