ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Event/Event.pm
Revision: 1.41
Committed: Fri Dec 1 02:17:37 2006 UTC (17 years, 7 months ago) by root
Branch: MAIN
Changes since 1.40: +4 -2 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     =head1 DESCRIPTION
24    
25     This module enables you to create programs using the powerful Event model
26     (and module), while retaining the linear style known from simple or
27     threaded programs.
28    
29     This module provides a method and a function for every watcher type
30     (I<flavour>) (see L<Event>). The only difference between these and the
31     watcher constructors from Event is that you do not specify a callback
32     function - it will be managed by this module.
33    
34     Your application should just create all necessary coroutines and then call
35 root 1.12 Coro::Event::loop.
36 root 1.1
37 root 1.37 Please note that even programs or modules (such as
38     L<Coro::Handle|Coro::Handle>) that use "traditional"
39     event-based/continuation style will run more efficient with this module
40     then when using only Event.
41    
42 root 1.1 =over 4
43    
44     =cut
45    
46     package Coro::Event;
47    
48 pcg 1.18 BEGIN { eval { require warnings } && warnings->unimport ("uninitialized") }
49 root 1.1
50     use Carp;
51 root 1.30 no warnings;
52 root 1.1
53     use Coro;
54 root 1.40 use Coro::Timer;
55 root 1.8 use Event qw(loop unloop); # we are re-exporting this, cooool!
56 root 1.1
57 root 1.30 use XSLoader;
58 root 1.1
59 root 1.30 use base Exporter::;
60    
61 root 1.41 our @EXPORT = qw(loop unloop sweep);
62 root 1.1
63 root 1.2 BEGIN {
64 root 1.35 our $VERSION = 1.9;
65 root 1.2
66 root 1.13 local $^W = 0; # avoid redefine warning for Coro::ready;
67 root 1.30 XSLoader::load __PACKAGE__, $VERSION;
68 root 1.2 }
69 root 1.1
70     =item $w = Coro::Event->flavour(args...)
71    
72     Create and return a watcher of the given type.
73    
74     Examples:
75    
76     my $reader = Coro::Event->io(fd => $filehandle, poll => 'r');
77     $reader->next;
78    
79     =cut
80    
81     =item $w->next
82    
83     Return the next event of the event queue of the watcher.
84    
85     =cut
86    
87     =item do_flavour(args...)
88    
89     Create a watcher of the given type and immediately call it's next
90     method. This is less efficient then calling the constructor once and the
91     next method often, but it does save typing sometimes.
92    
93     =cut
94    
95     for my $flavour (qw(idle var timer io signal)) {
96     push @EXPORT, "do_$flavour";
97     my $new = \&{"Event::$flavour"};
98     my $class = "Coro::Event::$flavour";
99 root 1.2 my $type = $flavour eq "io" ? 1 : 0;
100 root 1.1 @{"${class}::ISA"} = (Coro::Event::, "Event::$flavour");
101     my $coronew = sub {
102     # how does one do method-call-by-name?
103     # my $w = $class->SUPER::$flavour(@_);
104    
105 root 1.10 shift eq Coro::Event::
106 root 1.1 or croak "event constructor \"Coro::Event->$flavour\" must be called as a static method";
107    
108 root 1.10 my $w = $new->($class,
109 root 1.1 desc => $flavour,
110     @_,
111 root 1.2 parked => 1,
112 root 1.1 );
113 root 1.2 _install_std_cb($w, $type);
114 root 1.1 bless $w, $class; # reblessing due to broken Event
115     };
116     *{ $flavour } = $coronew;
117     *{"do_$flavour"} = sub {
118     unshift @_, Coro::Event::;
119     my $e = (&$coronew)->next;
120 pcg 1.20 $e->cancel; # $e === $e->w
121 root 1.1 $e;
122     };
123     }
124    
125 root 1.2 # double calls to avoid stack-cloning ;()
126 root 1.3 # is about 10% slower, though.
127 root 1.2 sub next($) {
128 root 1.41 &Coro::schedule while &_next;
129    
130     $_[0]
131 root 1.1 }
132 root 1.2
133 root 1.4 sub Coro::Event::w { $_[0] }
134 root 1.5 sub Coro::Event::prio { $_[0]{Coro::Event}[3] }
135     sub Coro::Event::hits { $_[0]{Coro::Event}[4] }
136     sub Coro::Event::got { $_[0]{Coro::Event}[5] }
137 root 1.1
138     =item sweep
139    
140     Similar to Event::one_event and Event::sweep: The idle task is called once
141     (this has the effect of jumping back into the Event loop once to serve new
142     events).
143    
144     The reason this function exists is that you sometimes want to serve events
145     while doing other work. Calling C<Coro::cede> does not work because
146     C<cede> implies that the current coroutine is runnable and does not call
147     into the Event dispatcher.
148    
149     =cut
150    
151     sub sweep {
152 root 1.7 Event::one_event(0); # for now
153 root 1.1 }
154    
155     =item $result = loop([$timeout])
156    
157     This is the version of C<loop> you should use instead of C<Event::loop>
158     when using this module - it will ensure correct scheduling in the presence
159     of events.
160    
161     =item unloop([$result])
162    
163     Same as Event::unloop (provided here for your convinience only).
164    
165     =cut
166    
167 root 1.40 $Coro::idle = \&Event::one_event; # inefficient
168 root 1.9
169 root 1.1 1;
170    
171 root 1.36 =back
172    
173 root 1.1 =head1 AUTHOR
174    
175 root 1.27 Marc Lehmann <schmorp@schmorp.de>
176 root 1.25 http://home.schmorp.de/
177 root 1.1
178     =cut
179