\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}
