Tcl_Preserve


HOME

Tcl_Preserve

NAME
SYNOPSIS
ARGUMENTS
DESCRIPTION
SEE ALSO
KEYWORDS

___________________________

NAME

Tcl_Preserve, Tcl_Release, Tcl_EventuallyFree − avoid freeing storage while it is being used

SYNOPSIS

#include <tcl.h>

Tcl_Preserve(clientData)

Tcl_Release(clientData)

Tcl_EventuallyFree(clientData, freeProc)

ARGUMENTS

ClientData clientData (in)

Token describing structure to be freed or reallocated. Usually a pointer to memory for structure.

Tcl_FreeProc *freeProc (in)

Procedure to invoke to free clientData.

______________

DESCRIPTION

These three procedures help implement a simple reference count mechanism for managing storage. They are designed to solve a problem having to do with widget deletion, but are also useful in many other situations. When a widget is deleted, its widget record (the structure holding information specific to the widget) must be returned to the storage allocator. However, it is possible that the widget record is in active use by one of the procedures on the stack at the time of the deletion. This can happen, for example, if the command associated with a button widget causes the button to be destroyed: an X event causes an event-handling C procedure in the button to be invoked, which in turn causes the button’s associated Tcl command to be executed, which in turn causes the button to be deleted, which in turn causes the button’s widget record to be de-allocated. Unfortunately, when the Tcl command returns, the button’s event-handling procedure will need to reference the button’s widget record. Because of this, the widget record must not be freed as part of the deletion, but must be retained until the event-handling procedure has finished with it. In other situations where the widget is deleted, it may be possible to free the widget record immediately.

Tcl_Preserve and Tcl_Release implement short-term reference counts for their clientData argument. The clientData argument identifies an object and usually consists of the address of a structure. The reference counts guarantee that an object will not be freed until each call to Tcl_Preserve for the object has been matched by calls to Tcl_Release. There may be any number of unmatched Tcl_Preserve calls in effect at once.

Tcl_EventuallyFree is invoked to free up its clientData argument. It checks to see if there are unmatched Tcl_Preserve calls for the object. If not, then Tcl_EventuallyFree calls freeProc immediately. Otherwise Tcl_EventuallyFree records the fact that clientData needs eventually to be freed. When all calls to Tcl_Preserve have been matched with calls to Tcl_Release then freeProc will be called by Tcl_Release to do the cleanup.

All the work of freeing the object is carried out by freeProc. FreeProc must have arguments and result that match the type Tcl_FreeProc:

typedef void Tcl_FreeProc(char *blockPtr);

The blockPtr argument to freeProc will be the same as the clientData argument to Tcl_EventuallyFree. The type of blockPtr (char *) is different than the type of the clientData argument to Tcl_EventuallyFree for historical reasons, but the value is the same.

When the clientData argument to Tcl_EventuallyFree refers to storage allocated and returned by a prior call to Tcl_Alloc, ckalloc, or another function of the Tcl library, then the freeProc argument should be given the special value of TCL_DYNAMIC.

This mechanism can be used to solve the problem described above by placing Tcl_Preserve and Tcl_Release calls around actions that may cause undesired storage re-allocation. The mechanism is intended only for short-term use (i.e. while procedures are pending on the stack); it will not work efficiently as a mechanism for long-term reference counts. The implementation does not depend in any way on the internal structure of the objects being freed; it keeps the reference counts in a separate structure.

SEE ALSO

Tcl_Interp, Tcl_Alloc

KEYWORDS

free, reference count, storage



More Linux Commands

manpages/XkbGetAccessXTimeout.3.html
XkbGetAccessXTimeout(3) - Queries the current AccessXTimeout
XkbGetAccessXTimeout.3 - In environments where computers are shared, features such as SlowKeys present a problem: if SlowKeys is on, the keyboard can appear to

manpages/Tcl_Alloc.3.html
Tcl_Alloc(3) - allocate or free heap memory - Linux man page
Tcl_Alloc.3 - These procedures provide a platform and compiler independent interface for memory allocation. Programs that need to transfer ownership of memory b

manpages/gluEndTrim.3gl.html
gluEndTrim(3gl) - delimit a NURBS trimming loop definition
Use gluBeginTrim to mark the beginning of a trimming loop, and gluEndTrim to mark the end of a trimming loop. A trimming loop is a set of oriented curve segment

manpages/glutSpaceballRotateFunc.3.html
glutSpaceballRotateFunc(3) - sets the Spaceball rotation cal
glutSpaceballRotateFunc sets the Spaceball rotate callback for the current window. The Spaceball rotate callback for a window is called when the window has Spac

manpages/sasl_client_new.3.html
sasl_client_new(3) - Create a new client authentication obje
sasl_client_new() creates a new SASL context. This context will be used for all SASL calls for one connection. It handles both authentication and integrity/encr

manpages/link.2.html
link(2) - make a new name for a file - Linux manual page....
link() creates a new link (also known as a hard link) to an existing file. If newpath exists, it will not be overwritten. This new name may be used exactly as t

manpages/ops.3pm.html
ops(3pm) - Perl pragma to restrict unsafe operations when co
Since the ops pragma currently has an irreversible global effect, it is only of significant practical use with the -M option on the command line. See the Opcode

manpages/Tk_DrawFocusHighlight.3.html
Tk_DrawFocusHighlight(3) - draw the traversal highlight ring
Tk_DrawFocusHighlight is a utility procedure that draws the traversal highlight ring for a widget. It is typically invoked by widgets during redisplay. KEYWORDS

manpages/Tk_SetGrid.3.html
Tk_SetGrid(3) - control the grid for interactive resizing...
Tk_SetGrid turns on gridded geometry management for tkwins toplevel window and specifies the geometry of the grid. Tk_SetGrid is typically invoked by a widget w

manpages/fsck.ext3.8.html
fsck.ext3(8) - check a Linux ext2/ext3/ext4 file system.....
e2fsck is used to check the ext2/ext3/ext4 family of file systems. For ext3 and ext4 filesystems that use a journal, if the system has been shut down uncleanly

manpages/pcre32_get_named_substring.3.html
pcre32_get_named_substring(3) Perl-compatible regular expres
This is a convenience function for extracting a captured substring by name. The arguments are: code Compiled pattern subject Subject that has been successfully

manpages/IO::WrapTie.3pm.html
IO::WrapTie(3pm) - wrap tieable objects in IO::Handle interf
Suppose you have a class FooHandle, where... * FooHandle does not inherit from IO::Handle; that is, it performs filehandle-like I/O, but to something other than





We can't live, work or learn in freedom unless the software we use is free.