## Tcl8.6.17/Tk8.6.17 Documentation > Tcl C API > Preserve

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

  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)
    Tcl_FreeProc *freeProc (入力in)
  説明 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)
  clientData を解放する為に起動する手続函数｡　 Procedure to invoke to free clientData.

### 説明 DESCRIPTION

これ等三つの手続函数は記憶域を管理する為の簡単な参照の仕組みの実装を助ける｡それは部品削除に伴う問題を解かねばならないように考案されているが､他の状況でも便利である｡部品が削除された時､その部品の記録(部品に指定された情報を保有している構造)は記憶域割付け譜に返されなければならない｡しかし､部品の記録が､削除の時に棚上にある手続函数の一つによって使用中であることはあり得ることである｡譬えばこれが起るのは､もし釦部品と結合している命令が釦の破壊を惹き起こす場合: X 行事は起動されるべき行事処理の釦内の C 手続函数を惹き起こす､それは順番に実行されるべき釦に結合した Tcl 命令を惹き起こす､それは順に削除される釦を惹き起こし､それは順に割付解除される釦の部品の記録を惹き起こす｡不運にも､ Tcl 命令が返ったとき､釦の行事処理手続函数は釦部品の記録の参照が必要である｡この理由で､部品記録は削除の一部として解除していはならないが､行事処理手続がそれを終える迄残さなければならない｡部品が削除される他の状況では部品記録はすぐさま解除することが可能かもしれない｡ 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 と Tcl_Release はその clientData 引数の為の短周期参照計数を実装する｡その clientData は対象を識別し､通常､構造の番地から構成される｡その参照計数は対象が対象への夫々の Tcl_Preserve 呼出しが Tcl_Release への呼出しに合致しない限り対象が解放されないことを保障する｡幾つかの数の非合致の Tcl_Preserve 呼出が直ちにあるかもしれない｡ 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 はその clientData 引数を解放するために起動される｡それは､対象に対する非合致の Tcl_Preserve 呼出しがあるかを検査する｡無ければ Tcl_EventuallyFree は直ちに freeProc を呼ぶ｡そうでない場合､ Tcl_EventuallyFree は clientData が最終的に解放されることを記録する｡全ての Tcl_Preserve への呼出しが Tcl_Release への呼出しに合致する時､ freeProc は清浄化する為に Tcl_Release によって呼出される｡ 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.

対象を解除する全ての仕事は FreeProc によって実行される｡ FreeProc は型 FreeProc に合致する引数と結果を有さなければならない: 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);

freeProc への blockPtr 引数は Tcl_EventuallyFree への clientData 引数と同じである｡ blockPtr (char *)の型 は歴史的理由により Tcl_EventuallyFree への clientData 引数の型とは異なるが､値は同じである｡ 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.

Tcl_EventuallyFree への clientData 引数が､割当てられた記憶域を参照し且つ､以前の Tcl_Alloc 又は ckalloc 若しくは Tcl 外部函数の他の函数への呼出しにより返されていた場合､ freeProc 引数は特別な値の TCL_DYNAMIC が与えられるべきである｡ 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.

この仕組みは上で記述した､望ましくない記憶域の再割り当てを惹き起こすかもしれない動作を取巻く Tcl_Preserve と Tcl_Release 呼出しの配置による困難を解決するために使える｡その仕組みは短期の使用のみを意図している(即ち､手続函数が棚上で未決); それは長期の参照計数の為には効果的な仕組みとして働かない｡この実装は解放される対象の内部構造には全く依存しない; それは区別された構造内の参照計数を保持している｡ 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
Copyright © 1990 The Regents of the University of California.
Copyright © 1994-1996 Sun Microsystems, Inc.