/usr/share/perl5/Mojo/IOWatcher/EV.pm is in libmojolicious-perl 2.23-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 | package Mojo::IOWatcher::EV;
use Mojo::Base 'Mojo::IOWatcher';
use EV 4.0;
use Scalar::Util 'weaken';
my $EV;
sub DESTROY { undef $EV }
# We have to fall back to Mojo::IOWatcher, since EV is unique
sub new { $EV++ ? Mojo::IOWatcher->new : shift->SUPER::new }
sub change {
my ($self, $handle, $read, $write) = @_;
my $fd = fileno $handle;
my $h = $self->{handles}->{$fd};
my $mode;
if ($read && $write) { $mode = EV::READ | EV::WRITE }
elsif ($read) { $mode = EV::READ }
elsif ($write) { $mode = EV::WRITE }
else { delete $h->{watcher} }
if (my $w = $h->{watcher}) { $w->set($fd, $mode) }
elsif ($mode) {
weaken $self;
$h->{watcher} = EV::io($fd, $mode, sub { $self->_io($fd, @_) });
}
return $self;
}
sub drop_handle { delete shift->{handles}->{fileno shift} }
sub recurring { shift->_timer(shift, 1, @_) }
# "Wow, Barney. You brought a whole beer keg.
# Yeah... where do I fill it up?"
sub start {EV::run}
sub stop { EV::break(EV::BREAK_ONE) }
sub timer { shift->_timer(shift, 0, @_) }
sub _io {
my ($self, $fd, $w, $revents) = @_;
my $handles = $self->{handles};
my $h = $handles->{$fd};
$self->_sandbox('Read', $h->{on_readable}, $h->{handle})
if EV::READ &$revents;
$self->_sandbox('Write', $h->{on_writable}, $h->{handle})
if EV::WRITE &$revents && $handles->{$fd};
}
# "It's great! We can do *anything* now that Science has invented Magic."
sub _timer {
my $self = shift;
my $after = shift || '0.0001';
my $recurring = shift;
my $cb = shift;
my $id = $self->SUPER::_timer($cb);
weaken $self;
$self->{timers}->{$id}->{watcher} = EV::timer(
$after,
$recurring ? $after : 0,
sub {
my $w = shift;
$self->_sandbox("Timer $id", $self->{timers}->{$id}->{cb}, $id);
delete $self->{timers}->{$id} unless $recurring;
}
);
return $id;
}
1;
__END__
=head1 NAME
Mojo::IOWatcher::EV - EV non-blocking I/O watcher
=head1 SYNOPSIS
use Mojo::IOWatcher::EV;
my $watcher = Mojo::IOWatcher::EV->new;
=head1 DESCRIPTION
L<Mojo::IOWatcher::EV> is a minimalistic non-blocking I/O watcher with
C<libev> support.
Note that this module is EXPERIMENTAL and might change without warning!
=head1 METHODS
L<Mojo::IOWatcher::EV> inherits all methods from L<Mojo::IOWatcher> and
implements the following new ones.
=head2 C<new>
my $watcher = Mojo::IOWatcher::EV->new;
Construct a new L<Mojo::IOWatcher::EV> object.
=head2 C<change>
$watcher = $watcher->change($handle, $read, $write);
Change I/O events to watch handle for.
=head2 C<drop_handle>
$watcher->drop_handle($handle);
Drop handle.
=head2 C<recurring>
my $id = $watcher->recurring(3 => sub {...});
Create a new recurring timer, invoking the callback repeatedly after a given
amount of seconds.
=head2 C<start>
$watcher->start;
Start watching for I/O and timer events.
=head2 C<stop>
$watcher->stop;
Stop watching for I/O and timer events.
=head2 C<timer>
my $id = $watcher->timer(3 => sub {...});
Create a new timer, invoking the callback after a given amount of seconds.
=head1 SEE ALSO
L<Mojolicious>, L<Mojolicious::Guides>, L<http://mojolicio.us>.
=cut
|