Software /
code /
prosody
Annotate
util/timer.lua @ 8762:2f8523bf7ff2
util.timer: Ensure we don't try to schedule negative timeouts (which rightly upset libevent). Fixes #1135
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Sun, 29 Apr 2018 21:43:39 +0100 |
parent | 8685:2548111e71d6 |
child | 8995:2e6f7ab97794 |
rev | line source |
---|---|
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"; |
7988
dc758422d896
util.statistics,statsd,throttle,timer: Replace dependency on LuaSockect with util.time for precision time
Kim Alvefur <zash@zash.se>
parents:
6777
diff
changeset
|
12 local get_time = require "util.time".now |
8685
2548111e71d6
util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents:
8555
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; |
8762
2f8523bf7ff2
util.timer: Ensure we don't try to schedule negative timeouts (which rightly upset libevent). Fixes #1135
Matthew Wild <mwild1@gmail.com>
parents:
8685
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 |
6777
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; |
8555
4f0f5b49bb03
vairious: Add annotation when an empty environment is set [luacheck]
Kim Alvefur <zash@zash.se>
parents:
7989
diff
changeset
|
21 -- luacheck: std none |
832
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
22 |
6481
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 |
6932
f5fd2c5cdf28
util.timer: If possible, close the existing timer handle in order to have only one
Kim Alvefur <zash@zash.se>
parents:
6931
diff
changeset
|
25 local _server_timer; |
6930
58e260832334
util.timer: Keep count of how many timer instances are active
Kim Alvefur <zash@zash.se>
parents:
6836
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 |
6931
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:
6930
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:
6930
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:
6930
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:
6930
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:
6930
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:
6930
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:
6930
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:
6930
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:
6930
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:
6930
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 |
6930
58e260832334
util.timer: Keep count of how many timer instances are active
Kim Alvefur <zash@zash.se>
parents:
6836
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 |
6791 | 65 local function add_task(delay, callback, param) |
6836 | 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; |
6932
f5fd2c5cdf28
util.timer: If possible, close the existing timer handle in order to have only one
Kim Alvefur <zash@zash.se>
parents:
6931
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:
6931
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:
6931
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:
6931
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:
6931
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 |
6932
f5fd2c5cdf28
util.timer: If possible, close the existing timer handle in order to have only one
Kim Alvefur <zash@zash.se>
parents:
6931
diff
changeset
|
79 _server_timer = _add_task(next_time - current_time, _on_timer); |
6836 | 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; |
6836 | 82 end |
6791 | 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; |
7015
17e275e8bd79
util.timer: Reschedule timers from stop() if the next pending event is stopped
Kim Alvefur <zash@zash.se>
parents:
6932
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:
6932
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:
6932
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:
6932
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:
6932
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:
6932
diff
changeset
|
90 if next_time ~= nil then |
8762
2f8523bf7ff2
util.timer: Ensure we don't try to schedule negative timeouts (which rightly upset libevent). Fixes #1135
Matthew Wild <mwild1@gmail.com>
parents:
8685
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 |
7015
17e275e8bd79
util.timer: Reschedule timers from stop() if the next pending event is stopped
Kim Alvefur <zash@zash.se>
parents:
6932
diff
changeset
|
94 return result, item, result_sync; |
6836 | 95 end |
6791 | 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); |
6836 | 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 |
8685
2548111e71d6
util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
107 local function sleep(s) |
2548111e71d6
util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
108 local wait, done = async.waiter(); |
2548111e71d6
util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
109 add_task(s, done); |
2548111e71d6
util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
110 wait(); |
2548111e71d6
util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
111 end |
2548111e71d6
util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
112 |
6777
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 { |
6791 | 114 add_task = add_task; |
115 stop = stop; | |
116 reschedule = reschedule; | |
8685
2548111e71d6
util.timer: Move sleep() here from util.async
Kim Alvefur <zash@zash.se>
parents:
8555
diff
changeset
|
117 sleep = sleep; |
6777
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 }; |
6791 | 119 |