ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/Timer.pm
Revision: 1.2
Committed: Tue Nov 27 01:41:41 2001 UTC (22 years, 8 months ago) by root
Branch: MAIN
Changes since 1.1: +0 -5 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 =head1 NAME
2
3 Coro::Timer - simple timer package, independent of used event loops
4
5 =head1 SYNOPSIS
6
7 use Coro::Timer;
8
9 =head1 DESCRIPTION
10
11 This package implements a simple timer callback system which works
12 independent of the event loop mechanism used. If no event mechanism is
13 used, it is emulated. The C<Coro::Event> module overwrites functions with
14 versions better suited.
15
16 =over 4
17
18 =cut
19
20 package Coro::Timer;
21
22 no warnings qw(uninitialized);
23
24 use Carp ();
25
26 use Coro ();
27
28 BEGIN { eval "use Time::HiRes 'time'" }
29
30 $VERSION = 0.52;
31
32 =item $timer = new Coro::Timer at/after => xxx, cb => \&yyy;
33
34 Create a new timer.
35
36 =cut
37
38 sub new {
39 my $class = shift;
40 my %arg = @_;
41
42 $arg{at} = time + delete $arg{after} if exists $arg{after};
43
44 _new_timer($class, $arg{at}, $arg{cb});
45 }
46
47 my $timer;
48 my @timer;
49
50 unless ($override) {
51 $override = 1;
52 *_new_timer = sub {
53 my $self = bless [$_[1], $_[2]], $_[0];
54
55 # my version of rapid prototyping. guys, use a real event module!
56 @timer = sort { $a->[0] cmp $b->[0] } @timer, $self;
57
58 unless ($timer) {
59 $timer = new Coro sub {
60 my $NOW = time;
61 while (@timer) {
62 Coro::cede;
63 if ($NOW >= $timer[0][0]) {
64 my $next = shift @timer;
65 $next->[1] and $next->[1]->();
66 } else {
67 select undef, undef, undef, $timer[0][0] - $NOW;
68 $NOW = time;
69 }
70 };
71 undef $timer;
72 };
73 $timer->prio(Coro::PRIO_MIN);
74 $timer->ready;
75 }
76
77 $self;
78 };
79
80 *cancel = sub {
81 undef $_[0][1];
82 };
83 }
84
85 =item $timer->cancel
86
87 Cancel the timer (the callback will no longer be called).
88
89 =cut
90
91 1;
92
93 =back
94
95 =head1 AUTHOR
96
97 Marc Lehmann <pcg@goof.com>
98 http://www.goof.com/pcg/marc/
99
100 =cut
101