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}];


Reply via email to