Cassandra-Client
view release on metacpan or search on metacpan
lib/Cassandra/Client/AsyncEV.pm view on Meta::CPAN
@TIMEOUTS= sort { $a->[0] <=> $b->[0] } @TIMEOUTS;
} else {
# Common case
push @TIMEOUTS, $additem;
}
return \($additem->[3]);
}
sub handle_timeouts {
my ($self, $curtime)= @_;
local *TIMEOUTS= $self->{timeouts};
my %triggered_read;
while (@TIMEOUTS && $curtime >= $TIMEOUTS[0][0]) {
my $item= shift @TIMEOUTS;
if (!$item->[3]) { # If it timed out
my ($deadline, $fh, $id, $timedout)= @$item;
my $obj= $self->{fh_to_obj}{$fh};
$obj->can_read unless $triggered_read{$fh}++;
$obj->can_timeout($id) unless $item->[3]; # We may have received an answer...
}
}
if (!@TIMEOUTS) {
$self->{ev_timeout}= undef;
}
return;
}
sub timer {
my ($self, $callback, $wait)= @_;
my $t; $t= $self->{ev}->timer($wait, 0, sub {
undef $t;
$callback->();
});
}
sub later {
my ($self, $callback)= @_;
$self->timer($callback, 0);
}
# $something->($async->wait(my $w)); my ($error, $result)= $w->();
sub wait {
my ($self)= @_;
my $output= \$_[1];
my ($done, $in_run);
my @output;
my $callback= sub {
$done= 1;
@output= @_;
$self->{ev}->break() if $in_run;
};
$$output= sub {
if ($self->{in_wait}) {
die "Unable to recursively wait for callbacks; are you doing synchronous Cassandra queries from asynchronous callbacks?";
}
local $self->{in_wait}= 1;
$in_run= 1;
$self->{ev}->run unless $done;
return @output;
};
return $callback;
}
1;
__END__
=pod
=head1 NAME
Cassandra::Client::AsyncEV
=head1 VERSION
version 0.21
=head1 AUTHOR
Tom van der Woerdt <tvdw@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2023 by Tom van der Woerdt.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut
( run in 2.599 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )