4 Stimmen

Lua Abschaltung/Ende des Programm-Ausführungsrückruf

Ich schreibe ein Modul für Lua. Beim Schließen des Lua-Interpreters müssen Aufräumarbeiten durchgeführt werden, auch wenn der Benutzer vergisst, die Abschalt-Routine implizit aufzurufen.

Das Modul ist größtenteils in C geschrieben.

Welchen Rückruf in der Lua C Api sollte ich verwenden, um das Ende der Programmausführung zu erkennen? Die einzige Idee, die mir gekommen ist, ist die Verwendung der __gc-Metamethod auf der Tabelle, die mein Modul repräsentiert. Irgendwelche Ideen?

4voto

RBerteig Punkte 39719

Von einem C-Modul aus ist das einfache Ding zu tun, eine vollständige userdata mit einer metatable und einem __gc Metamethod zu erstellen. Speichern Sie es in einem Feld in der Umgebung des Moduls, damit es nicht vom GC gesammelt wird, bis das Modul entladen wird.

Laut dem Handbuch werden nur userdata durch den Sammler angerufen, um ihren __gc Metamethod aufzurufen, sodass Sie keine Tabelle verwenden können, um den Finalisierer des Moduls zu halten.

Für ein in reinem Lua geschriebenes Modul, das einen Finalisierer benötigt, müssen Sie immer noch eine userdata haben, um ihn aufrechtzuerhalten. Die nicht unterstützte und undokumentierte, aber weithin bekannte Funktion newproxy() kann verwendet werden, um ansonsten eine leere userdata mit einer Metatable zu erstellen, die für diesen Zweck verwendet wird. Rufen Sie sie als newproxy(true) auf, um eine mit einer Metatable zu erhalten, und verwenden Sie getmetatable(), um die Metatable abzurufen, damit Sie den __gc Metamethod hinzufügen können.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X