NAME¶
Tcl_CreateInterp, Tcl_DeleteInterp, Tcl_InterpDeleted - create and delete Tcl
command interpreters
SYNOPSIS¶
#include <tcl.h>
Tcl_Interp *
Tcl_CreateInterp()
Tcl_DeleteInterp(interp)
int
Tcl_InterpDeleted(interp)
ARGUMENTS¶
- Tcl_Interp *interp (in)
- Token for interpreter to be destroyed.
DESCRIPTION¶
Tcl_CreateInterp creates a new interpreter structure and returns a token
for it. The token is required in calls to most other Tcl procedures, such as
Tcl_CreateCommand,
Tcl_Eval, and
Tcl_DeleteInterp.
Clients are only allowed to access a few of the fields of Tcl_Interp
structures; see the
Tcl_Interp and
Tcl_CreateCommand man pages
for details. The new interpreter is initialized with the built-in Tcl commands
and with the variables documented in tclvars(3tcl). To bind in additional
commands, call
Tcl_CreateCommand.
Tcl_DeleteInterp marks an interpreter as deleted; the interpreter will
eventually be deleted when all calls to
Tcl_Preserve for it have been
matched by calls to
Tcl_Release. At that time, all of the resources
associated with it, including variables, procedures, and application-specific
command bindings, will be deleted. After
Tcl_DeleteInterp returns any
attempt to use
Tcl_Eval on the interpreter will fail and return
TCL_ERROR. After the call to
Tcl_DeleteInterp it is safe to
examine the interpreter's result, query or set the values of variables,
define, undefine or retrieve procedures, and examine the runtime evaluation
stack. See below, in the section
INTERPRETERS AND MEMORY MANAGEMENT for
details.
Tcl_InterpDeleted returns nonzero if
Tcl_DeleteInterp was called
with
interp as its argument; this indicates that the interpreter will
eventually be deleted, when the last call to
Tcl_Preserve for it is
matched by a call to
Tcl_Release. If nonzero is returned, further calls
to
Tcl_Eval in this interpreter will return
TCL_ERROR.
Tcl_InterpDeleted is useful in deletion callbacks to distinguish between
when only the memory the callback is responsible for is being deleted and when
the whole interpreter is being deleted. In the former case the callback may
recreate the data being deleted, but this would lead to an infinite loop if
the interpreter were being deleted.
INTERPRETERS AND MEMORY MANAGEMENT¶
Tcl_DeleteInterp can be called at any time on an interpreter that may be
used by nested evaluations and C code in various extensions. Tcl implements a
simple mechanism that allows callers to use interpreters without worrying
about the interpreter being deleted in a nested call, and without requiring
special code to protect the interpreter, in most cases. This mechanism ensures
that nested uses of an interpreter can safely continue using it even after
Tcl_DeleteInterp is called.
The mechanism relies on matching up calls to
Tcl_Preserve with calls to
Tcl_Release. If
Tcl_DeleteInterp has been called, only when the
last call to
Tcl_Preserve is matched by a call to
Tcl_Release,
will the interpreter be freed. See the manual entry for
Tcl_Preserve
for a description of these functions.
The rules for when the user of an interpreter must call
Tcl_Preserve and
Tcl_Release are simple:
- Interpreters Passed As Arguments
- Functions that are passed an interpreter as an argument can safely use the
interpreter without any special protection. Thus, when you write an
extension consisting of new Tcl commands, no special code is needed to
protect interpreters received as arguments. This covers the majority of
all uses.
- Interpreter Creation And Deletion
- When a new interpreter is created and used in a call to Tcl_Eval,
Tcl_VarEval, Tcl_GlobalEval, Tcl_SetVar, or
Tcl_GetVar, a pair of calls to Tcl_Preserve and
Tcl_Release should be wrapped around all uses of the interpreter.
Remember that it is unsafe to use the interpreter once Tcl_Release
has been called. To ensure that the interpreter is properly deleted when
it is no longer needed, call Tcl_InterpDeleted to test if some
other code already called Tcl_DeleteInterp; if not, call
Tcl_DeleteInterp before calling Tcl_Release in your own
code.
- Retrieving An Interpreter From A Data Structure
- When an interpreter is retrieved from a data structure (e.g. the client
data of a callback) for use in Tcl_Eval, Tcl_VarEval,
Tcl_GlobalEval, Tcl_SetVar, or Tcl_GetVar, a pair of
calls to Tcl_Preserve and Tcl_Release should be wrapped
around all uses of the interpreter; it is unsafe to reuse the interpreter
once Tcl_Release has been called. If an interpreter is stored
inside a callback data structure, an appropriate deletion cleanup
mechanism should be set up by the code that creates the data structure so
that the interpreter is removed from the data structure (e.g. by setting
the field to NULL) when the interpreter is deleted. Otherwise, you may be
using an interpreter that has been freed and whose memory may already have
been reused.
All uses of interpreters in Tcl and Tk have already been protected. Extension
writers should ensure that their code also properly protects any additional
interpreters used, as described above.
SEE ALSO¶
Tcl_Preserve(3tcl), Tcl_Release(3tcl)
KEYWORDS¶
command, create, delete, interpreter