Lua shutdown / Завершение выполнения программы обратного вызова - PullRequest
4 голосов
/ 12 октября 2010

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

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

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

1 Ответ

4 голосов
/ 12 октября 2010

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

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

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

...