Author: bdonlan
Date: 2005-07-10 20:19:40 -0400 (Sun, 10 Jul 2005)
New Revision: 858
Modified:
trunk/perl/client/lib/Haver/Client/POE.pm
Log:
Clean shutdown
Modified: trunk/perl/client/lib/Haver/Client/POE.pm
===================================================================
--- trunk/perl/client/lib/Haver/Client/POE.pm 2005-07-11 00:09:48 UTC (rev
857)
+++ trunk/perl/client/lib/Haver/Client/POE.pm 2005-07-11 00:19:40 UTC (rev
858)
@@ -173,6 +173,7 @@
unregister
_cleanup
_err
+ _force_down
}
]],
heap => $heap,
@@ -231,7 +232,6 @@
Filter => new Haver::Protocol::Filter,
InputEvent => '_input',
ErrorEvent => '_err',
- # FlushedEvent => ...
);
$heap->{wheel}->put( ['HAVER', '$pkg/$version'] );
# XXX: timeout
@@ -260,20 +260,28 @@
=cut
sub disconnect {
- # XXX
my $heap = $_[HEAP];
+ $heap->{state} = S_DYING;
+ $poe_kernel->delay('_force_down', 5);
+ _call('send_raw', 'BYE');
+}
+
+sub _force_down {
+ my $heap = $_[HEAP];
$heap->{state} = S_IDLE;
_call('_cleanup');
}
sub _cleanup {
my $heap = $_[HEAP];
+ $poe_kernel->delay('_force_down');
if ($heap->{pending}) {
my @opts = %{delete $heap->{pending}};
$poe_kernel->yield('connect', @opts);
}
delete $heap->{wheel};
delete $heap->{name};
+ $heap->{state} = S_IDLE;
}
=head2 send_raw(@args)
@@ -366,12 +374,18 @@
=cut
sub destroy {
- my ($kernel, $heap) = @_;
+ my ($kernel, $heap) = @_[KERNEL,HEAP];
_dispatch('destroyed');
delete $heap->{pending};
- delete $heap->{reg};
+ my $reg = $heap->{reg};
+ foreach my $ehash (values %$reg) {
+ foreach my $id (keys %$ehash) {
+ $poe_kernel->refcount_decrement($id, $ehash->{$id});
+ }
+ }
+ $heap->{reg} = {};
_call('disconnect');
- $kernel->remove_alias($heap->{alias});
+ $kernel->alias_remove($heap->{alias});
}
## server-response stuff
@@ -428,7 +442,8 @@
sub _ev_BYE {
my ($type, $detail) = @_[ARG2,ARG3];
- die "bye $type $detail\n";
+ _dispatch('bye', $detail);
+ _call('_cleanup');
}
sub _ev_FAIL {
@@ -496,7 +511,6 @@
$reg->{$evname} ||= {};
$reg->{ALL} ||= {};
my %targ = (%{$reg->{$evname}}, %{$reg->{ALL}});
- print Dumper \%targ;
my @ids = keys %targ;
unshift @args, [$heap->{alias}];