mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									db6434c474
								
							
						
					
					
						commit
						0001a1b69e
					
				
					 5 changed files with 61 additions and 1 deletions
				
			
		|  | @ -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 | ||||
|  |  | |||
|  | @ -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 | ||||
| ----- | ||||
| 
 | ||||
|  |  | |||
|  | @ -765,6 +765,27 @@ def callback(): | |||
|         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): | ||||
|  |  | |||
|  | @ -28,7 +28,7 @@ | |||
|            '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 | ||||
|  |  | |||
|  | @ -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. | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Mario Corchero
						Mario Corchero