From 223bd599ba057b34a9e2be4d4d73ef2317e55b0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AD=90=E7=86=8F?= Date: Wed, 29 Mar 2023 10:42:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=AE=BE=E7=BD=AE=20callback?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84crash=E9=97=AE=E9=A2=98=20(#1726)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix set callback in resolve _cb * 调整注释 * 使用预处理callback 来解决引用问题 * add cb_pre and forward_pre * delete precb_context * format tab --------- Co-authored-by: zixun --- lualib-src/lua-skynet.c | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/lualib-src/lua-skynet.c b/lualib-src/lua-skynet.c index dc3765bb..811a4392 100644 --- a/lualib-src/lua-skynet.c +++ b/lualib-src/lua-skynet.c @@ -94,25 +94,47 @@ forward_cb(struct skynet_context * context, void * ud, int type, int session, ui return 1; } +static void +clear_last_context(lua_State *L) { + if (lua_getfield(L, LUA_REGISTRYINDEX, "callback_context") == LUA_TUSERDATA) { + lua_pushnil(L); + lua_setiuservalue(L, -2, 2); + } + lua_pop(L, 1); +} + +static int +_cb_pre(struct skynet_context * context, void * ud, int type, int session, uint32_t source, const void * msg, size_t sz) { + struct callback_context *cb_ctx = (struct callback_context *)ud; + clear_last_context(cb_ctx->L); + skynet_callback(context, ud, _cb); + return _cb(context, cb_ctx, type, session, source, msg, sz); +} + +static int +_forward_pre(struct skynet_context *context, void *ud, int type, int session, uint32_t source, const void *msg, size_t sz) { + struct callback_context *cb_ctx = (struct callback_context *)ud; + clear_last_context(cb_ctx->L); + skynet_callback(context, ud, forward_cb); + return forward_cb(context, cb_ctx, type, session, source, msg, sz); +} + static int lcallback(lua_State *L) { struct skynet_context * context = lua_touserdata(L, lua_upvalueindex(1)); int forward = lua_toboolean(L, 2); luaL_checktype(L,1,LUA_TFUNCTION); lua_settop(L,1); - struct callback_context *cb_ctx = (struct callback_context *)lua_newuserdata(L, sizeof(*cb_ctx)); + struct callback_context * cb_ctx = (struct callback_context *)lua_newuserdatauv(L, sizeof(*cb_ctx), 2); cb_ctx->L = lua_newthread(L); lua_pushcfunction(cb_ctx->L, traceback); - lua_setuservalue(L, -2); + lua_setiuservalue(L, -2, 1); + lua_getfield(L, LUA_REGISTRYINDEX, "callback_context"); + lua_setiuservalue(L, -2, 2); lua_setfield(L, LUA_REGISTRYINDEX, "callback_context"); lua_xmove(L, cb_ctx->L, 1); - if (forward) { - skynet_callback(context, cb_ctx, forward_cb); - } else { - skynet_callback(context, cb_ctx, _cb); - } - + skynet_callback(context, cb_ctx, (forward)?(_forward_pre):(_cb_pre)); return 0; }