ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/Coro/README
(Generate patch)

Comparing Coro/README (file contents):
Revision 1.39 by root, Fri Jul 14 13:14:32 2017 UTC vs.
Revision 1.42 by root, Wed Jul 29 13:09:19 2020 UTC

66CORO THREAD LIFE CYCLE 66CORO THREAD LIFE CYCLE
67 During the long and exciting (or not) life of a coro thread, it goes 67 During the long and exciting (or not) life of a coro thread, it goes
68 through a number of states: 68 through a number of states:
69 69
70 1. Creation 70 1. Creation
71 The first thing in the life of a coro thread is it's creation - 71 The first thing in the life of a coro thread is its creation -
72 obviously. The typical way to create a thread is to call the "async 72 obviously. The typical way to create a thread is to call the "async
73 BLOCK" function: 73 BLOCK" function:
74 74
75 async { 75 async {
76 # thread code goes here 76 # thread code goes here
85 This creates a new coro thread and puts it into the ready queue, 85 This creates a new coro thread and puts it into the ready queue,
86 meaning it will run as soon as the CPU is free for it. 86 meaning it will run as soon as the CPU is free for it.
87 87
88 "async" will return a Coro object - you can store this for future 88 "async" will return a Coro object - you can store this for future
89 reference or ignore it - a thread that is running, ready to run or 89 reference or ignore it - a thread that is running, ready to run or
90 waiting for some event is alive on it's own. 90 waiting for some event is alive on its own.
91 91
92 Another way to create a thread is to call the "new" constructor with 92 Another way to create a thread is to call the "new" constructor with
93 a code-reference: 93 a code-reference:
94 94
95 new Coro sub { 95 new Coro sub {
239 implements an endless loop, the $guard will not be cleaned up. 239 implements an endless loop, the $guard will not be cleaned up.
240 However, since the thread object returned by "async" is not stored 240 However, since the thread object returned by "async" is not stored
241 anywhere, the thread is initially referenced because it is in the 241 anywhere, the thread is initially referenced because it is in the
242 ready queue, when it runs it is referenced by $Coro::current, but 242 ready queue, when it runs it is referenced by $Coro::current, but
243 when it calls "schedule", it gets "cancel"ed causing the guard 243 when it calls "schedule", it gets "cancel"ed causing the guard
244 object to be destroyed (see the next section), and printing it's 244 object to be destroyed (see the next section), and printing its
245 message. 245 message.
246 246
247 If this seems a bit drastic, remember that this only happens when 247 If this seems a bit drastic, remember that this only happens when
248 nothing references the thread anymore, which means there is no way 248 nothing references the thread anymore, which means there is no way
249 to further execute it, ever. The only options at this point are 249 to further execute it, ever. The only options at this point are
252 5. Cleanup 252 5. Cleanup
253 Threads will allocate various resources. Most but not all will be 253 Threads will allocate various resources. Most but not all will be
254 returned when a thread terminates, during clean-up. 254 returned when a thread terminates, during clean-up.
255 255
256 Cleanup is quite similar to throwing an uncaught exception: perl 256 Cleanup is quite similar to throwing an uncaught exception: perl
257 will work it's way up through all subroutine calls and blocks. On 257 will work its way up through all subroutine calls and blocks. On its
258 it's way, it will release all "my" variables, undo all "local"'s and 258 way, it will release all "my" variables, undo all "local"'s and free
259 free any other resources truly local to the thread. 259 any other resources truly local to the thread.
260 260
261 So, a common way to free resources is to keep them referenced only 261 So, a common way to free resources is to keep them referenced only
262 by my variables: 262 by my variables:
263 263
264 async { 264 async {
284 those code blocks): 284 those code blocks):
285 285
286 async { 286 async {
287 my $window = new Gtk2::Window "toplevel"; 287 my $window = new Gtk2::Window "toplevel";
288 # The window will not be cleaned up automatically, even when $window 288 # The window will not be cleaned up automatically, even when $window
289 # gets freed, so use a guard to ensure it's destruction 289 # gets freed, so use a guard to ensure its destruction
290 # in case of an error: 290 # in case of an error:
291 my $window_guard = Guard::guard { $window->destroy }; 291 my $window_guard = Guard::guard { $window->destroy };
292 292
293 # we are safe here 293 # we are safe here
294 }; 294 };
629 call and the arguments, but consumes very little other resources. 629 call and the arguments, but consumes very little other resources.
630 New states will automatically get assigned a perl interpreter when 630 New states will automatically get assigned a perl interpreter when
631 they are transferred to. 631 they are transferred to.
632 632
633 $state->is_zombie 633 $state->is_zombie
634 Returns true iff the Coro object has been cancelled, i.e. it's 634 Returns true iff the Coro object has been cancelled, i.e. its
635 resources freed because they were "cancel"'ed, "terminate"'d, 635 resources freed because they were "cancel"'ed, "terminate"'d,
636 "safe_cancel"'ed or simply went out of scope. 636 "safe_cancel"'ed or simply went out of scope.
637 637
638 The name "zombie" stems from UNIX culture, where a process that has 638 The name "zombie" stems from UNIX culture, where a process that has
639 exited and only stores and exit status and no other resources is 639 exited and only stores and exit status and no other resources is
651 651
652 $is_suspended = $coro->is_suspended 652 $is_suspended = $coro->is_suspended
653 Returns true iff this Coro object has been suspended. Suspended 653 Returns true iff this Coro object has been suspended. Suspended
654 Coros will not ever be scheduled. 654 Coros will not ever be scheduled.
655 655
656 $coro->cancel (arg...) 656 $coro->cancel ($arg...)
657 Terminates the given Coro thread and makes it return the given 657 Terminate the given Coro thread and make it return the given
658 arguments as status (default: an empty list). Never returns if the 658 arguments as status (default: an empty list). Never returns if the
659 Coro is the current Coro. 659 Coro is the current Coro.
660 660
661 This is a rather brutal way to free a coro, with some limitations - 661 This is a rather brutal way to free a coro, with some limitations -
662 if the thread is inside a C callback that doesn't expect to be 662 if the thread is inside a C callback that doesn't expect to be
697 context and can block if they wish. The downside is that there is no 697 context and can block if they wish. The downside is that there is no
698 guarantee that the thread can be cancelled when you call this 698 guarantee that the thread can be cancelled when you call this
699 method, and therefore, it might fail. It is also considerably slower 699 method, and therefore, it might fail. It is also considerably slower
700 than "cancel" or "terminate". 700 than "cancel" or "terminate".
701 701
702 A thread is in a safe-cancellable state if it either hasn't been run 702 A thread is in a safe-cancellable state if it either has never been
703 run yet, has already been canceled/terminated or otherwise
703 yet, or it has no C context attached and is inside an SLF function. 704 destroyed, or has no C context attached and is inside an SLF
705 function.
704 706
707 The first two states are trivial - a thread that hasnot started or
708 has already finished is safe to cancel.
709
705 The latter two basically mean that the thread isn't currently inside 710 The last state basically means that the thread isn't currently
706 a perl callback called from some C function (usually via some XS 711 inside a perl callback called from some C function (usually via some
707 modules) and isn't currently executing inside some C function itself 712 XS modules) and isn't currently executing inside some C function
708 (via Coro's XS API). 713 itself (via Coro's XS API).
709 714
710 This call returns true when it could cancel the thread, or croaks 715 This call returns true when it could cancel the thread, or croaks
711 with an error otherwise (i.e. it either returns true or doesn't 716 with an error otherwise (i.e. it either returns true or doesn't
712 return at all). 717 return at all).
713 718
778 from multiple threads, and all will be resumed and given the status 783 from multiple threads, and all will be resumed and given the status
779 return once the $coro terminates. 784 return once the $coro terminates.
780 785
781 $coro->on_destroy (\&cb) 786 $coro->on_destroy (\&cb)
782 Registers a callback that is called when this coro thread gets 787 Registers a callback that is called when this coro thread gets
783 destroyed, that is, after it's resources have been freed but before 788 destroyed, that is, after its resources have been freed but before
784 it is joined. The callback gets passed the terminate/cancel 789 it is joined. The callback gets passed the terminate/cancel
785 arguments, if any, and *must not* die, under any circumstances. 790 arguments, if any, and *must not* die, under any circumstances.
786 791
787 There can be any number of "on_destroy" callbacks per coro, and 792 There can be any number of "on_destroy" callbacks per coro, and
788 there is currently no way to remove a callback once added. 793 there is currently no way to remove a callback once added.
886 $cb = rouse_cb 891 $cb = rouse_cb
887 Create and return a "rouse callback". That's a code reference that, 892 Create and return a "rouse callback". That's a code reference that,
888 when called, will remember a copy of its arguments and notify the 893 when called, will remember a copy of its arguments and notify the
889 owner coro of the callback. 894 owner coro of the callback.
890 895
896 Only the first invocation will store agruments and signal any waiter
897 - further calls will effectively be ignored, but it is ok to try.
898
891 See the next function. 899 Also see the next function.
892 900
893 @args = rouse_wait [$cb] 901 @args = rouse_wait [$cb]
894 Wait for the specified rouse callback (or the last one that was 902 Wait for the specified rouse callback to be invoked (or if the
895 created in this coro). 903 argument is missing, use the most recently created callback in the
904 current coro).
896 905
897 As soon as the callback is invoked (or when the callback was invoked 906 As soon as the callback is invoked (or when the callback was invoked
898 before "rouse_wait"), it will return the arguments originally passed 907 before "rouse_wait"), it will return the arguments originally passed
899 to the rouse callback. In scalar context, that means you get the 908 to the rouse callback. In scalar context, that means you get the
900 *last* argument, just as if "rouse_wait" had a "return ($a1, $a2, 909 *last* argument, just as if "rouse_wait" had a "return ($a1, $a2,
901 $a3...)" statement at the end. 910 $a3...)" statement at the end.
902 911
912 You are only allowed to wait once for a given rouse callback.
913
903 See the section HOW TO WAIT FOR A CALLBACK for an actual usage 914 See the section HOW TO WAIT FOR A CALLBACK for an actual usage
904 example. 915 example.
916
917 As of Coro 6.57, you can reliably wait for a rouse callback in a
918 different thread than from where it was created.
905 919
906HOW TO WAIT FOR A CALLBACK 920HOW TO WAIT FOR A CALLBACK
907 It is very common for a coro to wait for some callback to be called. 921 It is very common for a coro to wait for some callback to be called.
908 This occurs naturally when you use coro in an otherwise event-based 922 This occurs naturally when you use coro in an otherwise event-based
909 program, or when you use event-based libraries. 923 program, or when you use event-based libraries.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines