Preserve.3
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. '"
  2. '" Copyright (c) 1990 The Regents of the University of California.
  3. '" Copyright (c) 1994-1996 Sun Microsystems, Inc.
  4. '"
  5. '" See the file "license.terms" for information on usage and redistribution
  6. '" of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  7. '" 
  8. '" RCS: @(#) $Id: Preserve.3,v 1.4 2002/02/26 02:22:20 hobbs Exp $
  9. '" 
  10. .so man.macros
  11. .TH Tcl_Preserve 3 7.5 Tcl "Tcl Library Procedures"
  12. .BS
  13. .SH NAME
  14. Tcl_Preserve, Tcl_Release, Tcl_EventuallyFree - avoid freeing storage while it's being used
  15. .SH SYNOPSIS
  16. .nf
  17. fB#include <tcl.h>fR
  18. .sp
  19. fBTcl_PreservefR(fIclientDatafR)
  20. .sp
  21. fBTcl_ReleasefR(fIclientDatafR)
  22. .sp
  23. fBTcl_EventuallyFreefR(fIclientData, freeProcfR)
  24. .SH ARGUMENTS
  25. .AS Tcl_FreeProc clientData
  26. .AP ClientData clientData in
  27. Token describing structure to be freed or reallocated.  Usually a pointer
  28. to memory for structure.
  29. .AP Tcl_FreeProc *freeProc in
  30. Procedure to invoke to free fIclientDatafR.
  31. .BE
  32. .SH DESCRIPTION
  33. .PP
  34. These three procedures help implement a simple reference count mechanism
  35. for managing storage.  They are designed to solve a problem
  36. having to do with widget deletion, but are also useful in many other
  37. situations.  When a widget is deleted, its
  38. widget record (the structure holding information specific to the
  39. widget) must be returned to the storage allocator.
  40. However, it's possible that the widget record is in active use
  41. by one of the procedures on the stack at the time of the deletion.
  42. This can happen, for example, if the command associated with a button
  43. widget causes the button to be destroyed:  an X event causes an
  44. event-handling C procedure in the button to be invoked, which in
  45. turn causes the button's associated Tcl command to be executed,
  46. which in turn causes the button to be deleted, which in turn causes
  47. the button's widget record to be de-allocated.
  48. Unfortunately, when the Tcl command returns, the button's
  49. event-handling procedure will need to reference the
  50. button's widget record.
  51. Because of this, the widget record must not be freed as part of the
  52. deletion, but must be retained until the event-handling procedure has
  53. finished with it.
  54. In other situations where the widget is deleted, it may be possible
  55. to free the widget record immediately.
  56. .PP
  57. fBTcl_PreservefR and fBTcl_ReleasefR
  58. implement short-term reference counts for their fIclientDatafR
  59. argument.
  60. The fIclientDatafR argument identifies an object and usually
  61. consists of the address of a structure.
  62. The reference counts guarantee that an object will not be freed
  63. until each call to fBTcl_PreservefR for the object has been
  64. matched by calls to fBTcl_ReleasefR.
  65. There may be any number of unmatched fBTcl_PreservefR calls
  66. in effect at once.
  67. .PP
  68. fBTcl_EventuallyFreefR is invoked to free up its fIclientDatafR
  69. argument.
  70. It checks to see if there are unmatched fBTcl_PreservefR calls
  71. for the object.
  72. If not, then fBTcl_EventuallyFreefR calls fIfreeProcfR immediately.
  73. Otherwise fBTcl_EventuallyFreefR records the fact that fIclientDatafR
  74. needs eventually to be freed.
  75. When all calls to fBTcl_PreservefR have been matched with
  76. calls to fBTcl_ReleasefR then fIfreeProcfR will be called by
  77. fBTcl_ReleasefR to do the cleanup.
  78. .PP
  79. All the work of freeing the object is carried out by fIfreeProcfR.
  80. fIFreeProcfR must have arguments and result that match the
  81. type fBTcl_FreeProcfR:
  82. .CS
  83. typedef void Tcl_FreeProc(char *fIblockPtrfR);
  84. .CE
  85. The fIblockPtrfR argument to fIfreeProcfR will be the
  86. same as the fIclientDatafR argument to fBTcl_EventuallyFreefR.
  87. The type of fIblockPtrfR (fBchar *fR) is different than the type of the
  88. fIclientDatafR argument to fBTcl_EventuallyFreefR for historical
  89. reasons, but the value is the same.
  90. .PP
  91. When the fIclientDatafR argument to fBTcl_EventuallyFreefR
  92. refers to storage allocated and returned by a prior call to
  93. fBTcl_AllocfR, fBckallocfR, or another function of the Tcl library,
  94. then the fIfreeProcfR argument should be given the special value of
  95. fBTCL_DYNAMICfR.
  96. .PP
  97. This mechanism can be used to solve the problem described above
  98. by placing fBTcl_PreservefR and fBTcl_ReleasefR calls around
  99. actions that may cause undesired storage re-allocation.  The
  100. mechanism is intended only for short-term use (i.e. while procedures
  101. are pending on the stack);  it will not work efficiently as a
  102. mechanism for long-term reference counts.
  103. The implementation does not depend in any way on the internal
  104. structure of the objects being freed;  it keeps the reference
  105. counts in a separate structure.
  106. .SH "SEE ALSO"
  107. Tcl_Interp, Tcl_Alloc
  108. .SH KEYWORDS
  109. free, reference count, storage