lua-users home
lua-l archive

[Date Prev][Date Next][Thread Prev][Thread Next] [Date Index] [Thread Index]


> >> Use the registry. It's there for these kind of uses.
> >
> > Is it threadsafe?
> 
> If you mean Lua threads, then yes.

I done small library:
========================
#include <lua.h>
#include <lauxlib.h>

#define ERRID_KEY	"errid"

void err_set (lua_State *L, int idx)
{
    lua_pushliteral (L, ERRID_KEY);
    lua_pushvalue (L, idx);
    lua_rawset (L, LUA_REGISTRYINDEX);
}

void err_setno (lua_State *L, int num)
{
    lua_pushliteral (L, ERRID_KEY);
    lua_pushnumber (L, num);
    lua_rawset (L, LUA_REGISTRYINDEX);
}

void err_get (lua_State *L)
{
    lua_pushliteral (L, ERRID_KEY);
    lua_rawget (L, LUA_REGISTRYINDEX);
}

static int err_id (lua_State *L)
{
    if (lua_gettop (L)) err_set (L, 1);
    else err_get (L);
    return 1;
}

LUALIB_API int luaopen_err (lua_State *L)
{
    lua_pushliteral (L, "errid");
    lua_pushcfunction (L, err_id);
    lua_settable (L, LUA_GLOBALSINDEX);
    return 0;
}
========================

And test:
========================
local function foo(a)
    errid(a)
    print("set", a)
    coroutine.yield()
    print(errid())
    return
end

local co1 = coroutine.create(foo)
local co2 = coroutine.create(foo)

coroutine.resume(co1, 11)
coroutine.resume(co2, 22)

coroutine.resume(co1)
coroutine.resume(co2)
========================

Output:
set 11
set 22
22
22

What is wrong? Thanks.