AnyEvent-Memcached
view release on metacpan or search on metacpan
lib/AnyEvent/Memcached/Peer.pm view on Meta::CPAN
my ($method,$args,$cb) = @_;
if($self->{connecting} and $self->{failed}) {
warn "Is connecting, have fails => not connected" if DEBUG;
$cb and $cb->(undef, "Not connected");
return;
}
elsif (!$self->{connected}) {
my @args = @$args; # copy to avoid rewriting
warn time()." Not connected, do connect for ".\@args.", ".dumper($args[0]) if DEBUG;
my ($c,$t);
weaken( $self->{waitingcb}{int $cb} = $cb ) if $cb;
weaken( $self );
# This rely on correct event invocation order of Object::Event.
# If this could change, I'll add own queue
$c = $self->reg_cb(
connected => sub {
shift->unreg_me;
#$c or return;
warn "connected cb for ".\@args.", ".dumper($args[0]) if DEBUG;
undef $c;undef $t;
$self or return;
delete $self->{waitingcb}{int $cb} if $cb;
return $self->{con}->$method(@args);
},
);
$t = AnyEvent->timer(
after => $self->{timeout},# + 0.05, # Since there are timers inside connect, we need to delay a bit longer
cb => sub {
#$t or return;
warn time()." timeout $self->{timeout} cb for $args->[0]" if DEBUG;
undef $c;undef $t;
$self or return;
if ($cb){
$self->{waitingcb}{int $cb};
$cb->(undef, "Connect timeout");
}
},
);
$self->connect();
}
else {
Carp::cluck "How do I get here?";
return $self->{con}->$method(@$args);
}
}
sub command {
my $self = shift;
if ($self->{connected}) {
return $self->{con}->command( @_ );
}
else {
my ($cmd,%args) = @_;
$self->conntrack( command => \@_, $args{cb} );
}
}
sub request {
my $self = shift;
if ($self->{connected}) {
return $self->{con}->say(@_);
}
else {
# no cb
$self->conntrack( say => \@_ );
}
}
sub reader {
my $self = shift;
if ($self->{connected}) {
return $self->{con}->reader(@_);
}
else {
my %args = @_;
$self->conntrack( reader => \@_, $args{cb} );
}
}
sub want_command {
my $self = shift;
warn "wanting command";
if ($self->{connected}) {
return $self->{con}->want_command(@_);
}
else {
my %args = @_;
$self->conntrack( want_command => \@_ );
}
}
1;
( run in 0.303 second using v1.01-cache-2.11-cpan-483215c6ad5 )