[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Thread in library which call Lua function
- From: Sean Conner <sean@...>
- Date: Fri, 15 Apr 2011 20:19:23 -0400
It was thus said that the Great jseb once stated:
> On 15/04/2011 20:51, Roberto Ierusalimschy wrote:
> >>I think i have a serious problem here, and i'm not waiting for you
> >>for debugging my experiments. Which annoys me is that i was trying
> >>to write a short program for isolating another problem i encounter
> >>with re-entrance in Lua :(
> >>So, i'm opened to all suggestions for solving the drifting problem.
> >
> >Did you try compiling Lua with LUA_USE_APICHECK defined?
> >
> >-- Roberto
> >
> >
>
> No, i didn't knew this option.
> I've built a Lua interpreter with this flag, and i get some more verbose
> errors now:
>
> lua_apicheck: lapi.c:432: lua_pushnumber: Assertion `L->top <
> L->ci->top' failed.
>
> with
> #define api_incr_top(L) {api_check(L, L->top < L->ci->top); L->top++;}
>
>
> This time, it was in "lua_pushnumber", but i've also seen it in
> "lua_rawgeti".
>
> Sometimes, my program works for some time (two or three iterations in
> the thread, which call succesfully the lua callback function).
>
> I know the problem is in my callback C function, in the DLL:
>
> lua_rawgeti (L_context, LUA_REGISTRYINDEX, index_fx_lua);
> lua_pcall(L_context, 0,0,0);
>
> When i comment both two lines, it doesn't hang anymore.
>
> When i comment the second line (lua_pcall), it still hang after three
> iterations, on this assert:
> lua_apicheck: lapi.c:573: lua_rawgeti: Assertion `L->top < L->ci->top'
> failed.
>
> For what i understand, it's something weird with the stack manipulation
> (good guess Sherlock, now time to go to bed).
>
It could be a threading issue. For a quick test, edit llimits.h and
comment out the defines for lua_lock() and lua_unlock(). Then provide a
simple implementation somewhere---something like:
volatile static int mx = 0;
void lua_lock(lua_State *L)
{
assert(!mx);
mx = 1;
}
void lua_unlock(lua_State *L)
{
mx = 0;
}
If it asserts then you definitly have a threading issue.
-spc