2010-10-12 4 views
3

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

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

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

ответ

3

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

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

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

+0

Кажется, работает нормально (внутри модуля Lua - близко отключение рутина) – Boris

+0

местного shutdownproxy = newproxy (истина) - создать прокси-объект с новым Метастабильной Assert (типа (shutdownproxy) == 'UserData') GetMetaTable (shutdownproxy) .__ gc = function() print "GC"; ivrworx.close(); напечатать «GC1»; конец – Boris