[libnet-dbus-perl] 119/335: Auto-matically reconnect signals if a service disappears & then comes back

Intrigeri intrigeri at moszumanska.debian.org
Sat Mar 21 01:07:35 UTC 2015


This is an automated email from the git hooks/post-receive script.

intrigeri pushed a commit to branch experimental
in repository libnet-dbus-perl.

commit 9ab7a7c7b62e62db9a4d60149ef68eb323e62d5c
Author: Daniel P. Berrange <dan at berrange.com>
Date:   Mon Sep 26 20:12:51 2005 +0000

    Auto-matically reconnect signals if a service disappears & then comes back
---
 lib/Net/DBus.pm | 56 +++++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 41 insertions(+), 15 deletions(-)

diff --git a/lib/Net/DBus.pm b/lib/Net/DBus.pm
index 795b16d..f193790 100644
--- a/lib/Net/DBus.pm
+++ b/lib/Net/DBus.pm
@@ -186,7 +186,7 @@ sub _new {
     my $self = {};
     
     $self->{connection} = shift;
-    $self->{signals} = {};
+    $self->{signals} = [];
     $self->{services} = {};
     
     my %params = @_;
@@ -222,24 +222,49 @@ sub _manage_names {
 
 	if (exists $self->{services}->{$name}) {
 	    if ($self->{services}->{$name}->{instance}) {
+		#warn "Already got an instance for $name, new owner is '$new'";
 		$self->{services}->{$name}->{online} = $new ? 1 : 0;
 		$self->{services}->{$name}->{owner} = $new;
 	    } else {
 		if ($new) {
+		    #warn "Create new instance for $name with owner $new";
 		    $self->{services}->{$name}->{online} = 1;
 		    $self->{services}->{$name}->{owner} = $new;
 		} else {
+		    #warn "Kill off instance $name";
 		    delete $self->{services}->{$name};
 		}
 	    }
 	} else {
 	    if ($new) {
+		#warn "Got newservice $name";
 		$self->{services}->{$name} = {
 		    online => 1,
 		    owner => $new
 		};
 	    }
 	}
+
+	# Check for any signals we have against this service
+	# because we'll need to update the match rule to reflect
+	# the new client id
+	foreach my $handler (@{$self->{signals}}) {
+	    if ($handler->[4] eq $name) {
+		if ($orig) {
+		    # warn "Removing existing signal match " . $handler->[1];
+		    $self->{connection}->remove_match($handler->[1]);
+		}
+		if ($new) {
+		    my $rule = $self->_match_rule($handler->[2], $handler->[3], $handler->[4], $handler->[5]);
+		    $handler->[1] = $rule;
+		    # warn "Adding new signal match " . $handler->[1];
+		    $self->{connection}->add_match($handler->[1]);
+		} else {
+		    # warn "Clearing signal match " . $handler->[1];
+		    $handler->[1] = undef;
+		}
+	    }
+	}
     });
 
     foreach (@{$bus->ListNames}) {
@@ -400,9 +425,7 @@ sub _add_signal_receiver {
 
     my $rule = $self->_match_rule($signal_name, $interface, $service, $path);
 
-    $self->{receivers}->{$rule} = [] unless $self->{receivers}->{$rule};
-    push @{$self->{receivers}->{$rule}}, $receiver;
-    
+    push @{$self->{signals}}, [$receiver, $rule, $signal_name, $interface, $service, $path];    
     $self->{connection}->add_match($rule);
 }
 
@@ -416,15 +439,17 @@ sub _remove_signal_receiver {
     
     my $rule = $self->_match_rule($signal_name, $interface, $service, $path);
 
-    my @receivers;
-    foreach (@{$self->{receivers}->{$rule}}) {
-	if ($_ eq $receiver) {
+    my @signals;
+    foreach (@{$self->{signals}}) {
+	if ($_->[0] eq $receiver &&
+	    defined $_->[1] &&
+	    $_->[1] eq $rule) {
 	    $self->{connection}->remove_match($rule);
 	} else {
-	    push @receivers, $_;
+	    push @signals, $_;
 	}
     }
-    $self->{receivers}->{$rule} = \@receivers;
+    $self->{signals} = \@signals;
 }
 
 
@@ -472,6 +497,7 @@ sub _rule_matches {
 	    $bits{$1} = $2;
 	}
     } split /,/, $rule;
+
     
     if (exists $bits{member} &&
 	$bits{member} ne $member) {
@@ -505,12 +531,12 @@ sub _signal_func {
     my $member = $message->get_member;
 
     my $handled = 0;
-    foreach my $rule (grep { $self->_rule_matches($_, $member, $interface, $sender, $path) }
-		      keys %{$self->{receivers}}) {
-	foreach my $callback (@{$self->{receivers}->{$rule}}) {
-	    &$callback($message);
-            $handled = 1;
-	}
+    foreach my $handler (grep { defined $_->[1] && 
+				$self->_rule_matches($_->[1], $member, $interface, $sender, $path) }
+			 @{$self->{signals}}) {
+	my $callback = $handler->[0];
+	&$callback($message);
+	$handled = 1;
     }
 
     return $handled;

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libnet-dbus-perl.git



More information about the Pkg-perl-cvs-commits mailing list