[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: How can I know whether it is in the "metamethod/C-call" before calling lua_yield ?
- From: 云风 <cloudwu@...>
- Date: Tue, 17 Aug 2010 11:00:01 +0800
I think if we can add some new char to lua_getinfo for querying L->nCcalls and
L->baseCcalls or a boolean about yieldable will be better.
C-call boundary is a problem in lua 5.2, too.
I suggest lua 5.2 add this feature , it's useful to implement a
preemptive multitasking coroutine.
2010/8/17 Hu Qiwei <huqiwei@gmail.com>:
> Hi Cloud,
>
> I think there's no easy and efficient way to solve your problem in lua
> 5.1. And lua_getinfo() is pretty slow for you scenario. My suggestion
> is that you can patch the lua core, add a few functions for your own
> use.
>
> In lua 5.2 it's not a problem, for everything is now yieldable.
>
> Hu
>
> On Mon, Aug 16, 2010 at 5:27 PM, 云风 <cloudwu@gmail.com> wrote:
>> I want to execute some lua code and yield back when timeout . So I
>> use a debug hook like this :
>>
>> static void
>> _hook_count(lua_State *L, lua_Debug *ar)
>> {
>> lua_yield(L,0);
>> }
>>
>> /*
>> 1 function main
>> 2 integer timeout
>> */
>> static int
>> _execute(lua_State *L)
>> {
>> lua_sethook(L, _hook_count , LUA_MASKCOUNT , luaL_checkinteger(L,2));
>> lua_State *sL = lua_newthread(L);
>> lua_pushvalue(L,1);
>> lua_xmove(L, sL, 1);
>> lua_resume(sL , 0);
>> lua_sethook(L, NULL, 0, 0);
>>
>> return 0;
>> }
>>
>> But lua_yield in _hook_count is not safe. It may across
>> metamethod/C-call boundary .
>> So I want to detect it first . If it is in a metamethod/C-call, It
>> wait for returning .
>>
>> static void _hook_count(lua_State *L, lua_Debug *ar);
>>
>> static void
>> _hook_ret(lua_State *L, lua_Debug *ar)
>> {
>> bool in_c = _checkstack(L,ar);
>> if (! in_c) {
>> lua_sethook(L, NULL , 0 , 0);
>> lua_yield(L,0);
>> }
>> }
>>
>> static void
>> _hook_count(lua_State *L, lua_Debug *ar)
>> {
>> bool in_c = _checkstack(L,ar);
>> if (in_c) {
>> lua_sethook(L, _hook_ret , LUA_MASKRET , 0);
>> }
>> else {
>> lua_yield(L,0);
>> }
>> }
>>
>> How can I implement "_checkstack" ? I read the ldo.c :
>>
>> if (L->nCcalls > L->baseCcalls)
>> luaG_runerror(L, "attempt to yield across metamethod/C-call boundary");
>>
>> but I can't access nCcalls or baseCcalls field in L .
>>
>> Can I get this information by lua_getinfo ? or is there another way ?
>>
>> --
>> http://blog.codingnow.com
>>
>
--
http://blog.codingnow.com