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