Tcl扩展:扩展的生命周期'ClientData

时间:2012-03-07 09:27:25

标签: tcl cycle

非平凡的原生扩展将需要每个解释器数据 动态分配的结构。

我目前正在使用Tcl_SetAssocData,其中一个键对应 扩展名和适当的删除例程, 防止这种记忆泄漏。

但是,Tcl_PkgProvideEx也允许一个人录制这样的内容 信息。可以通过检索此信息 Tcl_PkgRequireEx。关联扩展的数据结构 它的包装似乎比“抓包”更自然 AssocData;但是Pkg * Ex例程没有提供 自动调用删除例程。所以我想我需要 继续使用AssocData方法。

Pkg * Ex例程是针对哪些情况设计的?

此外,Tcl库允许安装 ExitHandlers和ThreadExitHandlers。 Paraphasing 手动,这是用于将缓冲区刷新到磁盘等。

是否还有其他需要使用ExitHandlers的情况?

当Tcl调用exit时,是否调用了Tcl_PackageUnloadProcs?

1 个答案:

答案 0 :(得分:1)

整个扩展ClientData适用于希望发布自己的存根表(即,表示精确ABI的有组织的功能列表)的扩展,其他扩展可以构建。这是一件非常难得的事情;如果你不想要它,请留空(如果你这样做,请直接联系Tcl核心开发人员的邮件列表;我们在这方面有相当多的经验)。由于它是针对ABI结构的,因此期望是纯静态数据,因此不需要删除。动态数据应通过不同的机制发送(例如,通过Tcl解释器或通过ABI调用函数)。

退出处理程序(可以在多个级别注册)是您在必要时删除某些资源时使用的内容。典型的兴趣点是删除解释器(Tcl_Interp结构),删除线程时以及整个过程何时消失。需要特别删除哪些资源?嗯,通常很明显:文件句柄,数据库句柄等等。一般来说回答很尴尬,因为细节非常重要:提出一个更具体的问题来获得量身定制的建议。

但是,仅在响应unload命令时调用包卸载回调。与包加载回调类似,它们使用“特殊功能符号”注册,如果它们不存在,则unload命令将拒绝卸载包。 大多数软件包都不使用它们。用例是需要为其添加额外可升级功能的非常长期的进程。