/usr/share/perl5/POE/Loop/Event.pm is in libpoe-loop-event-perl 1.305-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 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 | # Event.pm event loop bridge for POE::Kernel.
# Empty package to appease perl.
package POE::Loop::Event;
use strict;
# Include common signal handling. Signals should be safe now, and for
# some reason Event isn't dispatching SIGCHLD to me circa POE r2084.
use POE::Loop::PerlSignals;
use vars qw($VERSION);
$VERSION = '1.305'; # NOTE - Should be #.### (three decimal places)
=for poe_tests
sub skip_tests {
return "Event tests require the Event module" if (
do { eval "use Event"; $@ }
);
my $test_name = shift;
if ($test_name eq "k_signals_rerun" and $^O eq "MSWin32") {
return "This test crashes Perl when run with Tk on $^O";
}
if ($test_name eq "wheel_readline" and $^O eq "darwin") {
return "Event skips two of its own tests for the same reason";
}
}
=cut
# Everything plugs into POE::Kernel.
package POE::Kernel;
use strict;
use Event;
my $_watcher_timer;
my @fileno_watcher;
my %signal_watcher;
#------------------------------------------------------------------------------
# Loop construction and destruction.
sub loop_initialize {
my $self = shift;
$_watcher_timer = Event->timer(
cb => \&_loop_event_callback,
desc => 'dispatch_timer',
after => 0,
);
}
sub loop_finalize {
my $self = shift;
foreach my $fd (0..$#fileno_watcher) {
next unless defined $fileno_watcher[$fd];
foreach my $mode (MODE_RD, MODE_WR, MODE_EX) {
POE::Kernel::_warn(
"Mode $mode watcher for fileno $fd is defined during loop finalize"
) if defined $fileno_watcher[$fd]->[$mode];
}
}
$self->loop_ignore_all_signals();
}
#------------------------------------------------------------------------------
# Signal handler maintenance functions.
sub loop_attach_uidestroy {
# does nothing
}
#------------------------------------------------------------------------------
# Maintain time watchers.
sub loop_resume_time_watcher {
my ($self, $next_time) = @_;
($_watcher_timer and $next_time) or return;
$_watcher_timer->at($next_time);
$_watcher_timer->start();
}
sub loop_reset_time_watcher {
my ($self, $next_time) = @_;
$_watcher_timer or return;
$self->loop_pause_time_watcher();
$self->loop_resume_time_watcher($next_time);
}
sub loop_pause_time_watcher {
$_watcher_timer or return;
$_watcher_timer->stop();
}
#------------------------------------------------------------------------------
# Maintain filehandle watchers.
sub loop_watch_filehandle {
my ($self, $handle, $mode) = @_;
my $fileno = fileno($handle);
# Overwriting a pre-existing watcher?
if (defined $fileno_watcher[$fileno]->[$mode]) {
$fileno_watcher[$fileno]->[$mode]->cancel();
undef $fileno_watcher[$fileno]->[$mode];
}
$fileno_watcher[$fileno]->[$mode] = Event->io(
fd => $fileno,
desc => "io_watcher $handle $fileno $mode",
poll => (
( $mode == MODE_RD )
? 'r'
: (
( $mode == MODE_WR )
? 'w'
: 'e'
)
),
cb => \&_loop_select_callback,
);
}
sub loop_ignore_filehandle {
my ($self, $handle, $mode) = @_;
my $fileno = fileno($handle);
# Don't bother removing a select if none was registered.
if (defined $fileno_watcher[$fileno]->[$mode]) {
$fileno_watcher[$fileno]->[$mode]->cancel();
undef $fileno_watcher[$fileno]->[$mode];
}
}
sub loop_pause_filehandle {
my ($self, $handle, $mode) = @_;
my $fileno = fileno($handle);
$fileno_watcher[$fileno]->[$mode]->stop();
}
sub loop_resume_filehandle {
my ($self, $handle, $mode) = @_;
my $fileno = fileno($handle);
$fileno_watcher[$fileno]->[$mode]->start();
}
# Timer callback to dispatch events.
my $last_time = time();
sub _loop_event_callback {
my $self = $poe_kernel;
if (TRACE_STATISTICS) {
# TODO - I'm pretty sure the startup time will count as an unfair
# amount of idleness.
#
# TODO - Introducing many new time() syscalls. Bleah.
$self->_data_stat_add('idle_seconds', time() - $last_time);
}
$self->_data_ev_dispatch_due();
$self->_test_if_kernel_is_idle();
# Transferring control back to Event; this is idle time.
$last_time = time() if TRACE_STATISTICS;
}
# Event filehandle callback to dispatch selects.
sub _loop_select_callback {
my $self = $poe_kernel;
my $event = shift;
my $watcher = $event->w;
my $fileno = $watcher->fd;
my $mode = (
( $event->got eq 'r' )
? MODE_RD
: (
( $event->got eq 'w' )
? MODE_WR
: (
( $event->got eq 'e' )
? MODE_EX
: return
)
)
);
$self->_data_handle_enqueue_ready($mode, $fileno);
$self->_test_if_kernel_is_idle();
}
#------------------------------------------------------------------------------
# The event loop itself.
sub loop_do_timeslice {
Event::one_event();
}
sub loop_run {
my $self = shift;
# Avoid a hang when trying to run an idle Kernel.
$self->_test_if_kernel_is_idle();
while ($self->_data_ses_count()) {
$self->loop_do_timeslice();
}
}
sub loop_halt {
$_watcher_timer->stop();
$_watcher_timer = undef;
Event::unloop_all(0);
}
1;
__END__
=head1 NAME
POE::Loop::Event - a bridge that allows POE to be driven by Event.pm
=head1 SYNOPSIS
See L<POE::Loop>.
=head1 DESCRIPTION
POE::Loop::Event implements the interface documented in L<POE::Loop>.
Therefore it has no documentation of its own. Please see L<POE::Loop>
for more details.
=head1 SEE ALSO
L<POE>, L<POE::Loop>, L<Event>, L<POE::Loop::PerlSignals>
=head1 AUTHORS & LICENSING
POE::Loop::Event is Copyright 1998-2013 Rocco Caputo. All rights
reserved. POE::Loop::Event is free software; you may redistribute it
and/or modify it under the same terms as Perl itself.
=cut
# rocco // vim: ts=2 sw=2 expandtab
# TODO - Edit.
|