From e37eb3cba0cd92aae7c51d74e650c9629239a0d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=91=E9=A3=8E?= Date: Tue, 12 Apr 2022 11:11:08 +0800 Subject: [PATCH] Callback (#1571) * Use independent thread for callback * bugfix: use new cb_ctx when changing callback --- lualib-src/lua-skynet.c | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/lualib-src/lua-skynet.c b/lualib-src/lua-skynet.c index 6b686b56..dc3765bb 100644 --- a/lualib-src/lua-skynet.c +++ b/lualib-src/lua-skynet.c @@ -46,18 +46,16 @@ traceback (lua_State *L) { return 1; } +struct callback_context { + lua_State *L; +}; + static int _cb(struct skynet_context * context, void * ud, int type, int session, uint32_t source, const void * msg, size_t sz) { - lua_State *L = ud; + struct callback_context *cb_ctx = (struct callback_context *)ud; + lua_State *L = cb_ctx->L; int trace = 1; int r; - int top = lua_gettop(L); - if (top == 0) { - lua_pushcfunction(L, traceback); - lua_rawgetp(L, LUA_REGISTRYINDEX, _cb); - } else { - assert(top == 2); - } lua_pushvalue(L,2); lua_pushinteger(L, type); @@ -102,17 +100,17 @@ lcallback(lua_State *L) { int forward = lua_toboolean(L, 2); luaL_checktype(L,1,LUA_TFUNCTION); lua_settop(L,1); - lua_rawsetp(L, LUA_REGISTRYINDEX, _cb); - - lua_rawgeti(L, LUA_REGISTRYINDEX, LUA_RIDX_MAINTHREAD); - lua_State *gL = lua_tothread(L,-1); - // reload callback function, See _cb() - lua_settop(gL, 0); + struct callback_context *cb_ctx = (struct callback_context *)lua_newuserdata(L, sizeof(*cb_ctx)); + cb_ctx->L = lua_newthread(L); + lua_pushcfunction(cb_ctx->L, traceback); + lua_setuservalue(L, -2); + lua_setfield(L, LUA_REGISTRYINDEX, "callback_context"); + lua_xmove(L, cb_ctx->L, 1); if (forward) { - skynet_callback(context, gL, forward_cb); + skynet_callback(context, cb_ctx, forward_cb); } else { - skynet_callback(context, gL, _cb); + skynet_callback(context, cb_ctx, _cb); } return 0;