Coro::Select - a (slow but coro-aware) replacement for CORE::select
use Coro::Select; # replace select globally (be careful, see below)
use Core::Select 'select'; # only in this module
use Coro::Select (); # use Coro::Select::select
This module tries to create a fully working replacement for perl's
"select" built-in, using "AnyEvent" watchers to do the
job, so other threads can run in parallel to any select user. As many
libraries that only have a blocking API do not use global variables and often
use select (or IO::Select), this effectively makes most such libraries
"somewhat" non-blocking w.r.t. other threads.
This implementation works fastest when only very few bits are set in the fd
To be effective globally, this module must be "use"'d before any other
module that uses "select", so it should generally be the first
module "use"'d in the main program. Note that overriding
"select" globally might actually cause problems, as some
"AnyEvent" backends use "select" themselves, and asking
AnyEvent to use Coro::Select, which in turn asks AnyEvent will not quite work.
You can also invoke it from the commandline as "perl -MCoro::Select".
To override select only for a single module (e.g.
"Net::DBus::Reactor"), use a code fragment like this to load it:
use Coro::Select qw(select);
Some modules (notably POE::Loop::Select) directly call "CORE::select".
For these modules, we need to patch the opcode table by sandwiching it between
calls to "Coro::Select::patch_pp_sselect" and
use Coro::Select ();
For performance reasons, Coro::Select's select function might not properly
detect bad file descriptors (but relying on EBADF is inherently non-portable).
Marc A. Lehmann <firstname.lastname@example.org>