Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
Tcl_CreateInterp(3)	     Tcl Library Procedures	     Tcl_CreateInterp(3)

________________________________________________________________________________

NAME
     Tcl_CreateInterp,	Tcl_DeleteInterp,  Tcl_InterpActive, Tcl_InterpDeleted -
     create and delete Tcl command interpreters

SYNOPSIS
     #include <tcl.h>

     Tcl_Interp *
     Tcl_CreateInterp()

     Tcl_DeleteInterp(interp)

     int
     Tcl_InterpDeleted(interp)

     int									 2
     Tcl_InterpActive(interp)							 2

ARGUMENTS
     Tcl_Interp *interp (in)	      Token for interpreter to be  destroyed  or
				      queried.
________________________________________________________________________________

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.  The token returned
     by Tcl_CreateInterp may only be passed to Tcl routines called from the same
     thread as the original Tcl_CreateInterp call.  It is not safe for	multiple
     threads  to  pass the same token to Tcl's routines.  The new interpreter is
     initialized with the built-in Tcl commands and with standard variables like
     tcl_platform and env. To bind in additional commands,  call  Tcl_CreateCom-
     mand, and to create additional variables, call Tcl_SetVar.

     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 associ-
     ated  with  it,  including  variables, procedures, and application-specific
     command bindings, will be deleted. After Tcl_DeleteInterp returns	any  at-
     tempt  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 in-
     terp 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 call-
     back may recreate the data being deleted, but this would lead to  an  infi-
     nite loop if the interpreter were being deleted.

     Tcl_InterpActive  is  useful for determining whether there is any execution 2
     of scripts ongoing in an interpreter, which is a useful piece  of	informa- 2
     tion when Tcl is embedded in a garbage-collected environment and it becomes 2
     necessary to determine whether the interpreter is a candidate for deletion. 2
     The  function  returns a true value if the interpreter has at least one ac- 2
     tive execution running inside it, and a false value otherwise.

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 en-
     sures  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 in-
	    terpreter once Tcl_Release has been called. To ensure that	the  in-
	    terpreter  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 one of the evaluation func-
	    tions (Tcl_Eval, Tcl_VarEval, Tcl_GlobalEval, Tcl_EvalObjv, etc.) or
	    variable access functions  (Tcl_SetVar,  Tcl_GetVar,  Tcl_SetVar2Ex,
	    etc.),  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.  Exten-
     sion writers should ensure that their code also properly protects any addi-
     tional interpreters used, as described above.

     Note that the protection mechanisms do  not  work	well  with  conventional 2
     garbage  collection systems. When in such a managed environment, Tcl_Inter- 2
     pActive should be used to determine when an interpreter is a candidate  for 2
     deletion due to inactivity.

SEE ALSO
     Tcl_Preserve(3), Tcl_Release(3)

KEYWORDS
     command, create, delete, interpreter

Tcl				       7.5		     Tcl_CreateInterp(3)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=Tcl_CreateInterp.tcl86&sektion=3&manpath=FreeBSD+Ports+15.1.quarterly>

home | help