changeset 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 19cc55690fd7
children bf685f1a545f
files timers.pl
diffstat 1 files changed, 16 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/timers.pl	Sun Dec 07 14:50:27 2008 +0000
+++ b/timers.pl	Wed Dec 10 22:35:48 2008 +0000
@@ -15,6 +15,7 @@
 use warnings;
 use strict;
 
+my $genid = 0;
 my @timers_once;
 my @timers_repeat;
 
@@ -23,17 +24,19 @@
 
 	my $one_shot = {};
 
+	$one_shot->{id} = $genid++;
 	$one_shot->{stamp} = time();
 	$one_shot->{offset} = $offset;
 	$one_shot->{coderef} = $coderef;
 
-	return push(@timers_once, $one_shot) - 1;
+	push(@timers_once, $one_shot);
+	return $one_shot->{id};
 }
 
 sub del_one_shot_timer {
 	my ($timer_id) = shift;
 
-	splice(@timers_once, $timer_id, 1);
+	@timers_once = grep { $_->{id} ne $timer_id } @timers_once;
 }
 
 
@@ -42,28 +45,31 @@
 
 	my $repeat = {};
 
+	$repeat->{id} = $genid++;
 	$repeat->{last} = time();
 	$repeat->{every} = $every;
 	$repeat->{coderef} = $coderef;
 
-	return push(@timers_repeat, $repeat) - 1;
+	push(@timers_repeat, $repeat);
+	return $repeat->{id};
 }
 
 sub del_repeat_timer {
 	my ($timer_id) = shift;
 
-	splice(@timers_repeat, $timer_id, 1);
+	@timers_repeat = grep { $_->{id} ne $timer_id } @timers_repeat;
 }
 
 sub get_one_shot_timer {
 	my ($id) = shift;
-	return $timers_once[$id];
+
+	return grep { $_->{id} eq $id } @timers_once;
 }
 
 sub get_repeat_timer {
 	my ($id) = shift;
 
-	return $timers_repeat[$id];
+	return grep { $_->{id} eq $id } @timers_repeat;
 }
 
 sub do_timers_once {
@@ -78,8 +84,9 @@
 		$timer = $timers_once[$timer_id];
 
 		if ($now >= $timer->{stamp} + $timer->{offset}) {
-			&{ $timer->{coderef} }($timer_id, $self);
-			del_one_shot_timer($timer_id);
+			&{ $timer->{coderef} }($timer->{id}, $self);
+			splice(@timers_once, $timer_id, 1);
+			$timer_id--;
 		}
 	}
 }
@@ -97,7 +104,7 @@
 		$timer = $timers_repeat[$timer_id];
 
 		if ($now >= $timer->{last} + $timer->{every}) {
-			&{ $timer->{coderef} }($timer_id, $self);
+			&{ $timer->{coderef} }($timer->{id}, $self);
 			$timer->{last} = $now;
 		}
 	}