ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/Coro.pm
Revision: 1.58
Committed: Fri Feb 13 23:17:41 2004 UTC (20 years, 3 months ago) by pcg
Branch: MAIN
Changes since 1.57: +1 -1 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 pcg 1.55 BEGIN { eval { require warnings } && warnings->unimport ("uninitialized") }
36 root 1.36
37 root 1.8 use Coro::State;
38    
39 pcg 1.55 use vars qw($idle $main $current);
40    
41 root 1.8 use base Exporter;
42    
43 pcg 1.58 $VERSION = 0.95;
44 root 1.8
45 root 1.22 @EXPORT = qw(async cede schedule terminate current);
46 root 1.31 %EXPORT_TAGS = (
47     prio => [qw(PRIO_MAX PRIO_HIGH PRIO_NORMAL PRIO_LOW PRIO_IDLE PRIO_MIN)],
48     );
49     @EXPORT_OK = @{$EXPORT_TAGS{prio}};
50 root 1.8
51     {
52     my @async;
53 root 1.26 my $init;
54 root 1.8
55     # this way of handling attributes simply is NOT scalable ;()
56     sub import {
57     Coro->export_to_level(1, @_);
58     my $old = *{(caller)[0]."::MODIFY_CODE_ATTRIBUTES"}{CODE};
59     *{(caller)[0]."::MODIFY_CODE_ATTRIBUTES"} = sub {
60     my ($package, $ref) = (shift, shift);
61     my @attrs;
62     for (@_) {
63     if ($_ eq "Coro") {
64     push @async, $ref;
65 root 1.26 unless ($init++) {
66     eval q{
67     sub INIT {
68     &async(pop @async) while @async;
69     }
70     };
71     }
72 root 1.8 } else {
73 root 1.17 push @attrs, $_;
74 root 1.8 }
75     }
76 root 1.17 return $old ? $old->($package, $ref, @attrs) : @attrs;
77 root 1.8 };
78     }
79    
80     }
81    
82 root 1.43 =over 4
83    
84 root 1.8 =item $main
85 root 1.2
86 root 1.8 This coroutine represents the main program.
87 root 1.1
88     =cut
89    
90 pcg 1.55 $main = new Coro;
91 root 1.8
92 root 1.19 =item $current (or as function: current)
93 root 1.1
94 root 1.8 The current coroutine (the last coroutine switched to). The initial value is C<$main> (of course).
95 root 1.1
96 root 1.8 =cut
97    
98     # maybe some other module used Coro::Specific before...
99     if ($current) {
100     $main->{specific} = $current->{specific};
101 root 1.1 }
102    
103 pcg 1.55 $current = $main;
104 root 1.19
105     sub current() { $current }
106 root 1.9
107     =item $idle
108    
109     The coroutine to switch to when no other coroutine is running. The default
110     implementation prints "FATAL: deadlock detected" and exits.
111    
112     =cut
113    
114     # should be done using priorities :(
115 pcg 1.55 $idle = new Coro sub {
116 root 1.9 print STDERR "FATAL: deadlock detected\n";
117     exit(51);
118     };
119 root 1.8
120 root 1.24 # this coroutine is necessary because a coroutine
121     # cannot destroy itself.
122     my @destroy;
123 root 1.38 my $manager;
124     $manager = new Coro sub {
125 pcg 1.57 while () {
126 root 1.37 # by overwriting the state object with the manager we destroy it
127     # while still being able to schedule this coroutine (in case it has
128     # been readied multiple times. this is harmless since the manager
129     # can be called as many times as neccessary and will always
130     # remove itself from the runqueue
131 root 1.40 while (@destroy) {
132     my $coro = pop @destroy;
133     $coro->{status} ||= [];
134     $_->ready for @{delete $coro->{join} || []};
135     $coro->{_coro_state} = $manager->{_coro_state};
136     }
137 root 1.24 &schedule;
138     }
139     };
140    
141 root 1.8 # static methods. not really.
142 root 1.43
143     =back
144 root 1.8
145     =head2 STATIC METHODS
146    
147     Static methods are actually functions that operate on the current process only.
148    
149     =over 4
150    
151 root 1.13 =item async { ... } [@args...]
152 root 1.8
153     Create a new asynchronous process and return it's process object
154     (usually unused). When the sub returns the new process is automatically
155     terminated.
156    
157 root 1.13 # create a new coroutine that just prints its arguments
158     async {
159     print "@_\n";
160     } 1,2,3,4;
161    
162 root 1.8 =cut
163    
164 root 1.13 sub async(&@) {
165     my $pid = new Coro @_;
166 root 1.24 $manager->ready; # this ensures that the stack is cloned from the manager
167 root 1.11 $pid->ready;
168     $pid;
169 root 1.8 }
170 root 1.1
171 root 1.8 =item schedule
172 root 1.6
173 root 1.8 Calls the scheduler. Please note that the current process will not be put
174     into the ready queue, so calling this function usually means you will
175     never be called again.
176 root 1.1
177     =cut
178    
179 root 1.22 =item cede
180 root 1.1
181 root 1.22 "Cede" to other processes. This function puts the current process into the
182     ready queue and calls C<schedule>, which has the effect of giving up the
183     current "timeslice" to other coroutines of the same or higher priority.
184 root 1.7
185 root 1.8 =cut
186    
187 root 1.40 =item terminate [arg...]
188 root 1.7
189 root 1.8 Terminates the current process.
190 root 1.1
191 root 1.13 Future versions of this function will allow result arguments.
192    
193 root 1.1 =cut
194    
195 root 1.8 sub terminate {
196 root 1.40 $current->{status} = [@_];
197 root 1.28 $current->cancel;
198 root 1.23 &schedule;
199 root 1.28 die; # NORETURN
200 root 1.1 }
201 root 1.6
202 root 1.8 =back
203    
204     # dynamic methods
205    
206     =head2 PROCESS METHODS
207    
208     These are the methods you can call on process objects.
209 root 1.6
210 root 1.8 =over 4
211    
212 root 1.13 =item new Coro \&sub [, @args...]
213 root 1.8
214     Create a new process and return it. When the sub returns the process
215 root 1.40 automatically terminates as if C<terminate> with the returned values were
216 root 1.41 called. To make the process run you must first put it into the ready queue
217     by calling the ready method.
218 root 1.13
219 root 1.6 =cut
220    
221 root 1.13 sub _newcoro {
222     terminate &{+shift};
223     }
224    
225 root 1.8 sub new {
226     my $class = shift;
227     bless {
228 root 1.13 _coro_state => (new Coro::State $_[0] && \&_newcoro, @_),
229 root 1.8 }, $class;
230     }
231 root 1.6
232 root 1.8 =item $process->ready
233 root 1.1
234 root 1.39 Put the given process into the ready queue.
235 root 1.1
236 root 1.8 =cut
237 root 1.28
238     =item $process->cancel
239    
240     Like C<terminate>, but terminates the specified process instead.
241    
242     =cut
243    
244     sub cancel {
245     push @destroy, $_[0];
246     $manager->ready;
247 root 1.35 &schedule if $current == $_[0];
248 root 1.40 }
249    
250     =item $process->join
251    
252     Wait until the coroutine terminates and return any values given to the
253     C<terminate> function. C<join> can be called multiple times from multiple
254     processes.
255    
256     =cut
257    
258     sub join {
259     my $self = shift;
260     unless ($self->{status}) {
261     push @{$self->{join}}, $current;
262     &schedule;
263     }
264     wantarray ? @{$self->{status}} : $self->{status}[0];
265 root 1.31 }
266    
267     =item $oldprio = $process->prio($newprio)
268    
269 root 1.41 Sets (or gets, if the argument is missing) the priority of the
270     process. Higher priority processes get run before lower priority
271 root 1.52 processes. Priorities are small signed integers (currently -4 .. +3),
272 root 1.41 that you can refer to using PRIO_xxx constants (use the import tag :prio
273     to get then):
274 root 1.31
275     PRIO_MAX > PRIO_HIGH > PRIO_NORMAL > PRIO_LOW > PRIO_IDLE > PRIO_MIN
276     3 > 1 > 0 > -1 > -3 > -4
277    
278     # set priority to HIGH
279     current->prio(PRIO_HIGH);
280    
281     The idle coroutine ($Coro::idle) always has a lower priority than any
282     existing coroutine.
283    
284     Changing the priority of the current process will take effect immediately,
285     but changing the priority of processes in the ready queue (but not
286     running) will only take effect after the next schedule (of that
287     process). This is a bug that will be fixed in some future version.
288    
289     =cut
290    
291     sub prio {
292     my $old = $_[0]{prio};
293     $_[0]{prio} = $_[1] if @_ > 1;
294     $old;
295     }
296    
297     =item $newprio = $process->nice($change)
298    
299     Similar to C<prio>, but subtract the given value from the priority (i.e.
300     higher values mean lower priority, just as in unix).
301    
302     =cut
303    
304     sub nice {
305     $_[0]{prio} -= $_[1];
306 root 1.41 }
307    
308     =item $olddesc = $process->desc($newdesc)
309    
310     Sets (or gets in case the argument is missing) the description for this
311     process. This is just a free-form string you can associate with a process.
312    
313     =cut
314    
315     sub desc {
316     my $old = $_[0]{desc};
317     $_[0]{desc} = $_[1] if @_ > 1;
318     $old;
319 root 1.8 }
320 root 1.1
321 root 1.8 =back
322 root 1.2
323 root 1.8 =cut
324 root 1.2
325 root 1.8 1;
326 root 1.14
327 root 1.17 =head1 BUGS/LIMITATIONS
328 root 1.14
329 root 1.52 - you must make very sure that no coro is still active on global
330 root 1.53 destruction. very bad things might happen otherwise (usually segfaults).
331 root 1.52
332     - this module is not thread-safe. You should only ever use this module
333     from the same thread (this requirement might be losened in the future
334     to allow per-thread schedulers, but Coro::State does not yet allow
335     this).
336 root 1.9
337     =head1 SEE ALSO
338    
339     L<Coro::Channel>, L<Coro::Cont>, L<Coro::Specific>, L<Coro::Semaphore>,
340 pcg 1.54 L<Coro::Signal>, L<Coro::State>, L<Coro::Timer>, L<Coro::Event>,
341     L<Coro::L<Coro::RWLock>, Handle>, L<Coro::Socket>.
342 root 1.1
343     =head1 AUTHOR
344    
345     Marc Lehmann <pcg@goof.com>
346     http://www.goof.com/pcg/marc/
347    
348     =cut
349