Comparison

util/timer.lua @ 6791:e813e8cf6046

Merge 0.10->trunk
author Kim Alvefur <zash@zash.se>
date Thu, 20 Aug 2015 13:05:22 +0200
parent 6481:dbc72cd1332e
parent 6777:5de6b93d0190
child 6836:9f45f0fe5aef
comparison
equal deleted inserted replaced
6776:4412a2307c89 6791:e813e8cf6046
13 local type = type; 13 local type = type;
14 local debug_traceback = debug.traceback; 14 local debug_traceback = debug.traceback;
15 local tostring = tostring; 15 local tostring = tostring;
16 local xpcall = xpcall; 16 local xpcall = xpcall;
17 17
18 module "timer" 18 local _ENV = nil;
19 19
20 local _add_task = server.add_task; 20 local _add_task = server.add_task;
21 --add_task = _add_task;
22 21
23 local h = indexedbheap.create(); 22 local h = indexedbheap.create();
24 local params = {}; 23 local params = {};
25 local next_time = nil; 24 local next_time = nil;
26 local _id, _callback, _now, _param; 25 local _id, _callback, _now, _param;
39 --item(now, id, _param); -- FIXME pcall 38 --item(now, id, _param); -- FIXME pcall
40 local success, err = xpcall(_call, _traceback_handler); 39 local success, err = xpcall(_call, _traceback_handler);
41 if success and type(err) == "number" then 40 if success and type(err) == "number" then
42 h:insert(_callback, err + now, _id); -- re-add 41 h:insert(_callback, err + now, _id); -- re-add
43 params[_id] = _param; 42 params[_id] = _param;
43 end
44 end 44 end
45 end
46 next_time = peek; 45 next_time = peek;
47 if peek ~= nil then 46 if peek ~= nil then
48 return peek - now; 47 return peek - now;
49 end 48 end
50 end 49 end
51 function add_task(delay, callback, param) 50 local function add_task(delay, callback, param)
52 local current_time = get_time(); 51 local current_time = get_time();
53 local event_time = current_time + delay; 52 local event_time = current_time + delay;
54 53
55 local id = h:insert(callback, event_time); 54 local id = h:insert(callback, event_time);
56 params[id] = param; 55 params[id] = param;
57 if next_time == nil or event_time < next_time then 56 if next_time == nil or event_time < next_time then
58 next_time = event_time; 57 next_time = event_time;
59 _add_task(next_time - current_time, _on_timer); 58 _add_task(next_time - current_time, _on_timer);
60 end 59 end
61 return id; 60 return id;
62 end 61 end
63 function stop(id) 62 local function stop(id)
64 params[id] = nil; 63 params[id] = nil;
65 return h:remove(id); 64 return h:remove(id);
66 end 65 end
67 function reschedule(id, delay) 66 local function reschedule(id, delay)
68 local current_time = get_time(); 67 local current_time = get_time();
69 local event_time = current_time + delay; 68 local event_time = current_time + delay;
70 h:reprioritize(id, delay); 69 h:reprioritize(id, delay);
71 if next_time == nil or event_time < next_time then 70 if next_time == nil or event_time < next_time then
72 next_time = event_time; 71 next_time = event_time;
73 _add_task(next_time - current_time, _on_timer); 72 _add_task(next_time - current_time, _on_timer);
74 end 73 end
75 return id; 74 return id;
76 end 75 end
77 76
78 return _M; 77 return {
78 add_task = add_task;
79 stop = stop;
80 reschedule = reschedule;
81 };
82