ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro/Timer.pm
Revision: 1.73
Committed: Fri Dec 11 18:32:23 2009 UTC (14 years, 6 months ago) by root
Branch: MAIN
Changes since 1.72: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.58 Coro::Timer - timers and timeouts, independent of any event loop
4 root 1.1
5     =head1 SYNOPSIS
6    
7 root 1.8 use Coro::Timer qw(sleep timeout);
8     # nothing exported by default
9    
10     sleep 10;
11 root 1.1
12     =head1 DESCRIPTION
13    
14     This package implements a simple timer callback system which works
15 root 1.36 independent of the event loop mechanism used.
16 root 1.4
17 root 1.1 =over 4
18    
19     =cut
20    
21     package Coro::Timer;
22    
23 root 1.71 use common::sense;
24 root 1.1
25     use Carp ();
26 root 1.4 use Exporter;
27 root 1.1
28 root 1.36 use AnyEvent ();
29    
30 root 1.1 use Coro ();
31 root 1.36 use Coro::AnyEvent ();
32 root 1.1
33 root 1.73 our $VERSION = 5.21;
34 root 1.71 our @EXPORT_OK = qw(timeout sleep);
35 root 1.1
36 root 1.4 =item $flag = timeout $seconds;
37 root 1.3
38     This function will wake up the current coroutine after $seconds
39 pcg 1.14 seconds and sets $flag to true (it is false initially). If $flag goes
40 root 1.3 out of scope earlier nothing happens. This is used to implement the
41 root 1.4 C<timed_down>, C<timed_wait> etc. primitives. It is used like this:
42    
43     sub timed_wait {
44     my $timeout = Coro::Timer::timeout 60;
45    
46     while (condition false) {
47 root 1.34 Coro::schedule; # wait until woken up or timeout
48 root 1.4 return 0 if $timeout; # timed out
49     }
50 root 1.34
51 root 1.4 return 1; # condition satisfied
52     }
53 root 1.3
54     =cut
55    
56     sub timeout($) {
57     my $current = $Coro::current;
58 root 1.33 my $timeout;
59     bless {
60 root 1.70 timer => (AE::timer $_[0], 0, sub {
61 root 1.33 $timeout = 1;
62     $current->ready;
63     }),
64     timeout => \$timeout,
65     }, "Coro::Timer::Timeout";
66 root 1.3 }
67    
68 root 1.33 package Coro::Timer::Timeout;
69 root 1.9
70 root 1.33 sub bool { ${$_[0]{timeout}} }
71 root 1.3
72     use overload 'bool' => \&bool, '0+' => \&bool;
73    
74     package Coro::Timer;
75    
76 root 1.4 =item sleep $seconds
77    
78     This function works like the built-in sleep, except maybe more precise
79     and, most important, without blocking other coroutines.
80    
81     =cut
82    
83     sub sleep {
84 root 1.70 my $timer = AE::timer $_[0], 0, Coro::rouse_cb;
85 root 1.57 Coro::rouse_wait;
86 root 1.1 }
87    
88     1;
89    
90     =back
91    
92     =head1 AUTHOR
93    
94 root 1.23 Marc Lehmann <schmorp@schmorp.de>
95 root 1.21 http://home.schmorp.de/
96 root 1.1
97     =cut
98