ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro.pm
Revision: 1.83
Committed: Fri Nov 24 15:34:33 2006 UTC (17 years, 6 months ago) by root
Branch: MAIN
CVS Tags: stack_sharing
Changes since 1.82: +21 -25 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.13 sub _newcoro {
240     terminate &{+shift};
241     }
242    
243 root 1.8 sub new {
244     my $class = shift;
245 root 1.83
246     $class->SUPER::new (\&_newcoro, @_)
247 root 1.8 }
248 root 1.6
249 root 1.8 =item $process->ready
250 root 1.1
251 root 1.39 Put the given process into the ready queue.
252 root 1.1
253 root 1.8 =cut
254 root 1.28
255 pcg 1.59 =item $process->cancel (arg...)
256 root 1.28
257 root 1.79 Terminates the given process and makes it return the given arguments as
258 pcg 1.59 status (default: the empty list).
259 root 1.28
260     =cut
261    
262     sub cancel {
263 pcg 1.59 my $self = shift;
264     $self->{status} = [@_];
265     push @destroy, $self;
266 root 1.28 $manager->ready;
267 pcg 1.59 &schedule if $current == $self;
268 root 1.40 }
269    
270     =item $process->join
271    
272     Wait until the coroutine terminates and return any values given to the
273 pcg 1.59 C<terminate> or C<cancel> functions. C<join> can be called multiple times
274     from multiple processes.
275 root 1.40
276     =cut
277    
278     sub join {
279     my $self = shift;
280     unless ($self->{status}) {
281     push @{$self->{join}}, $current;
282     &schedule;
283     }
284     wantarray ? @{$self->{status}} : $self->{status}[0];
285 root 1.31 }
286    
287 root 1.82 =item $oldprio = $process->prio ($newprio)
288 root 1.31
289 root 1.41 Sets (or gets, if the argument is missing) the priority of the
290     process. Higher priority processes get run before lower priority
291 root 1.52 processes. Priorities are small signed integers (currently -4 .. +3),
292 root 1.41 that you can refer to using PRIO_xxx constants (use the import tag :prio
293     to get then):
294 root 1.31
295     PRIO_MAX > PRIO_HIGH > PRIO_NORMAL > PRIO_LOW > PRIO_IDLE > PRIO_MIN
296     3 > 1 > 0 > -1 > -3 > -4
297    
298     # set priority to HIGH
299     current->prio(PRIO_HIGH);
300    
301     The idle coroutine ($Coro::idle) always has a lower priority than any
302     existing coroutine.
303    
304     Changing the priority of the current process will take effect immediately,
305     but changing the priority of processes in the ready queue (but not
306     running) will only take effect after the next schedule (of that
307     process). This is a bug that will be fixed in some future version.
308    
309 root 1.82 =item $newprio = $process->nice ($change)
310 root 1.31
311     Similar to C<prio>, but subtract the given value from the priority (i.e.
312     higher values mean lower priority, just as in unix).
313    
314 root 1.82 =item $olddesc = $process->desc ($newdesc)
315 root 1.41
316     Sets (or gets in case the argument is missing) the description for this
317     process. This is just a free-form string you can associate with a process.
318    
319     =cut
320    
321     sub desc {
322     my $old = $_[0]{desc};
323     $_[0]{desc} = $_[1] if @_ > 1;
324     $old;
325 root 1.8 }
326 root 1.1
327 root 1.8 =back
328 root 1.2
329 root 1.8 =cut
330 root 1.2
331 root 1.8 1;
332 root 1.14
333 root 1.17 =head1 BUGS/LIMITATIONS
334 root 1.14
335 root 1.52 - you must make very sure that no coro is still active on global
336 root 1.53 destruction. very bad things might happen otherwise (usually segfaults).
337 root 1.52
338     - this module is not thread-safe. You should only ever use this module
339     from the same thread (this requirement might be losened in the future
340     to allow per-thread schedulers, but Coro::State does not yet allow
341     this).
342 root 1.9
343     =head1 SEE ALSO
344    
345 root 1.67 Support/Utility: L<Coro::Cont>, L<Coro::Specific>, L<Coro::State>, L<Coro::Util>.
346    
347     Locking/IPC: L<Coro::Signal>, L<Coro::Channel>, L<Coro::Semaphore>, L<Coro::SemaphoreSet>, L<Coro::RWLock>.
348    
349     Event/IO: L<Coro::Timer>, L<Coro::Event>, L<Coro::Handle>, L<Coro::Socket>, L<Coro::Select>.
350    
351     Embedding: L<Coro:MakeMaker>
352 root 1.1
353     =head1 AUTHOR
354    
355 root 1.66 Marc Lehmann <schmorp@schmorp.de>
356 root 1.64 http://home.schmorp.de/
357 root 1.1
358     =cut
359