+
+ $delqueue{$conn} = $conn; # save this connection until everything is finished
+ my $sock = $conn->{sock};
+ if ($sock) {
+ if ($sock->{buffer}) {
+ my $lth = length $sock->{buffer};
+ Mojo::IOLoop->timer($disc_waittime, sub {
+ dbg("Buffer contained $lth characters, coordinated for $disc_waittime secs, now disconnecting $call") if $dbg;
+ _close_it($conn);
+ });
+ } else {
+ dbg("Buffer empty, just close $call") if $dbg;
+ _close_it($conn);
+ }
+ } else {
+ dbg((ref $conn) . " socket missing on $conn->{call}") if $dbg;
+ _close_it($conn);
+ }
+}
+
+sub _close_it
+{
+ my $conn = shift;
+ my $sock = delete $conn->{sock};
+ $conn->{state} = 'E';
+ $conn->{timeout}->del if $conn->{timeout};
+
+ my $call = $conn->{call};
+
+ if (isdbg('connll')) {
+ my ($pkg, $fn, $line) = caller;
+ dbg((ref $conn) . "::_close_it on call $conn->{call} attempt $conn->{disconnecting} called from ${pkg}::${fn} line $line ");
+ }
+
+
+ dbg((ref $conn) . " Connection $conn->{cnum} $call starting to close") if isdbg('connll');
+
+ if ($conn->{on_disconnect}) {
+ &{$conn->{on_disconnect}}($conn);
+ }
+
+ if ($sock) {
+ dbg((ref $conn) . " Connection $conn->{cnum} $call closing gracefully") if isdbg('connll');
+ $sock->close_gracefully if $sock->can('close_gracefully');
+ }