line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package Object::Remote::Role::Connector; |
2
|
|
|
|
|
|
|
|
3
|
14
|
|
|
14
|
|
6457
|
use Module::Runtime qw(use_module); |
|
14
|
|
|
|
|
20
|
|
|
14
|
|
|
|
|
79
|
|
4
|
14
|
|
|
14
|
|
571
|
use Object::Remote::Future; |
|
14
|
|
|
|
|
17
|
|
|
14
|
|
|
|
|
642
|
|
5
|
14
|
|
|
14
|
|
49
|
use Object::Remote::Logging qw(:log :dlog router); |
|
14
|
|
|
|
|
25
|
|
|
14
|
|
|
|
|
77
|
|
6
|
14
|
|
|
14
|
|
66
|
use Moo::Role; |
|
14
|
|
|
|
|
23
|
|
|
14
|
|
|
|
|
67
|
|
7
|
|
|
|
|
|
|
|
8
|
|
|
|
|
|
|
requires '_open2_for'; |
9
|
|
|
|
|
|
|
|
10
|
|
|
|
|
|
|
has timeout => (is => 'ro', default => sub { 10 }); |
11
|
|
|
|
|
|
|
|
12
|
14
|
|
|
14
|
|
3838
|
BEGIN { router()->exclude_forwarding; } |
13
|
|
|
|
|
|
|
|
14
|
|
|
|
|
|
|
sub connect { |
15
|
20
|
|
|
20
|
0
|
32
|
my $self = shift; |
16
|
20
|
|
|
0
|
|
146
|
Dlog_debug { "Preparing to create connection with args of: $_" } @_; |
|
0
|
|
|
|
|
0
|
|
17
|
20
|
|
|
|
|
351
|
my ($send_to_fh, $receive_from_fh, $child_pid) = $self->_open2_for(@_); |
18
|
20
|
|
|
|
|
191
|
my $channel = use_module('Object::Remote::ReadChannel')->new( |
19
|
|
|
|
|
|
|
fh => $receive_from_fh |
20
|
|
|
|
|
|
|
); |
21
|
|
|
|
|
|
|
return future { |
22
|
20
|
|
|
20
|
|
370
|
log_trace { "Initializing connection for child pid '$child_pid'" }; |
|
0
|
|
|
|
|
0
|
|
23
|
20
|
|
|
|
|
228
|
my $f = shift; |
24
|
|
|
|
|
|
|
$channel->on_line_call(sub { |
25
|
19
|
50
|
|
|
|
75
|
if ($_[0] eq "Shere") { |
26
|
19
|
|
|
|
|
207
|
log_trace { "Received 'Shere' from child pid '$child_pid'; setting done handler to create connection" }; |
|
0
|
|
|
|
|
0
|
|
27
|
19
|
|
|
|
|
459
|
$f->done( |
28
|
|
|
|
|
|
|
use_module('Object::Remote::Connection')->new( |
29
|
|
|
|
|
|
|
send_to_fh => $send_to_fh, |
30
|
|
|
|
|
|
|
read_channel => $channel, |
31
|
|
|
|
|
|
|
child_pid => $child_pid, |
32
|
|
|
|
|
|
|
) |
33
|
|
|
|
|
|
|
); |
34
|
|
|
|
|
|
|
} else { |
35
|
0
|
|
|
|
|
0
|
log_warn { "'Shere' was not found in connection data for child pid '$child_pid'" }; |
|
0
|
|
|
|
|
0
|
|
36
|
0
|
|
|
|
|
0
|
$f->fail("Expected Shere from remote but received: $_[0]"); |
37
|
|
|
|
|
|
|
} |
38
|
19
|
|
|
|
|
811
|
undef($channel); |
39
|
20
|
|
|
|
|
194
|
}); |
40
|
|
|
|
|
|
|
$channel->on_close_call(sub { |
41
|
0
|
|
|
|
|
0
|
log_trace { "Connection has been closed" }; |
|
0
|
|
|
|
|
0
|
|
42
|
0
|
|
|
|
|
0
|
$f->fail("Channel closed without seeing Shere: $_[0]"); |
43
|
0
|
|
|
|
|
0
|
undef($channel); |
44
|
20
|
|
|
|
|
140
|
}); |
45
|
20
|
|
|
|
|
130
|
log_trace { "initialized events on channel for child pid '$child_pid'; creating timeout" }; |
|
0
|
|
|
|
|
0
|
|
46
|
|
|
|
|
|
|
Object::Remote->current_loop |
47
|
|
|
|
|
|
|
->watch_time( |
48
|
|
|
|
|
|
|
after => $self->timeout, |
49
|
|
|
|
|
|
|
code => sub { |
50
|
1
|
|
|
|
|
11
|
Dlog_trace {"Connection timeout timer has fired for child pid '$child_pid'; is_ready: $_" } $f->is_ready; |
|
0
|
|
|
|
|
0
|
|
51
|
1
|
50
|
|
|
|
12
|
unless($f->is_ready) { |
52
|
1
|
|
|
|
|
9
|
log_warn { "Connection with child pid '$child_pid' has timed out" }; |
|
0
|
|
|
|
|
0
|
|
53
|
1
|
50
|
|
|
|
11
|
$f->fail("Connection timed out") unless $f->is_ready; |
54
|
|
|
|
|
|
|
} |
55
|
1
|
|
|
|
|
439
|
undef($channel); |
56
|
|
|
|
|
|
|
|
57
|
|
|
|
|
|
|
} |
58
|
20
|
|
|
|
|
269
|
); |
59
|
20
|
|
|
|
|
163
|
log_trace { "connection for child pid '$child_pid' has been initialized" }; |
|
0
|
|
|
|
|
0
|
|
60
|
20
|
|
|
|
|
237
|
$f; |
61
|
|
|
|
|
|
|
} |
62
|
20
|
|
|
|
|
467
|
} |
63
|
|
|
|
|
|
|
|
64
|
|
|
|
|
|
|
1; |