2015-05-25 15 views
5

Devo eseguire la sessione Lua in modo sicuro in un ambiente multithreading incorporato in cui lo stack di thread è pre-allocato e di una dimensione fissa.Sessione Lua con stack C/C++ limitato

È possibile che lo script abbia esito negativo a livello di Lua a causa dell'elevato consumo di stack C/C++.
Non è consentito arrestare l'intera applicazione a livello C/C++.
Non posso fare affidamento sui controlli forniti da LUAI_MAXCCALLS e MAXCCALLS.

Qual è il modo corretto per controllare e prevenire potenziali sovraccarichi di stack della sessione Lua?
Qual è il posto giusto dove implementare tale controllo?

+0

È possibile ricostruire Lua con valori appropriati di "LUAI_MAXCCALLS" e "MAXCCALLS"? – lhf

+1

Purtroppo non posso. Ho la dimensione dello stack definita in byte e non posso cambiarla. E non esiste alcuna mappatura diretta dalla dimensione dello stack a LUAI_MAXCCALLS e MAXCCALLS. – dlask

+0

Potrebbe www.lua.org/manual/5.3/manual.html#4.2 (LUA_MINSTACK) essere una soluzione per te? – llogiq

risposta

0

È possibile eseguire il wrap delle funzioni C da chiamare all'interno di una chiusura C esterna controllando lo stack C/C++. La chiusura conterrebbe un sopravvalutare riferimento alla C-funzione reale di essere chiamato:

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

Questo aggiungerà spazio dello stack del thunk necessario per lo spazio di stack richiesto dalla funzione di realtà ad essere invocate, ma questo dovrebbe essere piccolo e costante. Inoltre, prima di chiamare in Lua fin dall'inizio, dovresti assicurarti che lo spazio rimanente di C-stack sia almeno abbastanza grande da contenere il tuo Lua VM e due dei frame di stack di funzioni C (thunk + actual). È possibile esaminare il puntatore dello stack in un debugger per trovare la quantità di spazio richiesta per il thunk e il Lua VM, che dovrebbe essere (più o meno) costante. Il controllo dello spazio di stack potrebbe anche essere ridotto a un contatore locale del thread che viene incrementato all'inizio del thunk e decrementato alla fine.

Un'altra possibilità sarebbe quella di abilitare un hook di debug Lua sulle chiamate di funzione, controllare le funzioni C e fare il controllo C-stack se necessario. Ma questo probabilmente peggiorerà le prestazioni del runtime poiché l'hook verrà chiamato anche per le funzioni definite da Lua all'interno del tuo script.