diff options
Diffstat (limited to 'Doc/api/init.tex')
| -rw-r--r-- | Doc/api/init.tex | 884 |
1 files changed, 0 insertions, 884 deletions
diff --git a/Doc/api/init.tex b/Doc/api/init.tex deleted file mode 100644 index 76fcf61430..0000000000 --- a/Doc/api/init.tex +++ /dev/null @@ -1,884 +0,0 @@ -\chapter{Initialization, Finalization, and Threads - \label{initialization}} - -\begin{cfuncdesc}{void}{Py_Initialize}{} - Initialize the Python interpreter. In an application embedding - Python, this should be called before using any other Python/C API - functions; with the exception of - \cfunction{Py_SetProgramName()}\ttindex{Py_SetProgramName()}, - \cfunction{PyEval_InitThreads()}\ttindex{PyEval_InitThreads()}, - \cfunction{PyEval_ReleaseLock()}\ttindex{PyEval_ReleaseLock()}, - and \cfunction{PyEval_AcquireLock()}\ttindex{PyEval_AcquireLock()}. - This initializes the table of loaded modules (\code{sys.modules}), - and\withsubitem{(in module sys)}{\ttindex{modules}\ttindex{path}} - creates the fundamental modules - \module{__builtin__}\refbimodindex{__builtin__}, - \module{__main__}\refbimodindex{__main__} and - \module{sys}\refbimodindex{sys}. It also initializes the module - search\indexiii{module}{search}{path} path (\code{sys.path}). - It does not set \code{sys.argv}; use - \cfunction{PySys_SetArgv()}\ttindex{PySys_SetArgv()} for that. This - is a no-op when called for a second time (without calling - \cfunction{Py_Finalize()}\ttindex{Py_Finalize()} first). There is - no return value; it is a fatal error if the initialization fails. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{Py_InitializeEx}{int initsigs} - This function works like \cfunction{Py_Initialize()} if - \var{initsigs} is 1. If \var{initsigs} is 0, it skips - initialization registration of signal handlers, which - might be useful when Python is embedded. \versionadded{2.4} -\end{cfuncdesc} - -\begin{cfuncdesc}{int}{Py_IsInitialized}{} - Return true (nonzero) when the Python interpreter has been - initialized, false (zero) if not. After \cfunction{Py_Finalize()} - is called, this returns false until \cfunction{Py_Initialize()} is - called again. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{Py_Finalize}{} - Undo all initializations made by \cfunction{Py_Initialize()} and - subsequent use of Python/C API functions, and destroy all - sub-interpreters (see \cfunction{Py_NewInterpreter()} below) that - were created and not yet destroyed since the last call to - \cfunction{Py_Initialize()}. Ideally, this frees all memory - allocated by the Python interpreter. This is a no-op when called - for a second time (without calling \cfunction{Py_Initialize()} again - first). There is no return value; errors during finalization are - ignored. - - This function is provided for a number of reasons. An embedding - application might want to restart Python without having to restart - the application itself. An application that has loaded the Python - interpreter from a dynamically loadable library (or DLL) might want - to free all memory allocated by Python before unloading the - DLL. During a hunt for memory leaks in an application a developer - might want to free all memory allocated by Python before exiting - from the application. - - \strong{Bugs and caveats:} The destruction of modules and objects in - modules is done in random order; this may cause destructors - (\method{__del__()} methods) to fail when they depend on other - objects (even functions) or modules. Dynamically loaded extension - modules loaded by Python are not unloaded. Small amounts of memory - allocated by the Python interpreter may not be freed (if you find a - leak, please report it). Memory tied up in circular references - between objects is not freed. Some memory allocated by extension - modules may not be freed. Some extensions may not work properly if - their initialization routine is called more than once; this can - happen if an application calls \cfunction{Py_Initialize()} and - \cfunction{Py_Finalize()} more than once. -\end{cfuncdesc} - -\begin{cfuncdesc}{PyThreadState*}{Py_NewInterpreter}{} - Create a new sub-interpreter. This is an (almost) totally separate - environment for the execution of Python code. In particular, the - new interpreter has separate, independent versions of all imported - modules, including the fundamental modules - \module{__builtin__}\refbimodindex{__builtin__}, - \module{__main__}\refbimodindex{__main__} and - \module{sys}\refbimodindex{sys}. The table of loaded modules - (\code{sys.modules}) and the module search path (\code{sys.path}) - are also separate. The new environment has no \code{sys.argv} - variable. It has new standard I/O stream file objects - \code{sys.stdin}, \code{sys.stdout} and \code{sys.stderr} (however - these refer to the same underlying \ctype{FILE} structures in the C - library). - \withsubitem{(in module sys)}{ - \ttindex{stdout}\ttindex{stderr}\ttindex{stdin}} - - The return value points to the first thread state created in the new - sub-interpreter. This thread state is made in the current thread - state. Note that no actual thread is created; see the discussion of - thread states below. If creation of the new interpreter is - unsuccessful, \NULL{} is returned; no exception is set since the - exception state is stored in the current thread state and there may - not be a current thread state. (Like all other Python/C API - functions, the global interpreter lock must be held before calling - this function and is still held when it returns; however, unlike - most other Python/C API functions, there needn't be a current thread - state on entry.) - - Extension modules are shared between (sub-)interpreters as follows: - the first time a particular extension is imported, it is initialized - normally, and a (shallow) copy of its module's dictionary is - squirreled away. When the same extension is imported by another - (sub-)interpreter, a new module is initialized and filled with the - contents of this copy; the extension's \code{init} function is not - called. Note that this is different from what happens when an - extension is imported after the interpreter has been completely - re-initialized by calling - \cfunction{Py_Finalize()}\ttindex{Py_Finalize()} and - \cfunction{Py_Initialize()}\ttindex{Py_Initialize()}; in that case, - the extension's \code{init\var{module}} function \emph{is} called - again. - - \strong{Bugs and caveats:} Because sub-interpreters (and the main - interpreter) are part of the same process, the insulation between - them isn't perfect --- for example, using low-level file operations - like \withsubitem{(in module os)}{\ttindex{close()}} - \function{os.close()} they can (accidentally or maliciously) affect - each other's open files. Because of the way extensions are shared - between (sub-)interpreters, some extensions may not work properly; - this is especially likely when the extension makes use of (static) - global variables, or when the extension manipulates its module's - dictionary after its initialization. It is possible to insert - objects created in one sub-interpreter into a namespace of another - sub-interpreter; this should be done with great care to avoid - sharing user-defined functions, methods, instances or classes - between sub-interpreters, since import operations executed by such - objects may affect the wrong (sub-)interpreter's dictionary of - loaded modules. (XXX This is a hard-to-fix bug that will be - addressed in a future release.) - - Also note that the use of this functionality is incompatible with - extension modules such as PyObjC and ctypes that use the - \cfunction{PyGILState_*} APIs (and this is inherent in the way the - \cfunction{PyGILState_*} functions work). Simple things may work, - but confusing behavior will always be near. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{Py_EndInterpreter}{PyThreadState *tstate} - Destroy the (sub-)interpreter represented by the given thread state. - The given thread state must be the current thread state. See the - discussion of thread states below. When the call returns, the - current thread state is \NULL. All thread states associated with - this interpreter are destroyed. (The global interpreter lock must - be held before calling this function and is still held when it - returns.) \cfunction{Py_Finalize()}\ttindex{Py_Finalize()} will - destroy all sub-interpreters that haven't been explicitly destroyed - at that point. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{Py_SetProgramName}{char *name} - This function should be called before - \cfunction{Py_Initialize()}\ttindex{Py_Initialize()} is called - for the first time, if it is called at all. It tells the - interpreter the value of the \code{argv[0]} argument to the - \cfunction{main()}\ttindex{main()} function of the program. This is - used by \cfunction{Py_GetPath()}\ttindex{Py_GetPath()} and some - other functions below to find the Python run-time libraries relative - to the interpreter executable. The default value is - \code{'python'}. The argument should point to a zero-terminated - character string in static storage whose contents will not change - for the duration of the program's execution. No code in the Python - interpreter will change the contents of this storage. -\end{cfuncdesc} - -\begin{cfuncdesc}{char*}{Py_GetProgramName}{} - Return the program name set with - \cfunction{Py_SetProgramName()}\ttindex{Py_SetProgramName()}, or the - default. The returned string points into static storage; the caller - should not modify its value. -\end{cfuncdesc} - -\begin{cfuncdesc}{char*}{Py_GetPrefix}{} - Return the \emph{prefix} for installed platform-independent files. - This is derived through a number of complicated rules from the - program name set with \cfunction{Py_SetProgramName()} and some - environment variables; for example, if the program name is - \code{'/usr/local/bin/python'}, the prefix is \code{'/usr/local'}. - The returned string points into static storage; the caller should - not modify its value. This corresponds to the \makevar{prefix} - variable in the top-level \file{Makefile} and the - \longprogramopt{prefix} argument to the \program{configure} script - at build time. The value is available to Python code as - \code{sys.prefix}. It is only useful on \UNIX{}. See also the next - function. -\end{cfuncdesc} - -\begin{cfuncdesc}{char*}{Py_GetExecPrefix}{} - Return the \emph{exec-prefix} for installed - platform-\emph{de}pendent files. This is derived through a number - of complicated rules from the program name set with - \cfunction{Py_SetProgramName()} and some environment variables; for - example, if the program name is \code{'/usr/local/bin/python'}, the - exec-prefix is \code{'/usr/local'}. The returned string points into - static storage; the caller should not modify its value. This - corresponds to the \makevar{exec_prefix} variable in the top-level - \file{Makefile} and the \longprogramopt{exec-prefix} argument to the - \program{configure} script at build time. The value is available - to Python code as \code{sys.exec_prefix}. It is only useful on - \UNIX. - - Background: The exec-prefix differs from the prefix when platform - dependent files (such as executables and shared libraries) are - installed in a different directory tree. In a typical installation, - platform dependent files may be installed in the - \file{/usr/local/plat} subtree while platform independent may be - installed in \file{/usr/local}. - - Generally speaking, a platform is a combination of hardware and - software families, e.g. Sparc machines running the Solaris 2.x - operating system are considered the same platform, but Intel - machines running Solaris 2.x are another platform, and Intel - machines running Linux are yet another platform. Different major - revisions of the same operating system generally also form different - platforms. Non-\UNIX{} operating systems are a different story; the - installation strategies on those systems are so different that the - prefix and exec-prefix are meaningless, and set to the empty string. - Note that compiled Python bytecode files are platform independent - (but not independent from the Python version by which they were - compiled!). - - System administrators will know how to configure the \program{mount} - or \program{automount} programs to share \file{/usr/local} between - platforms while having \file{/usr/local/plat} be a different - filesystem for each platform. -\end{cfuncdesc} - -\begin{cfuncdesc}{char*}{Py_GetProgramFullPath}{} - Return the full program name of the Python executable; this is - computed as a side-effect of deriving the default module search path - from the program name (set by - \cfunction{Py_SetProgramName()}\ttindex{Py_SetProgramName()} above). - The returned string points into static storage; the caller should - not modify its value. The value is available to Python code as - \code{sys.executable}. - \withsubitem{(in module sys)}{\ttindex{executable}} -\end{cfuncdesc} - -\begin{cfuncdesc}{char*}{Py_GetPath}{} - \indexiii{module}{search}{path} - Return the default module search path; this is computed from the - program name (set by \cfunction{Py_SetProgramName()} above) and some - environment variables. The returned string consists of a series of - directory names separated by a platform dependent delimiter - character. The delimiter character is \character{:} on \UNIX{} and Mac OS X, - \character{;} on Windows. The returned string points into - static storage; the caller should not modify its value. The value - is available to Python code as the list - \code{sys.path}\withsubitem{(in module sys)}{\ttindex{path}}, which - may be modified to change the future search path for loaded - modules. - - % XXX should give the exact rules -\end{cfuncdesc} - -\begin{cfuncdesc}{const char*}{Py_GetVersion}{} - Return the version of this Python interpreter. This is a string - that looks something like - -\begin{verbatim} -"1.5 (#67, Dec 31 1997, 22:34:28) [GCC 2.7.2.2]" -\end{verbatim} - - The first word (up to the first space character) is the current - Python version; the first three characters are the major and minor - version separated by a period. The returned string points into - static storage; the caller should not modify its value. The value - is available to Python code as \code{sys.version}. - \withsubitem{(in module sys)}{\ttindex{version}} -\end{cfuncdesc} - -\begin{cfuncdesc}{const char*}{Py_GetBuildNumber}{} - Return a string representing the Subversion revision that this Python - executable was built from. This number is a string because it may contain a - trailing 'M' if Python was built from a mixed revision source tree. - \versionadded{2.5} -\end{cfuncdesc} - -\begin{cfuncdesc}{const char*}{Py_GetPlatform}{} - Return the platform identifier for the current platform. On \UNIX, - this is formed from the ``official'' name of the operating system, - converted to lower case, followed by the major revision number; - e.g., for Solaris 2.x, which is also known as SunOS 5.x, the value - is \code{'sunos5'}. On Mac OS X, it is \code{'darwin'}. On Windows, - it is \code{'win'}. The returned string points into static storage; - the caller should not modify its value. The value is available to - Python code as \code{sys.platform}. - \withsubitem{(in module sys)}{\ttindex{platform}} -\end{cfuncdesc} - -\begin{cfuncdesc}{const char*}{Py_GetCopyright}{} - Return the official copyright string for the current Python version, - for example - - \code{'Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam'} - - The returned string points into static storage; the caller should - not modify its value. The value is available to Python code as - \code{sys.copyright}. - \withsubitem{(in module sys)}{\ttindex{copyright}} -\end{cfuncdesc} - -\begin{cfuncdesc}{const char*}{Py_GetCompiler}{} - Return an indication of the compiler used to build the current - Python version, in square brackets, for example: - -\begin{verbatim} -"[GCC 2.7.2.2]" -\end{verbatim} - - The returned string points into static storage; the caller should - not modify its value. The value is available to Python code as part - of the variable \code{sys.version}. - \withsubitem{(in module sys)}{\ttindex{version}} -\end{cfuncdesc} - -\begin{cfuncdesc}{const char*}{Py_GetBuildInfo}{} - Return information about the sequence number and build date and time - of the current Python interpreter instance, for example - -\begin{verbatim} -"#67, Aug 1 1997, 22:34:28" -\end{verbatim} - - The returned string points into static storage; the caller should - not modify its value. The value is available to Python code as part - of the variable \code{sys.version}. - \withsubitem{(in module sys)}{\ttindex{version}} -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PySys_SetArgv}{int argc, char **argv} - Set \code{sys.argv} based on \var{argc} and \var{argv}. These - parameters are similar to those passed to the program's - \cfunction{main()}\ttindex{main()} function with the difference that - the first entry should refer to the script file to be executed - rather than the executable hosting the Python interpreter. If there - isn't a script that will be run, the first entry in \var{argv} can - be an empty string. If this function fails to initialize - \code{sys.argv}, a fatal condition is signalled using - \cfunction{Py_FatalError()}\ttindex{Py_FatalError()}. - \withsubitem{(in module sys)}{\ttindex{argv}} - % XXX impl. doesn't seem consistent in allowing 0/NULL for the params; - % check w/ Guido. -\end{cfuncdesc} - -% XXX Other PySys thingies (doesn't really belong in this chapter) - -\section{Thread State and the Global Interpreter Lock - \label{threads}} - -\index{global interpreter lock} -\index{interpreter lock} -\index{lock, interpreter} - -The Python interpreter is not fully thread safe. In order to support -multi-threaded Python programs, there's a global lock that must be -held by the current thread before it can safely access Python objects. -Without the lock, even the simplest operations could cause problems in -a multi-threaded program: for example, when two threads simultaneously -increment the reference count of the same object, the reference count -could end up being incremented only once instead of twice. - -Therefore, the rule exists that only the thread that has acquired the -global interpreter lock may operate on Python objects or call Python/C -API functions. In order to support multi-threaded Python programs, -the interpreter regularly releases and reacquires the lock --- by -default, every 100 bytecode instructions (this can be changed with -\withsubitem{(in module sys)}{\ttindex{setcheckinterval()}} -\function{sys.setcheckinterval()}). The lock is also released and -reacquired around potentially blocking I/O operations like reading or -writing a file, so that other threads can run while the thread that -requests the I/O is waiting for the I/O operation to complete. - -The Python interpreter needs to keep some bookkeeping information -separate per thread --- for this it uses a data structure called -\ctype{PyThreadState}\ttindex{PyThreadState}. There's one global -variable, however: the pointer to the current -\ctype{PyThreadState}\ttindex{PyThreadState} structure. While most -thread packages have a way to store ``per-thread global data,'' -Python's internal platform independent thread abstraction doesn't -support this yet. Therefore, the current thread state must be -manipulated explicitly. - -This is easy enough in most cases. Most code manipulating the global -interpreter lock has the following simple structure: - -\begin{verbatim} -Save the thread state in a local variable. -Release the interpreter lock. -...Do some blocking I/O operation... -Reacquire the interpreter lock. -Restore the thread state from the local variable. -\end{verbatim} - -This is so common that a pair of macros exists to simplify it: - -\begin{verbatim} -Py_BEGIN_ALLOW_THREADS -...Do some blocking I/O operation... -Py_END_ALLOW_THREADS -\end{verbatim} - -The -\csimplemacro{Py_BEGIN_ALLOW_THREADS}\ttindex{Py_BEGIN_ALLOW_THREADS} -macro opens a new block and declares a hidden local variable; the -\csimplemacro{Py_END_ALLOW_THREADS}\ttindex{Py_END_ALLOW_THREADS} -macro closes the block. Another advantage of using these two macros -is that when Python is compiled without thread support, they are -defined empty, thus saving the thread state and lock manipulations. - -When thread support is enabled, the block above expands to the -following code: - -\begin{verbatim} - PyThreadState *_save; - - _save = PyEval_SaveThread(); - ...Do some blocking I/O operation... - PyEval_RestoreThread(_save); -\end{verbatim} - -Using even lower level primitives, we can get roughly the same effect -as follows: - -\begin{verbatim} - PyThreadState *_save; - - _save = PyThreadState_Swap(NULL); - PyEval_ReleaseLock(); - ...Do some blocking I/O operation... - PyEval_AcquireLock(); - PyThreadState_Swap(_save); -\end{verbatim} - -There are some subtle differences; in particular, -\cfunction{PyEval_RestoreThread()}\ttindex{PyEval_RestoreThread()} saves -and restores the value of the global variable -\cdata{errno}\ttindex{errno}, since the lock manipulation does not -guarantee that \cdata{errno} is left alone. Also, when thread support -is disabled, -\cfunction{PyEval_SaveThread()}\ttindex{PyEval_SaveThread()} and -\cfunction{PyEval_RestoreThread()} don't manipulate the lock; in this -case, \cfunction{PyEval_ReleaseLock()}\ttindex{PyEval_ReleaseLock()} and -\cfunction{PyEval_AcquireLock()}\ttindex{PyEval_AcquireLock()} are not -available. This is done so that dynamically loaded extensions -compiled with thread support enabled can be loaded by an interpreter -that was compiled with disabled thread support. - -The global interpreter lock is used to protect the pointer to the -current thread state. When releasing the lock and saving the thread -state, the current thread state pointer must be retrieved before the -lock is released (since another thread could immediately acquire the -lock and store its own thread state in the global variable). -Conversely, when acquiring the lock and restoring the thread state, -the lock must be acquired before storing the thread state pointer. - -Why am I going on with so much detail about this? Because when -threads are created from C, they don't have the global interpreter -lock, nor is there a thread state data structure for them. Such -threads must bootstrap themselves into existence, by first creating a -thread state data structure, then acquiring the lock, and finally -storing their thread state pointer, before they can start using the -Python/C API. When they are done, they should reset the thread state -pointer, release the lock, and finally free their thread state data -structure. - -Beginning with version 2.3, threads can now take advantage of the -\cfunction{PyGILState_*()} functions to do all of the above -automatically. The typical idiom for calling into Python from a C -thread is now: - -\begin{verbatim} - PyGILState_STATE gstate; - gstate = PyGILState_Ensure(); - - /* Perform Python actions here. */ - result = CallSomeFunction(); - /* evaluate result */ - - /* Release the thread. No Python API allowed beyond this point. */ - PyGILState_Release(gstate); -\end{verbatim} - -Note that the \cfunction{PyGILState_*()} functions assume there is -only one global interpreter (created automatically by -\cfunction{Py_Initialize()}). Python still supports the creation of -additional interpreters (using \cfunction{Py_NewInterpreter()}), but -mixing multiple interpreters and the \cfunction{PyGILState_*()} API is -unsupported. - -\begin{ctypedesc}{PyInterpreterState} - This data structure represents the state shared by a number of - cooperating threads. Threads belonging to the same interpreter - share their module administration and a few other internal items. - There are no public members in this structure. - - Threads belonging to different interpreters initially share nothing, - except process state like available memory, open file descriptors - and such. The global interpreter lock is also shared by all - threads, regardless of to which interpreter they belong. -\end{ctypedesc} - -\begin{ctypedesc}{PyThreadState} - This data structure represents the state of a single thread. The - only public data member is \ctype{PyInterpreterState - *}\member{interp}, which points to this thread's interpreter state. -\end{ctypedesc} - -\begin{cfuncdesc}{void}{PyEval_InitThreads}{} - Initialize and acquire the global interpreter lock. It should be - called in the main thread before creating a second thread or - engaging in any other thread operations such as - \cfunction{PyEval_ReleaseLock()}\ttindex{PyEval_ReleaseLock()} or - \code{PyEval_ReleaseThread(\var{tstate})}\ttindex{PyEval_ReleaseThread()}. - It is not needed before calling - \cfunction{PyEval_SaveThread()}\ttindex{PyEval_SaveThread()} or - \cfunction{PyEval_RestoreThread()}\ttindex{PyEval_RestoreThread()}. - - This is a no-op when called for a second time. It is safe to call - this function before calling - \cfunction{Py_Initialize()}\ttindex{Py_Initialize()}. - - When only the main thread exists, no lock operations are needed. - This is a common situation (most Python programs do not use - threads), and the lock operations slow the interpreter down a bit. - Therefore, the lock is not created initially. This situation is - equivalent to having acquired the lock: when there is only a single - thread, all object accesses are safe. Therefore, when this function - initializes the lock, it also acquires it. Before the Python - \module{thread}\refbimodindex{thread} module creates a new thread, - knowing that either it has the lock or the lock hasn't been created - yet, it calls \cfunction{PyEval_InitThreads()}. When this call - returns, it is guaranteed that the lock has been created and that the - calling thread has acquired it. - - It is \strong{not} safe to call this function when it is unknown - which thread (if any) currently has the global interpreter lock. - - This function is not available when thread support is disabled at - compile time. -\end{cfuncdesc} - -\begin{cfuncdesc}{int}{PyEval_ThreadsInitialized}{} - Returns a non-zero value if \cfunction{PyEval_InitThreads()} has been - called. This function can be called without holding the lock, and - therefore can be used to avoid calls to the locking API when running - single-threaded. This function is not available when thread support - is disabled at compile time. \versionadded{2.4} -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PyEval_AcquireLock}{} - Acquire the global interpreter lock. The lock must have been - created earlier. If this thread already has the lock, a deadlock - ensues. This function is not available when thread support is - disabled at compile time. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PyEval_ReleaseLock}{} - Release the global interpreter lock. The lock must have been - created earlier. This function is not available when thread support - is disabled at compile time. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PyEval_AcquireThread}{PyThreadState *tstate} - Acquire the global interpreter lock and set the current thread - state to \var{tstate}, which should not be \NULL. The lock must - have been created earlier. If this thread already has the lock, - deadlock ensues. This function is not available when thread support - is disabled at compile time. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PyEval_ReleaseThread}{PyThreadState *tstate} - Reset the current thread state to \NULL{} and release the global - interpreter lock. The lock must have been created earlier and must - be held by the current thread. The \var{tstate} argument, which - must not be \NULL, is only used to check that it represents the - current thread state --- if it isn't, a fatal error is reported. - This function is not available when thread support is disabled at - compile time. -\end{cfuncdesc} - -\begin{cfuncdesc}{PyThreadState*}{PyEval_SaveThread}{} - Release the interpreter lock (if it has been created and thread - support is enabled) and reset the thread state to \NULL, returning - the previous thread state (which is not \NULL). If the lock has - been created, the current thread must have acquired it. (This - function is available even when thread support is disabled at - compile time.) -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PyEval_RestoreThread}{PyThreadState *tstate} - Acquire the interpreter lock (if it has been created and thread - support is enabled) and set the thread state to \var{tstate}, which - must not be \NULL. If the lock has been created, the current thread - must not have acquired it, otherwise deadlock ensues. (This - function is available even when thread support is disabled at - compile time.) -\end{cfuncdesc} - -The following macros are normally used without a trailing semicolon; -look for example usage in the Python source distribution. - -\begin{csimplemacrodesc}{Py_BEGIN_ALLOW_THREADS} - This macro expands to - \samp{\{ PyThreadState *_save; _save = PyEval_SaveThread();}. - Note that it contains an opening brace; it must be matched with a - following \csimplemacro{Py_END_ALLOW_THREADS} macro. See above for - further discussion of this macro. It is a no-op when thread support - is disabled at compile time. -\end{csimplemacrodesc} - -\begin{csimplemacrodesc}{Py_END_ALLOW_THREADS} - This macro expands to \samp{PyEval_RestoreThread(_save); \}}. - Note that it contains a closing brace; it must be matched with an - earlier \csimplemacro{Py_BEGIN_ALLOW_THREADS} macro. See above for - further discussion of this macro. It is a no-op when thread support - is disabled at compile time. -\end{csimplemacrodesc} - -\begin{csimplemacrodesc}{Py_BLOCK_THREADS} - This macro expands to \samp{PyEval_RestoreThread(_save);}: it is - equivalent to \csimplemacro{Py_END_ALLOW_THREADS} without the - closing brace. It is a no-op when thread support is disabled at - compile time. -\end{csimplemacrodesc} - -\begin{csimplemacrodesc}{Py_UNBLOCK_THREADS} - This macro expands to \samp{_save = PyEval_SaveThread();}: it is - equivalent to \csimplemacro{Py_BEGIN_ALLOW_THREADS} without the - opening brace and variable declaration. It is a no-op when thread - support is disabled at compile time. -\end{csimplemacrodesc} - -All of the following functions are only available when thread support -is enabled at compile time, and must be called only when the -interpreter lock has been created. - -\begin{cfuncdesc}{PyInterpreterState*}{PyInterpreterState_New}{} - Create a new interpreter state object. The interpreter lock need - not be held, but may be held if it is necessary to serialize calls - to this function. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PyInterpreterState_Clear}{PyInterpreterState *interp} - Reset all information in an interpreter state object. The - interpreter lock must be held. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PyInterpreterState_Delete}{PyInterpreterState *interp} - Destroy an interpreter state object. The interpreter lock need not - be held. The interpreter state must have been reset with a previous - call to \cfunction{PyInterpreterState_Clear()}. -\end{cfuncdesc} - -\begin{cfuncdesc}{PyThreadState*}{PyThreadState_New}{PyInterpreterState *interp} - Create a new thread state object belonging to the given interpreter - object. The interpreter lock need not be held, but may be held if - it is necessary to serialize calls to this function. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PyThreadState_Clear}{PyThreadState *tstate} - Reset all information in a thread state object. The interpreter lock - must be held. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PyThreadState_Delete}{PyThreadState *tstate} - Destroy a thread state object. The interpreter lock need not be - held. The thread state must have been reset with a previous call to - \cfunction{PyThreadState_Clear()}. -\end{cfuncdesc} - -\begin{cfuncdesc}{PyThreadState*}{PyThreadState_Get}{} - Return the current thread state. The interpreter lock must be - held. When the current thread state is \NULL, this issues a fatal - error (so that the caller needn't check for \NULL). -\end{cfuncdesc} - -\begin{cfuncdesc}{PyThreadState*}{PyThreadState_Swap}{PyThreadState *tstate} - Swap the current thread state with the thread state given by the - argument \var{tstate}, which may be \NULL. The interpreter lock - must be held. -\end{cfuncdesc} - -\begin{cfuncdesc}{PyObject*}{PyThreadState_GetDict}{} - Return a dictionary in which extensions can store thread-specific - state information. Each extension should use a unique key to use to - store state in the dictionary. It is okay to call this function - when no current thread state is available. - If this function returns \NULL, no exception has been raised and the - caller should assume no current thread state is available. - \versionchanged[Previously this could only be called when a current - thread is active, and \NULL{} meant that an exception was raised]{2.3} -\end{cfuncdesc} - -\begin{cfuncdesc}{int}{PyThreadState_SetAsyncExc}{long id, PyObject *exc} - Asynchronously raise an exception in a thread. - The \var{id} argument is the thread id of the target thread; - \var{exc} is the exception object to be raised. - This function does not steal any references to \var{exc}. - To prevent naive misuse, you must write your own C extension - to call this. Must be called with the GIL held. - Returns the number of thread states modified; this is normally one, but - will be zero if the thread id isn't found. If \var{exc} is - \constant{NULL}, the pending exception (if any) for the thread is cleared. - This raises no exceptions. - \versionadded{2.3} -\end{cfuncdesc} - -\begin{cfuncdesc}{PyGILState_STATE}{PyGILState_Ensure}{} -Ensure that the current thread is ready to call the Python C API -regardless of the current state of Python, or of its thread lock. -This may be called as many times as desired by a thread as long as -each call is matched with a call to \cfunction{PyGILState_Release()}. -In general, other thread-related APIs may be used between -\cfunction{PyGILState_Ensure()} and \cfunction{PyGILState_Release()} -calls as long as the thread state is restored to its previous state -before the Release(). For example, normal usage of the -\csimplemacro{Py_BEGIN_ALLOW_THREADS} and -\csimplemacro{Py_END_ALLOW_THREADS} macros is acceptable. - -The return value is an opaque "handle" to the thread state when -\cfunction{PyGILState_Acquire()} was called, and must be passed to -\cfunction{PyGILState_Release()} to ensure Python is left in the same -state. Even though recursive calls are allowed, these handles -\emph{cannot} be shared - each unique call to -\cfunction{PyGILState_Ensure} must save the handle for its call to -\cfunction{PyGILState_Release}. - -When the function returns, the current thread will hold the GIL. -Failure is a fatal error. - \versionadded{2.3} -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PyGILState_Release}{PyGILState_STATE} -Release any resources previously acquired. After this call, Python's -state will be the same as it was prior to the corresponding -\cfunction{PyGILState_Ensure} call (but generally this state will be -unknown to the caller, hence the use of the GILState API.) - -Every call to \cfunction{PyGILState_Ensure()} must be matched by a call to -\cfunction{PyGILState_Release()} on the same thread. - \versionadded{2.3} -\end{cfuncdesc} - - -\section{Profiling and Tracing \label{profiling}} - -\sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org} - -The Python interpreter provides some low-level support for attaching -profiling and execution tracing facilities. These are used for -profiling, debugging, and coverage analysis tools. - -Starting with Python 2.2, the implementation of this facility was -substantially revised, and an interface from C was added. This C -interface allows the profiling or tracing code to avoid the overhead -of calling through Python-level callable objects, making a direct C -function call instead. The essential attributes of the facility have -not changed; the interface allows trace functions to be installed -per-thread, and the basic events reported to the trace function are -the same as had been reported to the Python-level trace functions in -previous versions. - -\begin{ctypedesc}[Py_tracefunc]{int (*Py_tracefunc)(PyObject *obj, - PyFrameObject *frame, int what, - PyObject *arg)} - The type of the trace function registered using - \cfunction{PyEval_SetProfile()} and \cfunction{PyEval_SetTrace()}. - The first parameter is the object passed to the registration - function as \var{obj}, \var{frame} is the frame object to which the - event pertains, \var{what} is one of the constants - \constant{PyTrace_CALL}, \constant{PyTrace_EXCEPTION}, - \constant{PyTrace_LINE}, \constant{PyTrace_RETURN}, - \constant{PyTrace_C_CALL}, \constant{PyTrace_C_EXCEPTION}, - or \constant{PyTrace_C_RETURN}, and \var{arg} - depends on the value of \var{what}: - - \begin{tableii}{l|l}{constant}{Value of \var{what}}{Meaning of \var{arg}} - \lineii{PyTrace_CALL}{Always \NULL.} - \lineii{PyTrace_EXCEPTION}{Exception information as returned by - \function{sys.exc_info()}.} - \lineii{PyTrace_LINE}{Always \NULL.} - \lineii{PyTrace_RETURN}{Value being returned to the caller.} - \lineii{PyTrace_C_CALL}{Name of function being called.} - \lineii{PyTrace_C_EXCEPTION}{Always \NULL.} - \lineii{PyTrace_C_RETURN}{Always \NULL.} - \end{tableii} -\end{ctypedesc} - -\begin{cvardesc}{int}{PyTrace_CALL} - The value of the \var{what} parameter to a \ctype{Py_tracefunc} - function when a new call to a function or method is being reported, - or a new entry into a generator. Note that the creation of the - iterator for a generator function is not reported as there is no - control transfer to the Python bytecode in the corresponding frame. -\end{cvardesc} - -\begin{cvardesc}{int}{PyTrace_EXCEPTION} - The value of the \var{what} parameter to a \ctype{Py_tracefunc} - function when an exception has been raised. The callback function - is called with this value for \var{what} when after any bytecode is - processed after which the exception becomes set within the frame - being executed. The effect of this is that as exception propagation - causes the Python stack to unwind, the callback is called upon - return to each frame as the exception propagates. Only trace - functions receives these events; they are not needed by the - profiler. -\end{cvardesc} - -\begin{cvardesc}{int}{PyTrace_LINE} - The value passed as the \var{what} parameter to a trace function - (but not a profiling function) when a line-number event is being - reported. -\end{cvardesc} - -\begin{cvardesc}{int}{PyTrace_RETURN} - The value for the \var{what} parameter to \ctype{Py_tracefunc} - functions when a call is returning without propagating an exception. -\end{cvardesc} - -\begin{cvardesc}{int}{PyTrace_C_CALL} - The value for the \var{what} parameter to \ctype{Py_tracefunc} - functions when a C function is about to be called. -\end{cvardesc} - -\begin{cvardesc}{int}{PyTrace_C_EXCEPTION} - The value for the \var{what} parameter to \ctype{Py_tracefunc} - functions when a C function has thrown an exception. -\end{cvardesc} - -\begin{cvardesc}{int}{PyTrace_C_RETURN} - The value for the \var{what} parameter to \ctype{Py_tracefunc} - functions when a C function has returned. -\end{cvardesc} - -\begin{cfuncdesc}{void}{PyEval_SetProfile}{Py_tracefunc func, PyObject *obj} - Set the profiler function to \var{func}. The \var{obj} parameter is - passed to the function as its first parameter, and may be any Python - object, or \NULL. If the profile function needs to maintain state, - using a different value for \var{obj} for each thread provides a - convenient and thread-safe place to store it. The profile function - is called for all monitored events except the line-number events. -\end{cfuncdesc} - -\begin{cfuncdesc}{void}{PyEval_SetTrace}{Py_tracefunc func, PyObject *obj} - Set the tracing function to \var{func}. This is similar to - \cfunction{PyEval_SetProfile()}, except the tracing function does - receive line-number events. -\end{cfuncdesc} - - -\section{Advanced Debugger Support \label{advanced-debugging}} -\sectionauthor{Fred L. Drake, Jr.}{fdrake@acm.org} - -These functions are only intended to be used by advanced debugging -tools. - -\begin{cfuncdesc}{PyInterpreterState*}{PyInterpreterState_Head}{} - Return the interpreter state object at the head of the list of all - such objects. - \versionadded{2.2} -\end{cfuncdesc} - -\begin{cfuncdesc}{PyInterpreterState*}{PyInterpreterState_Next}{PyInterpreterState *interp} - Return the next interpreter state object after \var{interp} from the - list of all such objects. - \versionadded{2.2} -\end{cfuncdesc} - -\begin{cfuncdesc}{PyThreadState *}{PyInterpreterState_ThreadHead}{PyInterpreterState *interp} - Return the a pointer to the first \ctype{PyThreadState} object in - the list of threads associated with the interpreter \var{interp}. - \versionadded{2.2} -\end{cfuncdesc} - -\begin{cfuncdesc}{PyThreadState*}{PyThreadState_Next}{PyThreadState *tstate} - Return the next thread state object after \var{tstate} from the list - of all such objects belonging to the same \ctype{PyInterpreterState} - object. - \versionadded{2.2} -\end{cfuncdesc} |
