mirror of
https://github.com/cloudwu/skynet.git
synced 2026-07-22 02:53:09 +00:00
修复设置 callback导致的crash问题 (#1726)
* fix set callback in resolve _cb * 调整注释 * 使用预处理callback 来解决引用问题 * add cb_pre and forward_pre * delete precb_context * format tab --------- Co-authored-by: zixun <lb151450@alibaba-inc.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user