|
View:
New views
5 Messages
—
Rating Filter:
Alert me
|
|
|
Multiple related lua statesHi All, I am investigating using lua in an embedded
environment where application separation and security is very important. The
environment runs multiple logical applications within a single proprietary VM. Each logical application has a virtual file system
and cache etc etc. Applications will be able to create and run
script. Lua seems very good for providing scripting in this environment. Except
… I want a lot of common scripted functionality to be
available to all applications. But I do not want to have multiple lua
states each with a lot of code loaded. I want a single lua state with all common functions and
data loaded in a central location and then each application to be able to
operate on its **own** ‘virtual’ lua state without knowledge of
other applications. This really does have to be secure. I do not
want applications altering the global in any way unless it is using a function
that exists in the global state. As the application shuts down I also want to be able
to get of an applications data and application state. Can I achieve this? Greg
McCreath
http://www.tafmo.com This email and any files transmitted with it may be confidential and are intended solely for the use of the individual or entity to whom they are addressed. This email may contain personal information of individuals, and be subject to Commonwealth and/or State privacy laws in Australia. This email is also subject to copyright. If you are not the intended recipient, you must not read, print, store, copy, forward or use this email for any reason, in accordance with privacy and copyright laws. If you have received this email in error, please notify the sender by return email, and delete this email from your inbox. |
|
|
|
|
|
|
|
|
Re: Multiple related lua states> Does using lua threads actually imply that I must use a thread? In the
> model I am suggesting, only one application is 'live' at a time - you > can imagine a main menu with apps hanging off it. You go into each app > one at a time. No application concurrency. > > Can application access the threads global table (and by implication) > access another application's data? Or can this be prottected in the > manner you have described with the global table? If there is no concurrency, then you may try to create a single parent state containing your static data and functions and then load each "application" into a separate child state for which the global table has been changed to an empty table with an __index metamethod pointing to the parent global table. All static data will be seen in the child state but they'll be protected against wrtiting. --lhf |
|
|
Re: Multiple related lua statesWell, I use that code in a ScriptManager class which creates a
initial lua state, so I can put in there global variables or functions. Once the initial lua state is created, you can add children with something like this: Script *ScriptManager::createScript() { int top = lua_gettop(L); Script *script = 0; lua_getfield(L, LUA_REGISTRYINDEX, "Scripts"); // top + 1 lua_State *thread = lua_newthread(L); // top + 2 script = new Script(thread); // this is the new lua-state for that script lua_newtable(L); // a global table for this script lua_newtable(L); // metatable lua_getfenv(L,top+2); // that returns the global table (we are going to protect) lua_setfield(L, -2, "__index"); // set global table as __index of the thread lua_setmetatable(L, -2); lua_setfenv(L,top+2); // set env of the new thread lua_pushlightuserdata(L, script); // key, the pointer to my own Script class lua_pushvalue(L, top+2); // value, the new lua thread. lua_rawset(L,top+1); // Scripts table lua_settop(L,top); _scriptCount++; return script; } Script is a class that handles a single lua-state ( in fact it doesn't know that is a thread) By the way, the ScriptManager stores it's children scripts in the registry in a table called "Scripts" indexed by the pointer of the new Script class instance. Jose L. El 24/05/2006, a las 13:49, Luiz Henrique de Figueiredo escribió: >> Does using lua threads actually imply that I must use a thread? >> In the >> model I am suggesting, only one application is 'live' at a time - you >> can imagine a main menu with apps hanging off it. You go into >> each app >> one at a time. No application concurrency. >> >> Can application access the threads global table (and by implication) >> access another application's data? Or can this be prottected in the >> manner you have described with the global table? > > If there is no concurrency, then you may try to create a single parent > state containing your static data and functions and then load each > "application" into a separate child state for which the global table > has been changed to an empty table with an __index metamethod pointing > to the parent global table. All static data will be seen in the child > state but they'll be protected against wrtiting. > --lhf |
| Free Forum Powered by Nabble | Forum Help |