Wed, 07 Apr 2010 21:00:20 +0100
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.
1523
841d61be198f
Remove version number from copyright headers
Matthew Wild <mwild1@gmail.com>
parents:
894
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; |