summaryrefslogtreecommitdiff
path: root/sys/src/cmd/python/Doc/api/init.tex
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-05-03 11:25:13 +0000
committercinap_lenrek <cinap_lenrek@localhost>2011-05-03 11:25:13 +0000
commit458120dd40db6b4df55a4e96b650e16798ef06a0 (patch)
tree8f82685be24fef97e715c6f5ca4c68d34d5074ee /sys/src/cmd/python/Doc/api/init.tex
parent3a742c699f6806c1145aea5149bf15de15a0afd7 (diff)
add hg and python
Diffstat (limited to 'sys/src/cmd/python/Doc/api/init.tex')
-rw-r--r--sys/src/cmd/python/Doc/api/init.tex884
1 files changed, 884 insertions, 0 deletions
diff --git a/sys/src/cmd/python/Doc/api/init.tex b/sys/src/cmd/python/Doc/api/init.tex
new file mode 100644
index 000000000..e380bdb25
--- /dev/null
+++ b/sys/src/cmd/python/Doc/api/init.tex
@@ -0,0 +1,884 @@
+\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}