summaryrefslogtreecommitdiffstats
path: root/Doc/api/init.tex
diff options
context:
space:
mode:
authorFred Drake <fdrake@acm.org>2001-10-12 19:01:43 (GMT)
committerFred Drake <fdrake@acm.org>2001-10-12 19:01:43 (GMT)
commit3adf79e3e2ac4ba0c2960997234c0d36c40468a8 (patch)
tree86cbac99bf498cbc2db49feb345b4bd4a17608f4 /Doc/api/init.tex
parent716aac0448ef9fb6f3fd8c82237a7e73e9adb307 (diff)
downloadcpython-3adf79e3e2ac4ba0c2960997234c0d36c40468a8.zip
cpython-3adf79e3e2ac4ba0c2960997234c0d36c40468a8.tar.gz
cpython-3adf79e3e2ac4ba0c2960997234c0d36c40468a8.tar.bz2
Break the Python/C API manual into smaller files by chapter. This manual
has grown beyond what font-lock will work with using the default (X)Emacs settings. Indentation of the description has been made consistent, and a number of smaller markup adjustments have been made as well.
Diffstat (limited to 'Doc/api/init.tex')
-rw-r--r--Doc/api/init.tex774
1 files changed, 774 insertions, 0 deletions
diff --git a/Doc/api/init.tex b/Doc/api/init.tex
new file mode 100644
index 0000000..890ca0d
--- /dev/null
+++ b/Doc/api/init.tex
@@ -0,0 +1,774 @@
+\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}{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 extension may not work properly if
+ their initialization routine is called more than once; this can
+ happen if an applcation 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 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.)
+\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 interpreted 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,
+ \character{;} on DOS/Windows, and \character{\e n} (the \ASCII{}
+ newline character) on Macintosh. 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 the list \code{sys.version}.
+ \withsubitem{(in module sys)}{\ttindex{version}}
+\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 Macintosh, it is \code{'mac'}. 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 the
+ list \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}{int}{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 ten 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}. This is new in Python
+1.5; in earlier versions, such state was stored in global variables,
+and switching threads could cause problems. In particular, exception
+handling is now thread safe, when the application uses
+\withsubitem{(in module sys)}{\ttindex{exc_info()}}
+\function{sys.exc_info()} to access the exception last raised in the
+current thread.
+
+There's one global variable left, 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 \code{Py_BEGIN_ALLOW_THREADS}\ttindex{Py_BEGIN_ALLOW_THREADS} macro
+opens a new block and declares a hidden local variable; the
+\code{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.
+
+When creating a thread data structure, you need to provide an
+interpreter state data structure. The interpreter state data
+structure hold global data that is shared by all threads in an
+interpreter, for example the module administration
+(\code{sys.modules}). Depending on your needs, you can either create
+a new interpreter state data structure, or share the interpreter state
+data structure used by the Python main thread (to access the latter,
+you must obtain the thread state and access its \member{interp} member;
+this must be done by a thread that is created by Python or by the main
+thread after Python is initialized).
+
+
+\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 it
+ 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}{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 then 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 \code{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 \code{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 \code{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 \code{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. If this function returns \NULL, an
+ exception has been raised and the caller should allow it to
+ propogate.
+\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_EXCEPT},
+ \constant{PyTrace_LINE} or \constant{PyTrace_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_EXCEPT}{Exception information as returned by
+ \function{sys.exc_info()}.}
+ \lineii{PyTrace_LINE}{Always \NULL.}
+ \lineii{PyTrace_RETURN}{Value being returned to the caller.}
+ \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_EXCEPT}
+ The value of the \var{what} parameter to a \ctype{Py_tracefunc}
+ function when an exception has been raised by Python code as the
+ result of an operation. The operation may have explictly intended
+ to raise the operation (as with a \keyword{raise} statement), or may
+ have triggered an exception in the runtime as a result of the
+ specific operation.
+\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 propogating an exception.
+\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 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}