| 
									
										
										
										
											2023-05-21 03:12:24 -07:00
										 |  |  | .. highlight:: c
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. _perfmaps:
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Support for Perf Maps
 | 
					
						
							|  |  |  | ----------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-22 17:47:24 +02:00
										 |  |  | On supported platforms (Linux and macOS), the runtime can take
 | 
					
						
							| 
									
										
										
										
											2023-05-21 03:12:24 -07:00
										 |  |  | advantage of *perf map files* to make Python functions visible to an external
 | 
					
						
							| 
									
										
										
										
											2025-07-22 17:47:24 +02:00
										 |  |  | profiling tool (such as `perf <https://perf.wiki.kernel.org/index.php/Main_Page>`_ or
 | 
					
						
							|  |  |  | `samply <https://github.com/mstange/samply/>`_). A running process may create a
 | 
					
						
							|  |  |  | file in the ``/tmp`` directory, which contains entries that can map a section
 | 
					
						
							|  |  |  | of executable code to a name. This interface is described in the
 | 
					
						
							| 
									
										
										
										
											2023-05-21 03:12:24 -07:00
										 |  |  | `documentation of the Linux Perf tool <https://git.kernel.org/pub/scm/linux/
 | 
					
						
							|  |  |  | kernel/git/torvalds/linux.git/tree/tools/perf/Documentation/jit-interface.txt>`_.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | In Python, these helper APIs can be used by libraries and features that rely
 | 
					
						
							|  |  |  | on generating machine code on the fly.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-20 08:06:59 -04:00
										 |  |  | Note that holding an :term:`attached thread state` is not required for these APIs.
 | 
					
						
							| 
									
										
										
										
											2023-05-21 03:12:24 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | .. c:function:: int PyUnstable_PerfMapState_Init(void)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Open the ``/tmp/perf-$pid.map`` file, unless it's already opened, and create
 | 
					
						
							|  |  |  |    a lock to ensure thread-safe writes to the file (provided the writes are
 | 
					
						
							|  |  |  |    done through :c:func:`PyUnstable_WritePerfMapEntry`). Normally, there's no need
 | 
					
						
							|  |  |  |    to call this explicitly; just use :c:func:`PyUnstable_WritePerfMapEntry`
 | 
					
						
							|  |  |  |    and it will initialize the state on first call.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Returns ``0`` on success, ``-1`` on failure to create/open the perf map file,
 | 
					
						
							|  |  |  |    or ``-2`` on failure to create a lock. Check ``errno`` for more information
 | 
					
						
							|  |  |  |    about the cause of a failure.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:function:: int PyUnstable_WritePerfMapEntry(const void *code_addr, unsigned int code_size, const char *entry_name)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Write one single entry to the ``/tmp/perf-$pid.map`` file. This function is
 | 
					
						
							|  |  |  |    thread safe. Here is what an example entry looks like::
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       # address      size  name
 | 
					
						
							|  |  |  |       7f3529fcf759 b     py::bar:/run/t.py
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Will call :c:func:`PyUnstable_PerfMapState_Init` before writing the entry, if
 | 
					
						
							|  |  |  |    the perf map file is not already opened. Returns ``0`` on success, or the
 | 
					
						
							|  |  |  |    same error codes as :c:func:`PyUnstable_PerfMapState_Init` on failure.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | .. c:function:: void PyUnstable_PerfMapState_Fini(void)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |    Close the perf map file opened by :c:func:`PyUnstable_PerfMapState_Init`.
 | 
					
						
							|  |  |  |    This is called by the runtime itself during interpreter shut-down. In
 | 
					
						
							|  |  |  |    general, there shouldn't be a reason to explicitly call this, except to
 | 
					
						
							|  |  |  |    handle specific scenarios such as forking.
 |