LCOV - code coverage report
Current view: top level - Include/internal - pycore_pystate.h (source / functions) Hit Total Coverage
Test: CPython 3.12 LCOV report [commit acb105a7c1f] Lines: 26 26 100.0 %
Date: 2022-07-20 13:12:14 Functions: 10 10 100.0 %
Branches: 11 12 91.7 %

           Branch data     Line data    Source code
       1                 :            : #ifndef Py_INTERNAL_PYSTATE_H
       2                 :            : #define Py_INTERNAL_PYSTATE_H
       3                 :            : #ifdef __cplusplus
       4                 :            : extern "C" {
       5                 :            : #endif
       6                 :            : 
       7                 :            : #ifndef Py_BUILD_CORE
       8                 :            : #  error "this header requires Py_BUILD_CORE define"
       9                 :            : #endif
      10                 :            : 
      11                 :            : #include "pycore_runtime.h"   /* PyRuntimeState */
      12                 :            : 
      13                 :            : 
      14                 :            : /* Check if the current thread is the main thread.
      15                 :            :    Use _Py_IsMainInterpreter() to check if it's the main interpreter. */
      16                 :            : static inline int
      17                 :   50499043 : _Py_IsMainThread(void)
      18                 :            : {
      19                 :   50499043 :     unsigned long thread = PyThread_get_thread_ident();
      20                 :   50499042 :     return (thread == _PyRuntime.main_thread);
      21                 :            : }
      22                 :            : 
      23                 :            : 
      24                 :            : static inline PyInterpreterState *
      25                 :   49474886 : _PyInterpreterState_Main(void)
      26                 :            : {
      27                 :   49474886 :     return _PyRuntime.interpreters.main;
      28                 :            : }
      29                 :            : 
      30                 :            : static inline int
      31                 :   49334158 : _Py_IsMainInterpreter(PyInterpreterState *interp)
      32                 :            : {
      33                 :   49334158 :     return (interp == _PyInterpreterState_Main());
      34                 :            : }
      35                 :            : 
      36                 :            : 
      37                 :            : static inline const PyConfig *
      38                 :            : _Py_GetMainConfig(void)
      39                 :            : {
      40                 :            :     PyInterpreterState *interp = _PyInterpreterState_Main();
      41                 :            :     if (interp == NULL) {
      42                 :            :         return NULL;
      43                 :            :     }
      44                 :            :     return _PyInterpreterState_GetConfig(interp);
      45                 :            : }
      46                 :            : 
      47                 :            : 
      48                 :            : /* Only handle signals on the main thread of the main interpreter. */
      49                 :            : static inline int
      50                 :   50498314 : _Py_ThreadCanHandleSignals(PyInterpreterState *interp)
      51                 :            : {
      52   [ +  +  +  + ]:   50498314 :     return (_Py_IsMainThread() && _Py_IsMainInterpreter(interp));
      53                 :            : }
      54                 :            : 
      55                 :            : 
      56                 :            : /* Only execute pending calls on the main thread. */
      57                 :            : static inline int
      58                 :        729 : _Py_ThreadCanHandlePendingCalls(void)
      59                 :            : {
      60                 :        729 :     return _Py_IsMainThread();
      61                 :            : }
      62                 :            : 
      63                 :            : 
      64                 :            : /* Variable and macro for in-line access to current thread
      65                 :            :    and interpreter state */
      66                 :            : 
      67                 :            : static inline PyThreadState*
      68                 : 5373037234 : _PyRuntimeState_GetThreadState(_PyRuntimeState *runtime)
      69                 :            : {
      70                 : 5373037234 :     return (PyThreadState*)_Py_atomic_load_relaxed(&runtime->gilstate.tstate_current);
      71                 :            : }
      72                 :            : 
      73                 :            : /* Get the current Python thread state.
      74                 :            : 
      75                 :            :    Efficient macro reading directly the 'gilstate.tstate_current' atomic
      76                 :            :    variable. The macro is unsafe: it does not check for error and it can
      77                 :            :    return NULL.
      78                 :            : 
      79                 :            :    The caller must hold the GIL.
      80                 :            : 
      81                 :            :    See also PyThreadState_Get() and _PyThreadState_UncheckedGet(). */
      82                 :            : static inline PyThreadState*
      83                 : 5373034266 : _PyThreadState_GET(void)
      84                 :            : {
      85                 : 5373034266 :     return _PyRuntimeState_GetThreadState(&_PyRuntime);
      86                 :            : }
      87                 :            : 
      88                 :            : PyAPI_FUNC(void) _Py_NO_RETURN _Py_FatalError_TstateNULL(const char *func);
      89                 :            : 
      90                 :            : static inline void
      91                 :  611642066 : _Py_EnsureFuncTstateNotNULL(const char *func, PyThreadState *tstate)
      92                 :            : {
      93         [ -  + ]:  611642066 :     if (tstate == NULL) {
      94                 :            :         _Py_FatalError_TstateNULL(func);
      95                 :            :     }
      96                 :  611642066 : }
      97                 :            : 
      98                 :            : // Call Py_FatalError() if tstate is NULL
      99                 :            : #define _Py_EnsureTstateNotNULL(tstate) \
     100                 :            :     _Py_EnsureFuncTstateNotNULL(__func__, (tstate))
     101                 :            : 
     102                 :            : 
     103                 :            : /* Get the current interpreter state.
     104                 :            : 
     105                 :            :    The macro is unsafe: it does not check for error and it can return NULL.
     106                 :            : 
     107                 :            :    The caller must hold the GIL.
     108                 :            : 
     109                 :            :    See also _PyInterpreterState_Get()
     110                 :            :    and _PyGILState_GetInterpreterStateUnsafe(). */
     111                 : 2657840963 : static inline PyInterpreterState* _PyInterpreterState_GET(void) {
     112                 : 2657840963 :     PyThreadState *tstate = _PyThreadState_GET();
     113                 :            : #ifdef Py_DEBUG
     114                 :            :     _Py_EnsureTstateNotNULL(tstate);
     115                 :            : #endif
     116                 : 2657840963 :     return tstate->interp;
     117                 :            : }
     118                 :            : 
     119                 :            : 
     120                 :            : // PyThreadState functions
     121                 :            : 
     122                 :            : PyAPI_FUNC(void) _PyThreadState_SetCurrent(PyThreadState *tstate);
     123                 :            : // We keep this around exclusively for stable ABI compatibility.
     124                 :            : PyAPI_FUNC(void) _PyThreadState_Init(
     125                 :            :     PyThreadState *tstate);
     126                 :            : PyAPI_FUNC(void) _PyThreadState_DeleteExcept(
     127                 :            :     _PyRuntimeState *runtime,
     128                 :            :     PyThreadState *tstate);
     129                 :            : 
     130                 :            : 
     131                 :            : static inline void
     132                 :      22126 : _PyThreadState_UpdateTracingState(PyThreadState *tstate)
     133                 :            : {
     134                 :      44252 :     int use_tracing = (tstate->c_tracefunc != NULL
     135   [ +  +  +  + ]:      22126 :                        || tstate->c_profilefunc != NULL);
     136         [ +  + ]:      22126 :     tstate->cframe->use_tracing = (use_tracing ? 255 : 0);
     137                 :      22126 : }
     138                 :            : 
     139                 :            : 
     140                 :            : /* Other */
     141                 :            : 
     142                 :            : PyAPI_FUNC(PyThreadState *) _PyThreadState_Swap(
     143                 :            :     struct _gilstate_runtime_state *gilstate,
     144                 :            :     PyThreadState *newts);
     145                 :            : 
     146                 :            : PyAPI_FUNC(PyStatus) _PyInterpreterState_Enable(_PyRuntimeState *runtime);
     147                 :            : 
     148                 :            : #ifdef HAVE_FORK
     149                 :            : extern PyStatus _PyInterpreterState_DeleteExceptMain(_PyRuntimeState *runtime);
     150                 :            : extern PyStatus _PyGILState_Reinit(_PyRuntimeState *runtime);
     151                 :            : extern void _PySignal_AfterFork(void);
     152                 :            : #endif
     153                 :            : 
     154                 :            : 
     155                 :            : PyAPI_FUNC(int) _PyState_AddModule(
     156                 :            :     PyThreadState *tstate,
     157                 :            :     PyObject* module,
     158                 :            :     PyModuleDef* def);
     159                 :            : 
     160                 :            : 
     161                 :            : PyAPI_FUNC(int) _PyOS_InterruptOccurred(PyThreadState *tstate);
     162                 :            : 
     163                 :            : #ifdef __cplusplus
     164                 :            : }
     165                 :            : #endif
     166                 :            : #endif /* !Py_INTERNAL_PYSTATE_H */

Generated by: LCOV version 1.14