AnyEvent
view release on metacpan or search on metacpan
lib/AnyEvent/Impl/UV.pm view on Meta::CPAN
=head1 NAME
AnyEvent::Impl::UV - AnyEvent adaptor for UV
=head1 SYNOPSIS
use AnyEvent;
use UV;
# this module gets loaded automatically as required
=head1 DESCRIPTION
This module provides transparent support for AnyEvent. You don't have to
do anything to make UV work with AnyEvent except by loading UV before
creating the first AnyEvent watcher.
=cut
package AnyEvent::Impl::UV;
use AnyEvent (); BEGIN { AnyEvent::common_sense }
use UV 0.24;
use Scalar::Util qw(weaken);
sub warnlog {
my $err = UV::last_error;
AnyEvent::log warn => "returned $_[0]: "
. UV::err_name ($err) . "($err): "
. UV::strerror ($err);
@_
}
# https://github.com/joyent/libuv/issues/680
# https://github.com/joyent/libuv/blob/dc1ea27c736f0d21c7160c790bcd1b113d20abd9/include/uv.h#L1277
my %io_watchers;
sub io_watcher_cb {
my $slaves = shift;
my (undef, $events) = @_;
return unless defined $slaves;
foreach my $entry (keys %$slaves) {
my $slave = $slaves->{$entry};
$slave->{cb}(@_) if $slave->{mode} & $events;
}
}
sub AnyEvent::Impl::UV::io_slave::new {
bless { parent => $_[1] }, $_[0]
}
sub AnyEvent::Impl::UV::io_slave::DESTROY {
my $self = $_[0];
my $master = $self->{parent};
delete $master->{slaves}{$self};
if (keys %{$master->{slaves}} == 0) {
if (defined $master->{w}) {
my $rc = UV::poll_stop $master->{w};
warnlog $rc if $rc;
}
delete $io_watchers{$master->{fd}};
return;
}
my $mode = 0;
foreach my $entry (keys %{$master->{slaves}}) {
$mode |= $master->{slaves}{$entry}{mode};
}
if ($master->{mode} != $mode) {
$master->{mode} = $mode;
my $rc = UV::poll_start $master->{w}, $master->{mode}, sub {
io_watcher_cb $master->{slaves}, @_;
};
warnlog $rc if $rc;
}
}
sub io {
( run in 2.344 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )