From a6adc6909024b828aa44b6ebe4134a66865e7db0 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Fri, 23 Oct 2020 18:21:16 +0800 Subject: [PATCH] Use atomic instruct to avoid concurrence signal 0 --- service-src/service_snlua.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/service-src/service_snlua.c b/service-src/service_snlua.c index 643d3a4d..240aeb7c 100644 --- a/service-src/service_snlua.c +++ b/service-src/service_snlua.c @@ -1,4 +1,5 @@ #include "skynet.h" +#include "atomic.h" #include #include @@ -87,6 +88,10 @@ lua_resumeX(lua_State *L, lua_State *from, int nargs, int *nresults) { struct snlua *l = (struct snlua *)ud; switchL(L, l); int err = lua_resume(L, from, nargs, nresults); + if (l->trap) { + // wait for lua_sethook. (l->trap == -1) + while (l->trap >= 0) ; + } switchL(from, l); return err; } @@ -516,8 +521,12 @@ snlua_signal(struct snlua *l, int signal) { skynet_error(l->ctx, "recv a signal %d", signal); if (signal == 0) { if (l->trap == 0) { - l->trap = 1; + // only one thread can set trap ( l->trap 0->1 ) + if (!ATOM_CAS(&l->trap, 0, 1)) + return; lua_sethook (l->activeL, signal_hook, LUA_MASKCOUNT, 1); + // set finish ( l->trap 1 -> -1 ) + l->trap = -1; } } else if (signal == 1) { skynet_error(l->ctx, "Current Memory %.3fK", (float)l->mem / 1024);