tcl - Tcl扩展:扩展'的生命周期

  显示原文与译文双语对照的内容
88 5

非平凡的本机扩展将需要动态分配的解释器数据结构。

我目前正在使用 Tcl_SetAssocData,有一个对应于扩展名和适当的删除例程的密钥,以防止内存泄漏。

但是,Tcl_PkgProvideEx还允许记录这些信息。 这里信息可以由Tcl_PkgRequireEx检索。 将扩展结构与包的数据相关联似乎比"grab包"assocData更自然;但Pkg*Ex例程并不提供自动调用的删除例程。 所以我想我需要和AssocData的方法保持一致。

针对哪种情况,Pkg*Ex例程设计为?

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

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

当Tcl调用退出时,Tcl_PackageUnloadProcs被调用?

时间: 原作者:

77 4

整个扩展ClientData用于扩展希望发布自己的存根表( 。例如,有组织的函数列表,表示精确的ABI )的扩展,而其他插件扩展可以针对这些扩展生成。 这是一件非常少见的事情;如果你不想要( 并与Tcl核心开发者联系'邮件列表,请在这个区域中获得一些经验。 由于它是一个ABI结构,所以它是的,期望是纯数据,所以不需要删除。 动态数据应该通过不同的机制( 。比如 。通过Tcl解释器或者通过通过rup调用函数) 发送。

退出处理程序( 可以在多个级别注册) 是当你在适当时间删除某些资源时使用的事件。 典型的兴趣点 是删除一个解释器( 一个 Tcl_Interp 结构),当删除一个线程时,当整个进程被删除时。 需要特别删除哪些资源? 通常很明显:文件句柄,数据库句柄,诸如此类的东西。 很难通常作为细节问题来回答: 问一个更具体的问题,以获得合适的建议。

但是,包卸载回调只在响应 unload 命令时调用。 像包加载回调,它们使用"特殊函数符号"注册,如果不存在,unload 命令将拒绝卸载包。 但是,大多数软件包不使用它们。 然而,用例是存在非常长的进程,需要额外的可以升级功能添加到它们。

原作者:
...