2017-01-03 13 views
2

Я реализовал несколько ExternalStrctures (как часть «усилий FFI»), и для некоторых из них я хочу реализовать финализацию для восстановления внешней памяти.Как заставить финализацию (для тестирования) в Cuis/Squeak/Pharo?

Я пытаюсь написать несколько тестов для этого, и кажется, что независимо от того, сколько раз я заставляю сбор мусора с Smalltalk garbageCollect, финализация (по-видимому) никогда не срабатывает.

Чтобы убедиться в этом, я поставил внешнюю точку останова (используя gdb) в функции, которую я вызываю из финализатора, но точка останова никогда не попадает. Я также проверил все ссылки на объект (после запуска многих GC), и единственной ссылкой является WeakRegistry (я попал на объект, используя allInstances).

Есть ли способ принудительно завершить финализацию (в Cuis/Pharo/Squeak)?

+0

Вы видели объект >> #toFinalizeSend: to: with :? –

+0

Я сделал, спасибо. Мое понимание заключается в том, что '#toFinalizeSend: to: with' заменит первоначальное поведение при завершении, но не форсирует окончание. Я мог бы использовать его, чтобы узнать, что финализация инициирована, но не для принудительной доработки. Я считаю, что было бы интересно решить мою другую проблему, если я затем перейду на завершение первоначального метода. Nice :-) – gera

+1

Я обнаружил, что у меня возникают проблемы с процессом, выполняющим завершение. По какой-то причине он не запускается автоматически (а затем он также отключается, если я сохраняю изображение). Прямо сейчас, чтобы перезапустить его, я вручную запускаю «WeakArray restartFinalizationProcess», после чего «Smalltalk garbageCollect» заставляет финализацию. Я отвечу на вопрос, как только я пойму, как правильно установить процесс. – gera

ответ

3

Smalltalk garbageCollect должен всегда вызывать завершение. Если объект новый, то Smalltalk garbageCollectMost может также вызвать его (в зависимости от виртуальной машины).

Обратите внимание, что завершение выполняется процессом на изображении. Если по какой-то причине этот процесс не запускается, завершение не будет завершено.

Кроме того, существуют исторически разные способы, чтобы виртуальная машина сигнализировала изображение, которое объекты завершают. Первоначально процесс завершения должен был сканировать все слабые объекты, которые были надежными, но неэффективными. В настоящее время виртуальная машина и изображение должны будут согласовать метод поиска объектов для завершения. Если они несовместимы, финализация может оказаться ненадежной.

+0

Спасибо, Берт! Уверенность очень приятная. Я обнаружил, что вы сказали, процесс финализации не запущен, и он не запускается автоматически. Я должен вручную запустить 'WeakArray restartFinalizationProcess', чтобы начать финализацию, с этим мой тест работает. – gera

0

Я думаю, что #testFinalization в пакете OpenCL.pck.st может помочь, по крайней мере, в качестве рабочего эксперимента для начала.

+0

Не могли бы вы вставить часть этого кода здесь? Это было бы более удобно. –

+0

Ну, тест утверждает, что эффект финализации происходит после выполнения «Smalltlak garbegeCollectMost». Вставка кода здесь потребует довольно подробной информации о дизайне пакета OpenCL, который на самом деле не связан с вопросом. Мой первоначальный ответ вообще не отвечает на вопрос, это всего лишь предложение о том, где искать. –