Software /
code /
prosody
Annotate
util/timer.lua @ 2964:49b5c87d2fa0
util.timer: When using libevent hold onto the event handle to stop it being collected (and the timer stopping). Fixes BOSH ghosts, thanks Flo, niekie, waqas.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Wed, 07 Apr 2010 21:00:20 +0100 |
parent | 2925:692b3c6c5bd2 |
child | 3683:c2158221e2e6 |
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 |
832
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
4 -- |
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 |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
9 |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
10 local ns_addtimer = require "net.server".addtimer; |
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
|
11 local event = require "net.server".event; |
2098
a1ad06f1c090
util.timer: Fix libevent timers (event.base doesn't exist...)
Matthew Wild <mwild1@gmail.com>
parents:
2095
diff
changeset
|
12 local event_base = require "net.server".event_base; |
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
|
13 |
832
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
14 local get_time = os.time; |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
15 local t_insert = table.insert; |
841
77ff000c2055
util.timer: Fix crash when loaded but no tasks set, fix skipping some tasks when multiple set, and one removed
Matthew Wild <mwild1@gmail.com>
parents:
832
diff
changeset
|
16 local t_remove = table.remove; |
77ff000c2055
util.timer: Fix crash when loaded but no tasks set, fix skipping some tasks when multiple set, and one removed
Matthew Wild <mwild1@gmail.com>
parents:
832
diff
changeset
|
17 local ipairs, pairs = ipairs, pairs; |
832
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
18 local type = type; |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
19 |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
20 local data = {}; |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
21 local new_data = {}; |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
22 |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
23 module "timer" |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
24 |
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
|
25 local _add_task; |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
26 if not event then |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
27 function _add_task(delay, func) |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
28 local current_time = get_time(); |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
29 delay = delay + current_time; |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
30 if delay >= current_time then |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
31 t_insert(new_data, {delay, func}); |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
32 else |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
33 func(); |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
34 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
|
35 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
|
36 |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
37 ns_addtimer(function() |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
38 local current_time = get_time(); |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
39 if #new_data > 0 then |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
40 for _, d in pairs(new_data) do |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
41 t_insert(data, d); |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
42 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
|
43 new_data = {}; |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
44 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
|
45 |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
46 for i, d in pairs(data) do |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
47 local t, func = d[1], d[2]; |
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 if t <= current_time then |
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 data[i] = nil; |
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 local r = func(current_time); |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
51 if type(r) == "number" then _add_task(r, func); 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
|
52 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
|
53 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
|
54 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
|
55 else |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
56 local EVENT_LEAVE = (event.core and event.core.LEAVE) or -1; |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
57 function _add_task(delay, func) |
2964
49b5c87d2fa0
util.timer: When using libevent hold onto the event handle to stop it being collected (and the timer stopping). Fixes BOSH ghosts, thanks Flo, niekie, waqas.
Matthew Wild <mwild1@gmail.com>
parents:
2925
diff
changeset
|
58 local event_handle; |
49b5c87d2fa0
util.timer: When using libevent hold onto the event handle to stop it being collected (and the timer stopping). Fixes BOSH ghosts, thanks Flo, niekie, waqas.
Matthew Wild <mwild1@gmail.com>
parents:
2925
diff
changeset
|
59 event_handle = event_base:addevent(nil, 0, function () |
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
|
60 local ret = func(); |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
61 if ret then |
2366
c3a364342cb4
util.timer: Use luaevent's built-in method of repeating an event (fixes a weird crash)
Matthew Wild <mwild1@gmail.com>
parents:
2098
diff
changeset
|
62 return 0, ret; |
2964
49b5c87d2fa0
util.timer: When using libevent hold onto the event handle to stop it being collected (and the timer stopping). Fixes BOSH ghosts, thanks Flo, niekie, waqas.
Matthew Wild <mwild1@gmail.com>
parents:
2925
diff
changeset
|
63 elseif event_handle then |
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
|
64 return EVENT_LEAVE; |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
65 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
|
66 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
|
67 , delay); |
3256c5d00901
util.timer: Use libevent for lightweight timers if available and configured (use_libevent option)
Matthew Wild <mwild1@gmail.com>
parents:
1871
diff
changeset
|
68 end |
832
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
69 end |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
70 |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
71 add_task = _add_task; |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
72 |
282ae70db19f
Added util/timer.lua - a timer API
Waqas Hussain <waqas20@gmail.com>
parents:
diff
changeset
|
73 return _M; |