2015-05-25 26 views
5

Ich muss Lua Sitzung sicher in einer eingebetteten Multithreading-Umgebung ausführen, wo der Thread-Stack vor-zugewiesen ist und eine feste Größe.Lua Sitzung mit begrenzten C/C++ Stapel

Es ist zulässig, dass das Skript aufgrund des hohen C/C++ - Stapelverbrauchs auf Lua-Ebene fehlgeschlagen ist.
Es ist nicht erlaubt, die gesamte Anwendung auf C/C++ - Ebene abgestürzt zu haben.
Ich kann nicht auf Prüfungen von LUAI_MAXCCALLS und MAXCCALLS verlassen.

Was ist der richtige Weg, um einen möglichen Stack-Überlauf der Lua-Sitzung zu überprüfen und zu verhindern?
Wo ist der richtige Ort für einen solchen Check?

+0

Können Sie Lua mit geeigneten Werten von 'LUAI_MAXCCALLS 'und' MAXCCALLS' neu erstellen? – lhf

+1

Leider kann ich nicht. Ich habe die Stapelgröße in Bytes definiert und kann sie nicht ändern. Und es gibt keine direkte Zuordnung von Stack-Größe zu LUAI_MAXCCALLS und MAXCCALLS. – dlask

+0

Könnte www.lua.org/manual/5.3/manual.html#4.2 (LUA_MINSTACK) eine Lösung für Sie sein? – llogiq

Antwort

0

Sie können die C-Funktionen, die aufgerufen werden sollen, innerhalb eines äußeren C-Closes umbrechen, um Ihren C/C++ Stack zu überprüfen. Die Schließung würde eine aufzuwerten enthält die eigentliche C-Funktion Referenzierung aufgerufen werden:

CFunctionThunk(lua_state* l) 
{ 
    Check available stack space. 
    if(available stack space < minimum stack space required) 
    { 
     panic(...); 
    } 
    else 
    { 
     actualFunction = retrieve upvalue; 
     actualFunction(l); 
    } 
} 

Dies wird die Thunk Stack Raum in den Stapelspeicher durch die Funktion erforderlich erforderlich hinzufügen tatsächlich aufgerufen werden, aber dies sollte klein sein und Konstante. Bevor Sie Lua von Anfang an aufrufen, sollten Sie außerdem sicherstellen, dass der verbleibende C-Stack-Platz mindestens groß genug ist, um Ihre Lua VM und zwei der C-Funktion-Stack-Frames (Thunk + Ist) zu enthalten. Sie könnten den Stapelzeiger in einem Debugger untersuchen, um den benötigten Platz für die Thunk- und Lua-VM zu finden, der (mehr oder weniger) konstant sein sollte. Die Prüfung auf Stapelspeicher könnte auch auf einen Thread-lokalen Zähler reduziert werden, der am Anfang des Thunks inkrementiert und an seinem Ende dekrementiert wird.

Eine andere Möglichkeit wäre, einen Lua-Debug-Hook für Funktionsaufrufe zu aktivieren, dort auf C-Funktionen zu prüfen und bei Bedarf den C-Stack zu überprüfen. Dies wird jedoch wahrscheinlich die Laufzeit beeinträchtigen, da der Hook auch für Lua-definierte Funktionen in Ihrem Skript aufgerufen wird.