[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