Mercurial > hg > skillbot
comparison timers.pl @ 41:2f9832b6dede
Changing IDs to be assigned incrementally instead of array indexes
author | Dominic Cleal <dominic@computerkb.co.uk> |
---|---|
date | Wed, 10 Dec 2008 22:35:48 +0000 |
parents | d6521d5ea884 |
children |
comparison
equal
deleted
inserted
replaced
40:19cc55690fd7 | 41:2f9832b6dede |
---|---|
13 =cut | 13 =cut |
14 | 14 |
15 use warnings; | 15 use warnings; |
16 use strict; | 16 use strict; |
17 | 17 |
18 my $genid = 0; | |
18 my @timers_once; | 19 my @timers_once; |
19 my @timers_repeat; | 20 my @timers_repeat; |
20 | 21 |
21 sub add_one_shot_timer { | 22 sub add_one_shot_timer { |
22 my ($offset, $coderef) = @_; | 23 my ($offset, $coderef) = @_; |
23 | 24 |
24 my $one_shot = {}; | 25 my $one_shot = {}; |
25 | 26 |
27 $one_shot->{id} = $genid++; | |
26 $one_shot->{stamp} = time(); | 28 $one_shot->{stamp} = time(); |
27 $one_shot->{offset} = $offset; | 29 $one_shot->{offset} = $offset; |
28 $one_shot->{coderef} = $coderef; | 30 $one_shot->{coderef} = $coderef; |
29 | 31 |
30 return push(@timers_once, $one_shot) - 1; | 32 push(@timers_once, $one_shot); |
33 return $one_shot->{id}; | |
31 } | 34 } |
32 | 35 |
33 sub del_one_shot_timer { | 36 sub del_one_shot_timer { |
34 my ($timer_id) = shift; | 37 my ($timer_id) = shift; |
35 | 38 |
36 splice(@timers_once, $timer_id, 1); | 39 @timers_once = grep { $_->{id} ne $timer_id } @timers_once; |
37 } | 40 } |
38 | 41 |
39 | 42 |
40 sub add_repeat_timer { | 43 sub add_repeat_timer { |
41 my ($every, $coderef) = @_; | 44 my ($every, $coderef) = @_; |
42 | 45 |
43 my $repeat = {}; | 46 my $repeat = {}; |
44 | 47 |
48 $repeat->{id} = $genid++; | |
45 $repeat->{last} = time(); | 49 $repeat->{last} = time(); |
46 $repeat->{every} = $every; | 50 $repeat->{every} = $every; |
47 $repeat->{coderef} = $coderef; | 51 $repeat->{coderef} = $coderef; |
48 | 52 |
49 return push(@timers_repeat, $repeat) - 1; | 53 push(@timers_repeat, $repeat); |
54 return $repeat->{id}; | |
50 } | 55 } |
51 | 56 |
52 sub del_repeat_timer { | 57 sub del_repeat_timer { |
53 my ($timer_id) = shift; | 58 my ($timer_id) = shift; |
54 | 59 |
55 splice(@timers_repeat, $timer_id, 1); | 60 @timers_repeat = grep { $_->{id} ne $timer_id } @timers_repeat; |
56 } | 61 } |
57 | 62 |
58 sub get_one_shot_timer { | 63 sub get_one_shot_timer { |
59 my ($id) = shift; | 64 my ($id) = shift; |
60 return $timers_once[$id]; | 65 |
66 return grep { $_->{id} eq $id } @timers_once; | |
61 } | 67 } |
62 | 68 |
63 sub get_repeat_timer { | 69 sub get_repeat_timer { |
64 my ($id) = shift; | 70 my ($id) = shift; |
65 | 71 |
66 return $timers_repeat[$id]; | 72 return grep { $_->{id} eq $id } @timers_repeat; |
67 } | 73 } |
68 | 74 |
69 sub do_timers_once { | 75 sub do_timers_once { |
70 my ($self) = shift; | 76 my ($self) = shift; |
71 my ($timer_id, $timer); | 77 my ($timer_id, $timer); |
76 | 82 |
77 for ($timer_id = 0; $timer_id <= $#timers_once; $timer_id++) { | 83 for ($timer_id = 0; $timer_id <= $#timers_once; $timer_id++) { |
78 $timer = $timers_once[$timer_id]; | 84 $timer = $timers_once[$timer_id]; |
79 | 85 |
80 if ($now >= $timer->{stamp} + $timer->{offset}) { | 86 if ($now >= $timer->{stamp} + $timer->{offset}) { |
81 &{ $timer->{coderef} }($timer_id, $self); | 87 &{ $timer->{coderef} }($timer->{id}, $self); |
82 del_one_shot_timer($timer_id); | 88 splice(@timers_once, $timer_id, 1); |
89 $timer_id--; | |
83 } | 90 } |
84 } | 91 } |
85 } | 92 } |
86 | 93 |
87 sub do_timers_repeat { | 94 sub do_timers_repeat { |
95 | 102 |
96 for ($timer_id = 0; $timer_id <= $#timers_repeat; $timer_id++) { | 103 for ($timer_id = 0; $timer_id <= $#timers_repeat; $timer_id++) { |
97 $timer = $timers_repeat[$timer_id]; | 104 $timer = $timers_repeat[$timer_id]; |
98 | 105 |
99 if ($now >= $timer->{last} + $timer->{every}) { | 106 if ($now >= $timer->{last} + $timer->{every}) { |
100 &{ $timer->{coderef} }($timer_id, $self); | 107 &{ $timer->{coderef} }($timer->{id}, $self); |
101 $timer->{last} = $now; | 108 $timer->{last} = $now; |
102 } | 109 } |
103 } | 110 } |
104 } | 111 } |
105 | 112 |