Выключение Lua/конец обратного вызова выполнения программы

Я пишу модуль для Lua. При закрытии интерпретатора lua он должен запускать процедуры очистки, даже если пользователь забывает неявно вызвать процедуру завершения работы.

Модуль в основном написан на C.

Какой обратный вызов в Lua C Api следует использовать для обнаружения завершения выполнения программы? Единственная идея, с которой я пришел, - это использовать метаметод __gc для таблицы, представляющей мой модуль. Есть идеи?


person Boris    schedule 12.10.2010    source источник


Ответы (1)


Из модуля C проще всего создать полный userdata с metatable с __gc метаметодом. Сохраните его в поле в среде модуля, чтобы сборщик мусора не собирал его до тех пор, пока модуль не будет выгружен.

Согласно руководству, только userdata вызывают свой __gc метаметод коллектор, поэтому вы не можете использовать таблицу для хранения финализатора модуля.

Для модуля, написанного на чистом Lua, который нуждается в финализаторе, вам все равно нужно иметь userdata для его поддержки. Неподдерживаемая и недокументированная, но широко известная функция newproxy() может использоваться для создания пустой userdata с метатаблицей. использовать для этой цели. Назовите его как newproxy(true), чтобы получить метатаблицу, и используйте getmetatable(), чтобы получить метатаблицу, чтобы вы могли добавить к ней метаметод __gc.

person RBerteig    schedule 12.10.2010
comment
Кажется, работает нормально (внутри модуля lua - закрытие - это процедура выключения) - person Boris; 12.10.2010
comment
local shutdownproxy = newproxy(true) -- создать прокси-объект с новой метатаблицей assert(type(shutdownproxy) == 'userdata') getmetatable(shutdownproxy).__gc = function() print GC; ivrworx.close(); распечатать GC1; конец - person Boris; 12.10.2010