Hi,


  Thanks for the sample code. It crashed inside Lua if not using your patch.
Thanks for the patch too.



  To avoid adding that reference for regular applications, I added a global
attribute, so you must set it be using IUP inside coroutines:



iup.SetGlobal("IUPLUA_THREADED", "1")



  Just committed the changes to the CVS.



Thanks,

Scuri



From: zcs_chenxiao [mailto:[email protected]]
Sent: sexta-feira, 27 de abril de 2012 23:05
To: IUP discussion list.
Subject: Re: [Iup-users] crash when using iuplua with lua coroutine, and a
temp patch



this is a test case, run it, and click the cell, crash



test.lua:



require( "iuplua" )

require( "iupluacontrols" )



local mat

function task()

    mat = iup.matrix {numcol=5, numlin=3,numcol_visible=5, numlin_visible=3,
widthdef=34}

    mat:setcell(0,0,"Inflation11")

    mat:setcell(1,0,"Medicine")

    mat.click_cb=function() end

end



coroutine.resume(coroutine.create(task))

collectgarbage()

collectgarbage()

dlg = iup.dialog{iup.vbox{mat; margin="10x10"}}

dlg:showxy(iup.CENTER, iup.CENTER)



if (iup.MainLoopLevel()==0) then

  iup.MainLoop()

end



----------------------------------

I patch the iuplua.c,  the function iuplua_plugstate patch should be ok , it
hold the thread state ref, but I am not sure it where to free the Luastate
ref,  I use il_destroy_cb, this maybe not correct.





在 2012-4-27,21:20, Antonio Scuri 写道:





  Hi,



  I never used Lua coroutines, so don’t know if this is going to solve your
problem or not. But I would like to help you.



  Can you build a very small example that demonstrates the problem?



  In the solution you propose, the stored context reference will be used
anywhere else?



Thanks,

Scuri



From: zcs_chenxiao [mailto:[email protected]]
Sent: sexta-feira, 27 de abril de 2012 03:00
To: IUP discussion list
Subject: [Iup-users] crash when using iuplua with lua coroutine, and a temp
patch



I using lua coroutine , and in the lua thread , I create iup controls,  then
when the lua thread end and gc,  game crash.



the patch can  avoid the crash , but I can't sure where to free the lua ref.



change the iuplua.c



void iuplua_plugstate(lua_State *L, Ihandle *ih)

{

         int ref;

         lua_pushthread(L);

         ref=lua_ref(L,LUA_REGISTRYINDEX);   /*keep ref for L, L maybe a
thread*/

  IupSetAttribute(ih, "_IUPLUA_STATE_CONTEXT",(char *) L);

  IupSetAttribute(ih, "_IUPLUA_STATE_CONTEXT_REF",(char *) ref);

  printf("iuplua_plugstate %d\n",ref);

}



???? maybe free the ref on this function 'il_destroy_cb' ?????

static int il_destroy_cb(Ihandle* ih)

{

  /* called from IupDestroy. */

  char* sref = IupGetAttribute(ih, "_IUPLUA_WIDGET_TABLE_REF");

  if (sref)

  {

    lua_State *L = iuplua_getstate(ih);

    int ref = atoi(sref);



    /* removes the ihandle reference in the lua table */

    /* object.handle = nil */

    lua_rawgeti(L, LUA_REGISTRYINDEX, ref);  /* push object */

    lua_pushstring(L, "handle");

    lua_pushnil(L);

    lua_settable(L, -3);

    lua_pop(L,1);



    /* removes the association of the ihandle with the lua table */

    luaL_unref(L, LUA_REGISTRYINDEX, ref);  /* this is the complement of
SetWidget */

    IupSetAttribute(ih, "_IUPLUA_WIDGET_TABLE_REF", NULL);

    IupSetCallback(ih, "LDESTROY_CB", NULL);

  }

  sref = IupGetAttribute(ih, "_IUPLUA_STATE_CONTEXT_REF");

  if (sref)

  {

          lua_State *L = iuplua_getstate(ih);

          int ref=(int)sref;

          lua_unref(L,ref);

      IupSetAttribute(ih, "_IUPLUA_STATE_CONTEXT_REF", NULL);

         printf("il_destroy_cb %d\n",ref);

  }



  return IUP_DEFAULT;

}

----------------------------------------------------------------------------
--
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and
threat landscape has changed and how IT managers can respond. Discussions
will include endpoint security, mobile security and the latest in malware
threats.
http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/___________________
____________________________
Iup-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/iup-users



------------------------------------------------------------------------------
Live Security Virtual Conference
Exclusive live event will cover all the ways today's security and 
threat landscape has changed and how IT managers can respond. Discussions 
will include endpoint security, mobile security and the latest in malware 
threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/
_______________________________________________
Iup-users mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/iup-users

Reply via email to