net.server_epoll: Prevent removed timers from being readded
authorKim Alvefur <zash@zash.se>
Tue, 31 Aug 2021 13:34:08 +0200
changeset 11765 dbf378dcf27b
parent 11764 d66738eeb875
child 11766 54530085dffe
net.server_epoll: Prevent removed timers from being readded In a case like this the timer would not be readded: addtimer(1, function(t, id) stop(id) return 1 end);
net/server_epoll.lua
--- a/net/server_epoll.lua	Tue Aug 31 11:38:09 2021 +0200
+++ b/net/server_epoll.lua	Tue Aug 31 13:34:08 2021 +0200
@@ -99,8 +99,14 @@
 local timers = indexedbheap.create();
 
 local function noop() end
+
+-- Keep track of recently closed timers to avoid re-adding them
+local closedtimers = {};
+
 local function closetimer(id)
-	timers:remove(id);
+	if timers:remove(id) then
+		closedtimers[id] = true;
+	end
 end
 
 local function reschedule(id, time)
@@ -138,7 +144,7 @@
 
 		local _, timer, id = timers:pop();
 		local ok, ret = xpcall(timer, traceback, now, id);
-		if ok and type(ret) == "number"  then
+		if ok and type(ret) == "number" and not closedtimers[id] then
 			local next_time = elapsed+ret;
 			-- Delay insertion of timers to be re-added
 			-- so they don't get called again this tick
@@ -161,6 +167,10 @@
 		peek = timers:peek();
 	end
 
+	if next(closedtimers) ~= nil then
+		closedtimers = {};
+	end
+
 	if peek == nil then
 		return next_delay;
 	else