line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package DBGp::Client::AnyEvent::Connection; |
2
|
|
|
|
|
|
|
|
3
|
2
|
|
|
2
|
|
542
|
use strict; |
|
2
|
|
|
|
|
3
|
|
|
2
|
|
|
|
|
50
|
|
4
|
2
|
|
|
2
|
|
6
|
use warnings; |
|
2
|
|
|
|
|
2
|
|
|
2
|
|
|
|
|
55
|
|
5
|
|
|
|
|
|
|
|
6
|
2
|
|
|
2
|
|
1314
|
use AnyEvent::Handle; |
|
2
|
|
|
|
|
24176
|
|
|
2
|
|
|
|
|
66
|
|
7
|
2
|
|
|
2
|
|
963
|
use DBGp::Client::AsyncConnection; |
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
use Scalar::Util qw(weaken blessed); |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
sub new { |
11
|
|
|
|
|
|
|
my ($class, %args) = @_; |
12
|
|
|
|
|
|
|
my $self = bless { |
13
|
|
|
|
|
|
|
handle => undef, |
14
|
|
|
|
|
|
|
connection => DBGp::Client::AsyncConnection->new(socket => $args{socket}), |
15
|
|
|
|
|
|
|
}, $class; |
16
|
|
|
|
|
|
|
my $weak_self = $self; |
17
|
|
|
|
|
|
|
weaken($weak_self); |
18
|
|
|
|
|
|
|
my $handle = AnyEvent::Handle->new( |
19
|
|
|
|
|
|
|
fh => $args{socket}, |
20
|
|
|
|
|
|
|
on_error => sub { |
21
|
|
|
|
|
|
|
my ($handle, $fatal, $message) = @_; |
22
|
|
|
|
|
|
|
|
23
|
|
|
|
|
|
|
$weak_self->{handle} = undef; |
24
|
|
|
|
|
|
|
$handle->destroy; |
25
|
|
|
|
|
|
|
$weak_self->{connection}->closed; |
26
|
|
|
|
|
|
|
}, |
27
|
|
|
|
|
|
|
on_read => sub { |
28
|
|
|
|
|
|
|
my ($handle) = @_; |
29
|
|
|
|
|
|
|
|
30
|
|
|
|
|
|
|
$weak_self->{connection}->add_data($handle->{rbuf}); |
31
|
|
|
|
|
|
|
substr $handle->{rbuf}, 0, length($handle->{rbuf}), '' |
32
|
|
|
|
|
|
|
if defined $handle->{rbuf}; |
33
|
|
|
|
|
|
|
}, |
34
|
|
|
|
|
|
|
on_eof => sub { |
35
|
|
|
|
|
|
|
my ($handle) = @_; |
36
|
|
|
|
|
|
|
|
37
|
|
|
|
|
|
|
$weak_self->{handle} = undef; |
38
|
|
|
|
|
|
|
$handle->destroy; |
39
|
|
|
|
|
|
|
$weak_self->{connection}->closed; |
40
|
|
|
|
|
|
|
}, |
41
|
|
|
|
|
|
|
); |
42
|
|
|
|
|
|
|
|
43
|
|
|
|
|
|
|
$self->{handle} = $handle; |
44
|
|
|
|
|
|
|
|
45
|
|
|
|
|
|
|
return $self; |
46
|
|
|
|
|
|
|
} |
47
|
|
|
|
|
|
|
|
48
|
|
|
|
|
|
|
sub DESTROY { |
49
|
|
|
|
|
|
|
my ($self) = @_; |
50
|
|
|
|
|
|
|
|
51
|
|
|
|
|
|
|
$self->{handle}->destroy if $self->{handle} && !$self->{handle}->destroyed; |
52
|
|
|
|
|
|
|
} |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
sub init { $_[0]->{connection}->init } |
55
|
|
|
|
|
|
|
|
56
|
|
|
|
|
|
|
sub send_command { |
57
|
|
|
|
|
|
|
my ($self, $callback_or_condvar, @rest) = @_; |
58
|
|
|
|
|
|
|
my ($condvar, $callback); |
59
|
|
|
|
|
|
|
|
60
|
|
|
|
|
|
|
if (!defined $callback_or_condvar) { |
61
|
|
|
|
|
|
|
$condvar = AnyEvent->condvar; |
62
|
|
|
|
|
|
|
$callback = sub { $condvar->send($_[0]) }; |
63
|
|
|
|
|
|
|
} elsif (ref $callback_or_condvar eq 'CODE') { |
64
|
|
|
|
|
|
|
$condvar = AnyEvent->condvar; |
65
|
|
|
|
|
|
|
$callback = sub { $condvar->send($_[0]); $callback_or_condvar->($_[0]); }; |
66
|
|
|
|
|
|
|
} elsif (blessed $callback_or_condvar && $callback_or_condvar->isa('AnyEvent::CondVar')) { |
67
|
|
|
|
|
|
|
$condvar = $callback_or_condvar; |
68
|
|
|
|
|
|
|
$callback = sub { $condvar->send($_[0]) }; |
69
|
|
|
|
|
|
|
} else { |
70
|
|
|
|
|
|
|
die "callback_or_condvar can be undefined, a code reference or a condvar"; |
71
|
|
|
|
|
|
|
} |
72
|
|
|
|
|
|
|
$self->{connection}->send_command($callback, @rest); |
73
|
|
|
|
|
|
|
|
74
|
|
|
|
|
|
|
return $condvar; |
75
|
|
|
|
|
|
|
} |
76
|
|
|
|
|
|
|
|
77
|
|
|
|
|
|
|
1; |