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被调用?

时间:原作者:0个回答

77 4

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

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

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

原作者:
...