+
+ local next_time = math_huge;
+ for i, d in pairs(data) do
+ local t, callback = d[1], d[2];
+ if t <= current_time then
+ data[i] = nil;
+ local r = callback(current_time);
+ if type(r) == "number" then
+ _add_task(r, callback);
+ next_time = math_min(next_time, r);
+ end
+ else
+ next_time = math_min(next_time, t - current_time);
+ end
+ end
+ return next_time;
+ end);
+else
+ local event = server.event;
+ local event_base = server.event_base;
+ local EVENT_LEAVE = (event.core and event.core.LEAVE) or -1;
+
+ function _add_task(delay, callback)
+ local event_handle;
+ event_handle = event_base:addevent(nil, 0, function ()
+ local ret = callback(get_time());
+ if ret then
+ return 0, ret;
+ elseif event_handle then
+ return EVENT_LEAVE;
+ end
+ end
+ , delay);