ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro.pm
Revision: 1.84
Committed: Sat Nov 25 00:40:26 2006 UTC (17 years, 6 months ago) by root
Branch: MAIN
Changes since 1.83: +5 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.1 =head1 NAME
2    
3 root 1.8 Coro - coroutine process abstraction
4 root 1.1
5     =head1 SYNOPSIS
6    
7     use Coro;
8    
9 root 1.8 async {
10     # some asynchronous thread of execution
11 root 1.2 };
12    
13 root 1.8 # alternatively create an async process like this:
14 root 1.6
15 root 1.8 sub some_func : Coro {
16     # some more async code
17     }
18    
19 root 1.22 cede;
20 root 1.2
21 root 1.1 =head1 DESCRIPTION
22    
23 root 1.14 This module collection manages coroutines. Coroutines are similar to
24 root 1.42 threads but don't run in parallel.
25 root 1.14
26 root 1.20 In this module, coroutines are defined as "callchain + lexical variables
27 root 1.23 + @_ + $_ + $@ + $^W + C stack), that is, a coroutine has it's own
28     callchain, it's own set of lexicals and it's own set of perl's most
29     important global variables.
30 root 1.22
31 root 1.8 =cut
32    
33     package Coro;
34    
35 root 1.71 use strict;
36     no warnings "uninitialized";
37 root 1.36
38 root 1.8 use Coro::State;
39    
40 root 1.83 use base qw(Coro::State Exporter);
41 pcg 1.55
42 root 1.83 our $idle; # idle handler
43 root 1.71 our $main; # main coroutine
44     our $current; # current coroutine
45 root 1.8
46 root 1.80 our $VERSION = '2.5';
47 root 1.8
48 root 1.71 our @EXPORT = qw(async cede schedule terminate current);
49     our %EXPORT_TAGS = (
50 root 1.31 prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)],
51     );
52 root 1.71 our @EXPORT_OK = @{$EXPORT_TAGS{prio}};
53 root 1.8
54     {
55     my @async;
56 root 1.26 my $init;
57 root 1.8
58     # this way of handling attributes simply is NOT scalable ;()
59     sub import {
60 root 1.71 no strict 'refs';
61    
62 root 1.8 Coro->export_to_level(1, @_);
63 root 1.71
64 root 1.8 my $old = *{(caller)[0]."::MODIFY_CODE_ATTRIBUTES"}{CODE};
65     *{(caller)[0]."::MODIFY_CODE_ATTRIBUTES"} = sub {
66     my ($package, $ref) = (shift, shift);
67     my @attrs;
68     for (@_) {
69     if ($_ eq "Coro") {
70     push @async, $ref;
71 root 1.26 unless ($init++) {
72     eval q{
73     sub INIT {
74     &async(pop @async) while @async;
75     }
76     };
77     }
78 root 1.8 } else {
79 root 1.17 push @attrs, $_;
80 root 1.8 }
81     }
82 root 1.17 return $old ? $old->($package, $ref, @attrs) : @attrs;
83 root 1.8 };
84     }
85    
86     }
87    
88 root 1.43 =over 4
89    
90 root 1.8 =item $main
91 root 1.2
92 root 1.8 This coroutine represents the main program.
93 root 1.1
94     =cut
95    
96 pcg 1.55 $main = new Coro;
97 root 1.8
98 root 1.19 =item $current (or as function: current)
99 root 1.1
100 root 1.83 The current coroutine (the last coroutine switched to). The initial value
101     is C<$main> (of course).
102    
103     This variable is B<strictly> I<read-only>. It is provided for performance
104     reasons. If performance is not essentiel you are encouraged to use the
105     C<Coro::current> function instead.
106 root 1.1
107 root 1.8 =cut
108    
109     # maybe some other module used Coro::Specific before...
110     if ($current) {
111     $main->{specific} = $current->{specific};
112 root 1.1 }
113    
114 pcg 1.55 $current = $main;
115 root 1.19
116     sub current() { $current }
117 root 1.9
118     =item $idle
119    
120 root 1.83 A callback that is called whenever the scheduler finds no ready coroutines
121     to run. The default implementation prints "FATAL: deadlock detected" and
122     exits.
123    
124     This hook is overwritten by modules such as C<Coro::Timer> and
125     C<Coro::Event> to wait on an external event that hopefully wakes up some
126     coroutine.
127 root 1.9
128     =cut
129    
130 root 1.83 $idle = sub {
131 root 1.9 print STDERR "FATAL: deadlock detected\n";
132 root 1.83 exit (51);
133 root 1.9 };
134 root 1.8
135 root 1.24 # this coroutine is necessary because a coroutine
136     # cannot destroy itself.
137     my @destroy;
138 root 1.38 my $manager;
139     $manager = new Coro sub {
140 pcg 1.57 while () {
141 root 1.37 # by overwriting the state object with the manager we destroy it
142     # while still being able to schedule this coroutine (in case it has
143     # been readied multiple times. this is harmless since the manager
144     # can be called as many times as neccessary and will always
145     # remove itself from the runqueue
146 root 1.40 while (@destroy) {
147     my $coro = pop @destroy;
148     $coro->{status} ||= [];
149     $_->ready for @{delete $coro->{join} || []};
150 pcg 1.59
151 root 1.83 # the next line destroys the coro state, but keeps the
152 pcg 1.59 # process itself intact (we basically make it a zombie
153     # process that always runs the manager thread, so it's possible
154     # to transfer() to this process).
155 root 1.83 $coro->_clone_state_from ($manager);
156 root 1.40 }
157 root 1.24 &schedule;
158     }
159     };
160    
161 root 1.8 # static methods. not really.
162 root 1.43
163     =back
164 root 1.8
165     =head2 STATIC METHODS
166    
167     Static methods are actually functions that operate on the current process only.
168    
169     =over 4
170    
171 root 1.13 =item async { ... } [@args...]
172 root 1.8
173     Create a new asynchronous process and return it's process object
174     (usually unused). When the sub returns the new process is automatically
175     terminated.
176    
177 root 1.79 When the coroutine dies, the program will exit, just as in the main
178     program.
179    
180 root 1.13 # create a new coroutine that just prints its arguments
181     async {
182     print "@_\n";
183     } 1,2,3,4;
184    
185 root 1.8 =cut
186    
187 root 1.13 sub async(&@) {
188     my $pid = new Coro @_;
189 root 1.24 $manager->ready; # this ensures that the stack is cloned from the manager
190 root 1.11 $pid->ready;
191     $pid;
192 root 1.8 }
193 root 1.1
194 root 1.8 =item schedule
195 root 1.6
196 root 1.8 Calls the scheduler. Please note that the current process will not be put
197     into the ready queue, so calling this function usually means you will
198     never be called again.
199 root 1.1
200     =cut
201    
202 root 1.22 =item cede
203 root 1.1
204 root 1.22 "Cede" to other processes. This function puts the current process into the
205     ready queue and calls C<schedule>, which has the effect of giving up the
206     current "timeslice" to other coroutines of the same or higher priority.
207 root 1.7
208 root 1.8 =cut
209    
210 root 1.40 =item terminate [arg...]
211 root 1.7
212 pcg 1.59 Terminates the current process with the given status values (see L<cancel>).
213 root 1.13
214 root 1.1 =cut
215    
216 root 1.8 sub terminate {
217 pcg 1.59 $current->cancel (@_);
218 root 1.1 }
219 root 1.6
220 root 1.8 =back
221    
222     # dynamic methods
223    
224     =head2 PROCESS METHODS
225    
226     These are the methods you can call on process objects.
227 root 1.6
228 root 1.8 =over 4
229    
230 root 1.13 =item new Coro \&sub [, @args...]
231 root 1.8
232     Create a new process and return it. When the sub returns the process
233 root 1.40 automatically terminates as if C<terminate> with the returned values were
234 root 1.41 called. To make the process run you must first put it into the ready queue
235     by calling the ready method.
236 root 1.13
237 root 1.6 =cut
238    
239 root 1.84 sub _new_coro {
240     # $current->_clear_idle_sp; # set the idle sp on the following cede
241     _set_cede_self; # ensures that cede cede's us first
242     cede;
243 root 1.13 terminate &{+shift};
244     }
245    
246 root 1.8 sub new {
247     my $class = shift;
248 root 1.83
249 root 1.84 $class->SUPER::new (\&_new_coro, @_)
250 root 1.8 }
251 root 1.6
252 root 1.8 =item $process->ready
253 root 1.1
254 root 1.39 Put the given process into the ready queue.
255 root 1.1
256 root 1.8 =cut
257 root 1.28
258 pcg 1.59 =item $process->cancel (arg...)
259 root 1.28
260 root 1.79 Terminates the given process and makes it return the given arguments as
261 pcg 1.59 status (default: the empty list).
262 root 1.28
263     =cut
264    
265     sub cancel {
266 pcg 1.59 my $self = shift;
267     $self->{status} = [@_];
268     push @destroy, $self;
269 root 1.28 $manager->ready;
270 pcg 1.59 &schedule if $current == $self;
271 root 1.40 }
272    
273     =item $process->join
274    
275     Wait until the coroutine terminates and return any values given to the
276 pcg 1.59 C<terminate> or C<cancel> functions. C<join> can be called multiple times
277     from multiple processes.
278 root 1.40
279     =cut
280    
281     sub join {
282     my $self = shift;
283     unless ($self->{status}) {
284     push @{$self->{join}}, $current;
285     &schedule;
286     }
287     wantarray ? @{$self->{status}} : $self->{status}[0];
288 root 1.31 }
289    
290 root 1.82 =item $oldprio = $process->prio ($newprio)
291 root 1.31
292 root 1.41 Sets (or gets, if the argument is missing) the priority of the
293     process. Higher priority processes get run before lower priority
294 root 1.52 processes. Priorities are small signed integers (currently -4 .. +3),
295 root 1.41 that you can refer to using PRIO_xxx constants (use the import tag :prio
296     to get then):
297 root 1.31
298     PRIO_MAX > PRIO_HIGH > PRIO_NORMAL > PRIO_LOW > PRIO_IDLE > PRIO_MIN
299     3 > 1 > 0 > -1 > -3 > -4
300    
301     # set priority to HIGH
302     current->prio(PRIO_HIGH);
303    
304     The idle coroutine ($Coro::idle) always has a lower priority than any
305     existing coroutine.
306    
307     Changing the priority of the current process will take effect immediately,
308     but changing the priority of processes in the ready queue (but not
309     running) will only take effect after the next schedule (of that
310     process). This is a bug that will be fixed in some future version.
311    
312 root 1.82 =item $newprio = $process->nice ($change)
313 root 1.31
314     Similar to C<prio>, but subtract the given value from the priority (i.e.
315     higher values mean lower priority, just as in unix).
316    
317 root 1.82 =item $olddesc = $process->desc ($newdesc)
318 root 1.41
319     Sets (or gets in case the argument is missing) the description for this
320     process. This is just a free-form string you can associate with a process.
321    
322     =cut
323    
324     sub desc {
325     my $old = $_[0]{desc};
326     $_[0]{desc} = $_[1] if @_ > 1;
327     $old;
328 root 1.8 }
329 root 1.1
330 root 1.8 =back
331 root 1.2
332 root 1.8 =cut
333 root 1.2
334 root 1.8 1;
335 root 1.14
336 root 1.17 =head1 BUGS/LIMITATIONS
337 root 1.14
338 root 1.52 - you must make very sure that no coro is still active on global
339 root 1.53 destruction. very bad things might happen otherwise (usually segfaults).
340 root 1.52
341     - this module is not thread-safe. You should only ever use this module
342     from the same thread (this requirement might be losened in the future
343     to allow per-thread schedulers, but Coro::State does not yet allow
344     this).
345 root 1.9
346     =head1 SEE ALSO
347    
348 root 1.67 Support/Utility: L<Coro::Cont>, L<Coro::Specific>, L<Coro::State>, L<Coro::Util>.
349    
350     Locking/IPC: L<Coro::Signal>, L<Coro::Channel>, L<Coro::Semaphore>, L<Coro::SemaphoreSet>, L<Coro::RWLock>.
351    
352     Event/IO: L<Coro::Timer>, L<Coro::Event>, L<Coro::Handle>, L<Coro::Socket>, L<Coro::Select>.
353    
354     Embedding: L<Coro:MakeMaker>
355 root 1.1
356     =head1 AUTHOR
357    
358 root 1.66 Marc Lehmann <schmorp@schmorp.de>
359 root 1.64 http://home.schmorp.de/
360 root 1.1
361     =cut
362