Smalltalk 如何在Cuis/Squeak/Pharo中强制完成(用于测试)?

Smalltalk 如何在Cuis/Squeak/Pharo中强制完成(用于测试)?,smalltalk,pharo,squeak,Smalltalk,Pharo,Squeak,我已经实现了一些外部结构(作为“FFI工作”的一部分),对于其中一些结构,我希望实现最终确定以回收外部内存 我正试图为此编写一些测试,似乎无论我用Smalltalk garbageCollect强制执行多少次垃圾收集,都不会(显然)触发终结 为了确保这一点,我在从终结器调用的函数中放置了一个外部断点(使用gdb),但从未命中该断点。 我还检查了对象的所有引用(在运行了许多GC之后),唯一的引用是WeakRegistry(我使用allInstances访问了对象) 有没有办法强制完成(在Cuis/

我已经实现了一些外部结构(作为“FFI工作”的一部分),对于其中一些结构,我希望实现最终确定以回收外部内存

我正试图为此编写一些测试,似乎无论我用
Smalltalk garbageCollect
强制执行多少次垃圾收集,都不会(显然)触发终结

为了确保这一点,我在从终结器调用的函数中放置了一个外部断点(使用gdb),但从未命中该断点。 我还检查了对象的所有引用(在运行了许多GC之后),唯一的引用是WeakRegistry(我使用allInstances访问了对象)


有没有办法强制完成(在Cuis/Pharo/Squeak中)?

我认为OpenCL.pck.st包中的testFinalization可能会有所帮助,至少作为一个开始的工作实验。

Smalltalk garbageCollect应该总是触发完成。如果对象是新的,则
Smalltalk garbageCollectMost
也可能触发它(取决于VM)

请注意,终结是由映像中的进程实现的。如果由于某种原因该进程没有运行,则不会进行最终确定


此外,虚拟机在历史上也有不同的方式来通知要最终确定哪些对象的映像。最初,最终确定过程必须扫描所有弱对象,这是健壮的,但效率低下。如今,虚拟机和映像必须就找到要最终确定的对象的方法达成一致。如果这些不匹配,那么定稿可能不可靠。

您是否看到Object>\toFinalizeSend:to:with:?我看到了,谢谢。我的理解是,
#toFinalizeSend:to:with
将替换原始的终结行为,但不会强制终结。我可以用它来知道是否触发了终结,但不能强制终结。我相信解决我的另一个问题会很有趣,如果我将最终定稿转发到原始方法。尼斯:-)我发现我在完成定稿的过程中遇到了问题。由于某些原因,它不会自动启动(如果保存图像,它也会被禁用)。现在要重新启动它,我正在手动执行
WeakArray restartFinalizationProcess
,之后,
Smalltalk garbageCollect
会强制完成。一旦我理解了如何正确安装进程,我就会回答这个问题。在Squeak中,
restartFinalizationProcess
在映像启动时发送(请参阅
WeakArray initialize
)。我怀疑您在某个时候在终结器中出错,并关闭了调试器,这将终止终结过程。假定终结器是无错误的;)我刚刚发现,保存图像后,
WeakArray终结的过程不会返回。这是Cuis特有的,它可能存在于其他吱吱声中,也可能不存在于其他吱吱声中。我会尽力找出原因的,你能在这里粘贴一些代码吗?这会更方便。测试断言,在执行“Smalltlak garbegeCollectMost”之后,最终确定的效果就会发生。在这里粘贴代码需要相当多的关于OpenCL包设计的细节,这与问题无关。我最初的答案根本没有回答这个问题,它只是一个去哪里看的建议。谢谢伯特!有把握是很好的。我发现了你所说的,终结过程没有运行,也没有自动启动。我必须手动运行“WeakArray restartFinalizationProcess”才能开始完成,这样我的测试才能正常工作。