util/timer.lua
author Matthew Wild <mwild1@gmail.com>
Sun, 29 Apr 2018 21:43:39 +0100
changeset 8765 2f8523bf7ff2
parent 8688 2548111e71d6
child 8998 2e6f7ab97794
permissions -rw-r--r--
util.timer: Ensure we don't try to schedule negative timeouts (which rightly upset libevent). Fixes #1135
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1523
841d61be198f Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents: 896
diff changeset
     1
-- Prosody IM
2923
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1871
diff changeset
     2
-- Copyright (C) 2008-2010 Matthew Wild
b7049746bd29 Update copyright headers for 2010
Matthew Wild <mwild1@gmail.com>
parents: 1871
diff changeset
     3
-- Copyright (C) 2008-2010 Waqas Hussain
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4871
diff changeset
     4
--
832
282ae70db19f Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     5
-- This project is MIT/X11 licensed. Please see the
282ae70db19f Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     6
-- COPYING file in the source package for more information.
282ae70db19f Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     7
--
282ae70db19f Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
     8
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
     9
local indexedbheap = require "util.indexedbheap";
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    10
local log = require "util.logger".init("timer");
4808
07d0a3a75c8a net.server, net.timer, net.server_select: Rearrange dependencies between these three modules. server.addtimer() is no longer a public function (renamed to _addtimer) and is not available at all from server_event (compat code removed to prevent traceback) (thanks Nulani)
Matthew Wild <mwild1@gmail.com>
parents: 4751
diff changeset
    11
local server = require "net.server";
7991
dc758422d896 util.statistics,statsd,throttle,timer: Replace dependency on LuaSockect with util.time for precision time
Kim Alvefur <zash@zash.se>
parents: 6780
diff changeset
    12
local get_time = require "util.time".now
8688
2548111e71d6 util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
    13
local async = require "util.async";
832
282ae70db19f Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    14
local type = type;
5880
11f14d44438e util.timer: Import all require upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 5879
diff changeset
    15
local debug_traceback = debug.traceback;
11f14d44438e util.timer: Import all require upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 5879
diff changeset
    16
local tostring = tostring;
11f14d44438e util.timer: Import all require upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 5879
diff changeset
    17
local xpcall = xpcall;
8765
2f8523bf7ff2 util.timer: Ensure we don't try to schedule negative timeouts (which rightly upset libevent). Fixes #1135
Matthew Wild <mwild1@gmail.com>
parents: 8688
diff changeset
    18
local math_max = math.max;
832
282ae70db19f Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    19
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
    20
local _ENV = nil;
8558
4f0f5b49bb03 vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents: 7992
diff changeset
    21
-- luacheck: std none
832
282ae70db19f Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
    22
6484
dbc72cd1332e Move timer code out of util.timer and into relevant net.server backends
daurnimator <quae@daurnimator.com>
parents: 5898
diff changeset
    23
local _add_task = server.add_task;
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    24
6935
f5fd2c5cdf28 util.timer: If possible, close the existing timer handle in order to have only one
Kim Alvefur <zash@zash.se>
parents: 6934
diff changeset
    25
local _server_timer;
6933
58e260832334 util.timer: Keep count of how many timer instances are active
Kim Alvefur <zash@zash.se>
parents: 6839
diff changeset
    26
local _active_timers = 0;
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    27
local h = indexedbheap.create();
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    28
local params = {};
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    29
local next_time = nil;
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    30
local _id, _callback, _now, _param;
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    31
local function _call() return _callback(_now, _id, _param); end
5880
11f14d44438e util.timer: Import all require upvalues.
Waqas Hussain <waqas20@gmail.com>
parents: 5879
diff changeset
    32
local function _traceback_handler(err) log("error", "Traceback[timer]: %s", debug_traceback(tostring(err), 2)); end
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    33
local function _on_timer(now)
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    34
	local peek;
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    35
	while true do
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    36
		peek = h:peek();
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    37
		if peek == nil or peek > now then break; end
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    38
		local _;
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    39
		_, _callback, _id = h:pop();
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    40
		_now = now;
5879
95f1d5421fbc util.timer: Fix another variable name typo (thanks again zash).
Waqas Hussain <waqas20@gmail.com>
parents: 5878
diff changeset
    41
		_param = params[_id];
95f1d5421fbc util.timer: Fix another variable name typo (thanks again zash).
Waqas Hussain <waqas20@gmail.com>
parents: 5878
diff changeset
    42
		params[_id] = nil;
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    43
		--item(now, id, _param); -- FIXME pcall
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    44
		local success, err = xpcall(_call, _traceback_handler);
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    45
		if success and type(err) == "number" then
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    46
			h:insert(_callback, err + now, _id); -- re-add
5898
bf9aba718c01 util/timer: Re-set params when timer is rescheduled
daurnimator <quae@daurnimator.com>
parents: 5880
diff changeset
    47
			params[_id] = _param;
2095
3256c5d00901 util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents: 1871
diff changeset
    48
		end
3256c5d00901 util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents: 1871
diff changeset
    49
	end
3256c5d00901 util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents: 1871
diff changeset
    50
6934
5c2c8aeb4690 util.timer: Expire timer instance if another instance is already set to take care of the next scheduled event
Kim Alvefur <zash@zash.se>
parents: 6933
diff changeset
    51
	if peek ~= nil and _active_timers > 1 and peek == next_time then
5c2c8aeb4690 util.timer: Expire timer instance if another instance is already set to take care of the next scheduled event
Kim Alvefur <zash@zash.se>
parents: 6933
diff changeset
    52
		-- Another instance of _on_timer already set next_time to the same value,
5c2c8aeb4690 util.timer: Expire timer instance if another instance is already set to take care of the next scheduled event
Kim Alvefur <zash@zash.se>
parents: 6933
diff changeset
    53
		-- so it should be safe to not renew this timer event
5c2c8aeb4690 util.timer: Expire timer instance if another instance is already set to take care of the next scheduled event
Kim Alvefur <zash@zash.se>
parents: 6933
diff changeset
    54
		peek = nil;
5c2c8aeb4690 util.timer: Expire timer instance if another instance is already set to take care of the next scheduled event
Kim Alvefur <zash@zash.se>
parents: 6933
diff changeset
    55
	else
5c2c8aeb4690 util.timer: Expire timer instance if another instance is already set to take care of the next scheduled event
Kim Alvefur <zash@zash.se>
parents: 6933
diff changeset
    56
		next_time = peek;
5c2c8aeb4690 util.timer: Expire timer instance if another instance is already set to take care of the next scheduled event
Kim Alvefur <zash@zash.se>
parents: 6933
diff changeset
    57
	end
5c2c8aeb4690 util.timer: Expire timer instance if another instance is already set to take care of the next scheduled event
Kim Alvefur <zash@zash.se>
parents: 6933
diff changeset
    58
5c2c8aeb4690 util.timer: Expire timer instance if another instance is already set to take care of the next scheduled event
Kim Alvefur <zash@zash.se>
parents: 6933
diff changeset
    59
	if peek then
5c2c8aeb4690 util.timer: Expire timer instance if another instance is already set to take care of the next scheduled event
Kim Alvefur <zash@zash.se>
parents: 6933
diff changeset
    60
		-- peek is the time of the next event
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    61
		return peek - now;
2095
3256c5d00901 util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents: 1871
diff changeset
    62
	end
6933
58e260832334 util.timer: Keep count of how many timer instances are active
Kim Alvefur <zash@zash.se>
parents: 6839
diff changeset
    63
	_active_timers = _active_timers - 1;
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    64
end
6794
e813e8cf6046 Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 6484 6780
diff changeset
    65
local function add_task(delay, callback, param)
6839
9f45f0fe5aef util.timer: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 6794
diff changeset
    66
	local current_time = get_time();
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    67
	local event_time = current_time + delay;
5776
bd0ff8ae98a8 Remove all trailing whitespace
Florian Zeitz <florob@babelmonkeys.de>
parents: 4871
diff changeset
    68
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    69
	local id = h:insert(callback, event_time);
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    70
	params[id] = param;
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    71
	if next_time == nil or event_time < next_time then
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    72
		next_time = event_time;
6935
f5fd2c5cdf28 util.timer: If possible, close the existing timer handle in order to have only one
Kim Alvefur <zash@zash.se>
parents: 6934
diff changeset
    73
		if _server_timer then
f5fd2c5cdf28 util.timer: If possible, close the existing timer handle in order to have only one
Kim Alvefur <zash@zash.se>
parents: 6934
diff changeset
    74
			_server_timer:close();
f5fd2c5cdf28 util.timer: If possible, close the existing timer handle in order to have only one
Kim Alvefur <zash@zash.se>
parents: 6934
diff changeset
    75
			_server_timer = nil;
f5fd2c5cdf28 util.timer: If possible, close the existing timer handle in order to have only one
Kim Alvefur <zash@zash.se>
parents: 6934
diff changeset
    76
		else
f5fd2c5cdf28 util.timer: If possible, close the existing timer handle in order to have only one
Kim Alvefur <zash@zash.se>
parents: 6934
diff changeset
    77
			_active_timers = _active_timers + 1;
2095
3256c5d00901 util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents: 1871
diff changeset
    78
		end
6935
f5fd2c5cdf28 util.timer: If possible, close the existing timer handle in order to have only one
Kim Alvefur <zash@zash.se>
parents: 6934
diff changeset
    79
		_server_timer = _add_task(next_time - current_time, _on_timer);
6839
9f45f0fe5aef util.timer: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 6794
diff changeset
    80
	end
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    81
	return id;
6839
9f45f0fe5aef util.timer: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 6794
diff changeset
    82
end
6794
e813e8cf6046 Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 6484 6780
diff changeset
    83
local function stop(id)
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    84
	params[id] = nil;
7018
17e275e8bd79 util.timer: Reschedule timers from stop() if the next pending event is stopped
Kim Alvefur <zash@zash.se>
parents: 6935
diff changeset
    85
	local result, item, result_sync = h:remove(id);
17e275e8bd79 util.timer: Reschedule timers from stop() if the next pending event is stopped
Kim Alvefur <zash@zash.se>
parents: 6935
diff changeset
    86
	local peek = h:peek();
17e275e8bd79 util.timer: Reschedule timers from stop() if the next pending event is stopped
Kim Alvefur <zash@zash.se>
parents: 6935
diff changeset
    87
	if peek ~= next_time and _server_timer then
17e275e8bd79 util.timer: Reschedule timers from stop() if the next pending event is stopped
Kim Alvefur <zash@zash.se>
parents: 6935
diff changeset
    88
		next_time = peek;
17e275e8bd79 util.timer: Reschedule timers from stop() if the next pending event is stopped
Kim Alvefur <zash@zash.se>
parents: 6935
diff changeset
    89
		_server_timer:close();
17e275e8bd79 util.timer: Reschedule timers from stop() if the next pending event is stopped
Kim Alvefur <zash@zash.se>
parents: 6935
diff changeset
    90
		if next_time ~= nil then
8765
2f8523bf7ff2 util.timer: Ensure we don't try to schedule negative timeouts (which rightly upset libevent). Fixes #1135
Matthew Wild <mwild1@gmail.com>
parents: 8688
diff changeset
    91
			_server_timer = _add_task(math_max(next_time - get_time(), 0), _on_timer);
2095
3256c5d00901 util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents: 1871
diff changeset
    92
		end
3256c5d00901 util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents: 1871
diff changeset
    93
	end
7018
17e275e8bd79 util.timer: Reschedule timers from stop() if the next pending event is stopped
Kim Alvefur <zash@zash.se>
parents: 6935
diff changeset
    94
	return result, item, result_sync;
6839
9f45f0fe5aef util.timer: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 6794
diff changeset
    95
end
6794
e813e8cf6046 Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 6484 6780
diff changeset
    96
local function reschedule(id, delay)
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    97
	local current_time = get_time();
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    98
	local event_time = current_time + delay;
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
    99
	h:reprioritize(id, delay);
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
   100
	if next_time == nil or event_time < next_time then
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
   101
		next_time = event_time;
5878
2b1c0c0a2ea6 util.timer: Fix variable name typo.
Waqas Hussain <waqas20@gmail.com>
parents: 5877
diff changeset
   102
		_add_task(next_time - current_time, _on_timer);
6839
9f45f0fe5aef util.timer: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 6794
diff changeset
   103
	end
5877
615a0774e4cc util.timer: Updated to use util.indexedbheap to provide a more complete API. Timers can now be stopped or rescheduled. Callbacks are now pcall'd. Adding/removing timers from within timer callbacks works better. Optional parameter can be passed when creating timer which gets passed to callback, eliminating the need for closures in various timer uses. Timers are now much more lightweight.
Waqas Hussain <waqas20@gmail.com>
parents: 5776
diff changeset
   104
	return id;
832
282ae70db19f Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   105
end
282ae70db19f Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff changeset
   106
8688
2548111e71d6 util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
   107
local function sleep(s)
2548111e71d6 util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
   108
	local wait, done = async.waiter();
2548111e71d6 util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
   109
	add_task(s, done);
2548111e71d6 util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
   110
	wait();
2548111e71d6 util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
   111
end
2548111e71d6 util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
   112
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
   113
return {
6794
e813e8cf6046 Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 6484 6780
diff changeset
   114
	add_task = add_task;
e813e8cf6046 Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 6484 6780
diff changeset
   115
	stop = stop;
e813e8cf6046 Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 6484 6780
diff changeset
   116
	reschedule = reschedule;
8688
2548111e71d6 util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents: 8558
diff changeset
   117
	sleep = sleep;
6780
5de6b93d0190 util.*: Remove use of module() function, make all module functions local and return them in a table at the end
Kim Alvefur <zash@zash.se>
parents: 5776
diff changeset
   118
};
6794
e813e8cf6046 Merge 0.10->trunk
Kim Alvefur <zash@zash.se>
parents: 6484 6780
diff changeset
   119