HPUX Preserve[3]



Preserve in anderen Kapiteln des hpux Handbuch:




 Tk_Preserve(3)                      Tk                       Tk_Preserve(3)

 Tk Library Procedures                                 Tk Library Procedures





 ___________________________________________________________________________

 NAME
      Tk_Preserve, Tk_Release, Tk_EventuallyFree  -  avoid  freeing  storage
      while it's being used

 SYNOPSIS
      #include <tk.h>

      Tk_Preserve(clientData)

      Tk_Release(clientData)

      Tk_EventuallyFree(clientData, freeProc)

 ARGUMENTS
      ClientData    clientData   (in)      Token describing structure to  be
                                           freed  or reallocated.  Usually a
                                           pointer to memory for structure.

      Tk_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.  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's
      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.

      Tk_Preserve and Tk_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



                                    - 1 -        Formatted:  August 11, 1996






 Tk_Preserve(3)                      Tk                       Tk_Preserve(3)

 Tk Library Procedures                                 Tk Library Procedures





      reference counts guarantee that an object will not be freed until each
      call to Tk_Preserve for the  object  has  been  matched  by  calls  to
      Tk_Release.  There may be any number of unmatched Tk_Preserve calls in
      effect at once.

      Tk_EventuallyFree is invoked to free up its clientData  argument.   It
      checks to see if there are unmatched Tk_Preserve calls for the object.
      If not, then Tk_EventuallyFree calls freeProc immediately.   Otherwise
      Tk_EventuallyFree records the fact that clientData needs eventually to
      be freed.  When all calls to Tk_Preserve have been matched with  calls
      to  Tk_Release  then  freeProc  will be called by Tk_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
      Tk_FreeProc:
           typedef void Tk_FreeProc(ClientData clientData);
      The clientData argument to freeProc will be the same as the clientData
      argument to Tk_EventuallyFree.

      This mechanism can be used to solve the  problem  described  above  by
      placing Tk_Preserve and Tk_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.


 KEYWORDS
      free, reference count, storage




















                                    - 2 -        Formatted:  August 11, 1996