ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Event/Event.pm
Revision: 1.49
Committed: Tue Oct 9 22:29:27 2007 UTC (16 years, 9 months ago) by root
Branch: MAIN
Changes since 1.48: +4 -15 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3     Coro::Event - do events the coro-way
4    
5     =head1 SYNOPSIS
6    
7     use Coro;
8     use Coro::Event;
9    
10     sub keyboard : Coro {
11 pcg 1.21 my $w = Coro::Event->io(fd => \*STDIN, poll => 'r');
12 root 1.1 while() {
13     print "cmd> ";
14     my $ev = $w->next; my $cmd = <STDIN>;
15     unloop unless $cmd ne "";
16     print "data> ";
17     my $ev = $w->next; my $data = <STDIN>;
18     }
19     }
20    
21 root 1.8 loop;
22 root 1.1
23 root 1.47 # wait for input on stdin for one second
24    
25     Coro::Event::do_io (fd => \*STDIN, timeout => 1) & Event::Watcher::R
26     or die "no input received";
27    
28 root 1.1 =head1 DESCRIPTION
29    
30     This module enables you to create programs using the powerful Event model
31     (and module), while retaining the linear style known from simple or
32     threaded programs.
33    
34     This module provides a method and a function for every watcher type
35     (I<flavour>) (see L<Event>). The only difference between these and the
36     watcher constructors from Event is that you do not specify a callback
37     function - it will be managed by this module.
38    
39     Your application should just create all necessary coroutines and then call
40 root 1.12 Coro::Event::loop.
41 root 1.1
42 root 1.37 Please note that even programs or modules (such as
43     L<Coro::Handle|Coro::Handle>) that use "traditional"
44     event-based/continuation style will run more efficient with this module
45     then when using only Event.
46    
47 root 1.42 =head1 WARNING
48    
49     Please note that Event does not support coroutines or threads. That
50     means that you B<MUST NOT> block in an event callback. Again: In Event
51     callbacks, you I<must never ever> call a Coroutine fucntion that blocks
52     the current coroutine.
53    
54     While this seems to work superficially, it will eventually cause memory
55     corruption.
56    
57 root 1.45 =head1 SEMANTICS
58    
59 root 1.46 Whenever Event blocks (e.g. in a call to C<one_event>, C<loop> etc.),
60 root 1.45 this module cede's to all other coroutines with the same or higher
61     priority. When any coroutines of lower priority are ready, it will not
62     block but run one of them and then check for events.
63    
64     The effect is that coroutines with the same or higher priority than
65     the blocking coroutine will keep Event from checking for events, while
66     coroutines with lower priority are being run, but Event checks for new
67     events after every cede.
68    
69 root 1.42 =head1 FUNCTIONS
70    
71 root 1.1 =over 4
72    
73     =cut
74    
75     package Coro::Event;
76    
77 root 1.42 no warnings;
78 root 1.1
79     use Carp;
80 root 1.30 no warnings;
81 root 1.1
82     use Coro;
83 root 1.40 use Coro::Timer;
84 root 1.8 use Event qw(loop unloop); # we are re-exporting this, cooool!
85 root 1.1
86 root 1.30 use XSLoader;
87 root 1.1
88 root 1.30 use base Exporter::;
89    
90 root 1.41 our @EXPORT = qw(loop unloop sweep);
91 root 1.1
92 root 1.2 BEGIN {
93 root 1.48 our $VERSION = '2.1';
94 root 1.2
95 root 1.13 local $^W = 0; # avoid redefine warning for Coro::ready;
96 root 1.30 XSLoader::load __PACKAGE__, $VERSION;
97 root 1.2 }
98 root 1.1
99 root 1.42 =item $w = Coro::Event->flavour (args...)
100 root 1.1
101     Create and return a watcher of the given type.
102    
103     Examples:
104    
105     my $reader = Coro::Event->io(fd => $filehandle, poll => 'r');
106     $reader->next;
107    
108     =cut
109    
110     =item $w->next
111    
112 root 1.47 Wait for and return the next event of the event queue of the watcher. The
113     returned event objects support two methods only: C<hits> and C<got>, both
114     of which return integers: the number this watcher was hit for this event,
115     and the mask of poll events received.
116 root 1.1
117     =cut
118    
119 root 1.42 =item do_flavour args...
120 root 1.1
121 root 1.47 Create a watcher of the given type and immediately call it's next method,
122     returning the event.
123    
124     This is less efficient then calling the constructor once and the next
125     method often, but it does save typing sometimes.
126 root 1.1
127     =cut
128    
129     for my $flavour (qw(idle var timer io signal)) {
130     push @EXPORT, "do_$flavour";
131     my $new = \&{"Event::$flavour"};
132     my $class = "Coro::Event::$flavour";
133 root 1.2 my $type = $flavour eq "io" ? 1 : 0;
134 root 1.1 @{"${class}::ISA"} = (Coro::Event::, "Event::$flavour");
135     my $coronew = sub {
136     # how does one do method-call-by-name?
137     # my $w = $class->SUPER::$flavour(@_);
138    
139 root 1.10 shift eq Coro::Event::
140 root 1.1 or croak "event constructor \"Coro::Event->$flavour\" must be called as a static method";
141    
142 root 1.10 my $w = $new->($class,
143 root 1.49 desc => $flavour,
144     @_,
145     parked => 1,
146 root 1.1 );
147 root 1.43
148     _install_std_cb $w, $type;
149    
150     # reblessing due to Event being broken
151     bless $w, $class
152 root 1.1 };
153     *{ $flavour } = $coronew;
154     *{"do_$flavour"} = sub {
155     unshift @_, Coro::Event::;
156 root 1.49 next_cancel (&$coronew);
157 root 1.1 };
158     }
159    
160 root 1.47 sub Coro::Event::Event::hits { $_[0][3] }
161     sub Coro::Event::Event::got { $_[0][4] }
162 root 1.1
163     =item sweep
164    
165     Similar to Event::one_event and Event::sweep: The idle task is called once
166     (this has the effect of jumping back into the Event loop once to serve new
167     events).
168    
169     The reason this function exists is that you sometimes want to serve events
170     while doing other work. Calling C<Coro::cede> does not work because
171     C<cede> implies that the current coroutine is runnable and does not call
172     into the Event dispatcher.
173    
174     =cut
175    
176     sub sweep {
177 root 1.42 Event::one_event 0; # for now
178 root 1.1 }
179    
180     =item $result = loop([$timeout])
181    
182     This is the version of C<loop> you should use instead of C<Event::loop>
183     when using this module - it will ensure correct scheduling in the presence
184     of events.
185    
186     =item unloop([$result])
187    
188     Same as Event::unloop (provided here for your convinience only).
189    
190     =cut
191    
192 root 1.40 $Coro::idle = \&Event::one_event; # inefficient
193 root 1.9
194 root 1.1 1;
195    
196 root 1.36 =back
197    
198 root 1.1 =head1 AUTHOR
199    
200 root 1.27 Marc Lehmann <schmorp@schmorp.de>
201 root 1.25 http://home.schmorp.de/
202 root 1.1
203     =cut
204