AC-DC
view release on metacpan or search on metacpan
lib/AC/DC/IO.pm view on Meta::CPAN
if( defined $i ){
# debug("wrote $i bytes to $me->{info}");
substr($me->{_wbuffer}, 0, $i) = '';
if( length($me->{_wbuffer}) ){
$me->timeout_rel( $me->{writebuf_timeout} ) if $me->{writebuf_timeout};
}else{
$me->wantwrite(0);
$me->run_callback('write_buffer_empty', undef);
}
}else{
my $e = $!;
debug( "write failed ($e) for $me->{info}");
$me->run_callback('error', {
cause => 'write',
error => $e,
});
$me->shut();
}
}
################################################################
sub _readable {
my $me = shift;
$me->run_callback('readable', undef);
}
sub _timeout {
my $me = shift;
debug("io - timeout $me->{info}");
$me->run_callback('timeout', undef);
}
################################################################
sub _setnbio {
my $me = shift;
my $fd = $me->{fd};
fcntl($fd, F_SETFL, O_NDELAY);
}
################################################################
sub _oneloop {
my $t0 = time();
$^T = $t0;
my $r = $rvec;
my $w = $wvec;
my $t;
if( @timeout ){
$t = $timeout[0]{_timeout} - $^T;
$t = 0 if $t < 0;
}
my $i = select($r, $w, undef, $t);
if( $i == -1 ){
return if $! == EINTR;
fatal( "select failed: $!" );
}
my $t1 = time();
$^T = $t1;
# dispatch
for my $n (0 .. $maxfn){
if( vec($r, $n, 1) && vec($rvec, $n, 1) ){
my $x = $fileno[$n];
# debug("fileno $n ($x->{info}) is readable");
$x->_readable();
}
if( vec($w, $n, 1) && vec($wvec, $n, 1) ){
my $x = $fileno[$n];
# debug("fileno $n ($x->{info}) is writeable");
$x->_writable();
}
}
# timeouts
while(@timeout && $timeout[0]{_timeout} <= $^T){
my $x = shift @timeout;
debug("timed out $x->{info}");
delete $x->{_timeout};
$x->_timeout();
}
my $t2 = time();
# track idle/busy time
# debug("add idle? $t0, $t1, $t2 " . (defined &add_idle ? 'f' : '!'));
add_idle( $t1 - $t0, $t2 - $t0 ) if defined &add_idle;
}
sub mainloop {
while(1){
_oneloop();
last if $exitrequested;
}
_cleanup();
}
1;
( run in 1.076 second using v1.01-cache-2.11-cpan-39bf76dae61 )