summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbustico2011-06-20 09:35:58 +0000
committerbustico2011-06-20 09:35:58 +0000
commit091d7af1a06fd1c2ffb0d241db40ab05ed9b6dd2 (patch)
tree269d4da952b072acd48c00998c10cba59267b14d
parent8a9ebd6320907ca943b2630baea33e8ee60e668f (diff)
downloadivy-perl-091d7af1a06fd1c2ffb0d241db40ab05ed9b6dd2.zip
ivy-perl-091d7af1a06fd1c2ffb0d241db40ab05ed9b6dd2.tar.gz
ivy-perl-091d7af1a06fd1c2ffb0d241db40ab05ed9b6dd2.tar.bz2
ivy-perl-091d7af1a06fd1c2ffb0d241db40ab05ed9b6dd2.tar.xz
fix a bug on the conditions required to send ready message.
-rw-r--r--Ivy.pm24
1 files changed, 19 insertions, 5 deletions
diff --git a/Ivy.pm b/Ivy.pm
index 2ed610f..3e4356c 100644
--- a/Ivy.pm
+++ b/Ivy.pm
@@ -693,7 +693,7 @@ sub new ($%)
($self->[useMulticast], $self->[broadcastPort], $self->[broadcastBuses]) =
_parseIvyBusParam ($options{-ivyBus});
- $self->[readyToSend] = 0;
+ $self->[readyToSend] = {};
return ($self);
@@ -1643,6 +1643,7 @@ sub _getMessages ($$)
}
# on affecte la nouvelle regexp a un id
$self->[sendRegListSrc]{$appSock}->[$id] = $valeurs;
+# printf ("DBG> add id $id regexps=[$valeurs]\n");
$self->[sendRegList]{$appSock}->[$id] =
eval ('sub {@{$_[1]} = ${$_[0]} =~ /($valeurs)/io;}');
@@ -1678,6 +1679,7 @@ sub _getMessages ($$)
elsif ($type == DELREGEXP) { # D E L R E G E X P
# on vire la regexp des regexps verifiées
+# printf ("DBG> delete id $id\n");
$self->[sendRegList]{$appSock}->[$id] = undef ;
my $regexp = $self->[sendRegListSrc]{$appSock}->[$id];
$self->[sendRegListSrc]{$appSock}->[$id] = undef;
@@ -1689,7 +1691,9 @@ sub _getMessages ($$)
# on envoie le message ready uniquement a celui qui nous
# a envoye le message endregexp, et uniquement si on a
# à la fois envoyé le end regexp, et reçu le endregexp de l'autre
- if (++$self->[readyToSend] == 2) {
+ $self->[readyToSend]->{"$addr:$peerPort"} = 0 unless
+ exists $self->[readyToSend]->{"$addr:$peerPort"};
+ if (++($self->[readyToSend]->{"$addr:$peerPort"}) == 2) {
$self->_sendMsgTo ($appSock, \$self->[messWhenReady]);
}
@@ -1822,7 +1826,11 @@ sub _sendWantedRegexp ($$)
# on envoie le message ready uniquement a celui qui nous
# a envoye le message endregexp, et uniquement si on a
# à la fois envoyé le end regexp, et reçu le endregexp de l'autre
- if (++$self->[readyToSend] == 2) {
+ my $addr = $appSock->peeraddr();
+ my $peerPort = $appSock->peerport() ;
+ $self->[readyToSend]->{"$addr:$peerPort"} = 0 unless
+ exists $self->[readyToSend]->{"$addr:$peerPort"};
+ if (++($self->[readyToSend]->{"$addr:$peerPort"}) == 2) {
$self->_sendMsgTo ($appSock, \$self->[messWhenReady]);
}
} # end _sendWantedRegexp
@@ -1965,7 +1973,7 @@ blockOnSlowAgent = $self->[blockOnSlowAgent]
topicRegexps = @{$self->[topicRegexps]}
useMulticast = $self->[useMulticast]
broadcastPort = $self->[broadcastPort]
-readyToSend = $self->[readyToSend]
+readyToSend = %{$self->[readyToSend]}
neededApp = @{$self->[neededApp]}
TABLE DE REGEXPS :
@@ -1977,7 +1985,13 @@ EOF
# my $ap2 = $self->[cnnxion]{$nameByHandle{$appSock}};
# $ap2 =~ s/^\004//g;
print $fh "POUR l'application ${appName}[$nameByHandle{$appSock}] : \n";
- print $fh join ("\n", @{$self->[sendRegListSrc]{$appSock}});
+ for (my $idx=0; $idx < scalar (@{$self->[sendRegListSrc]{$appSock}}); $idx++) {
+ printf $fh ("id[$idx] => '%s'\n",
+ defined ($self->[sendRegListSrc]{$appSock}->[$idx])
+ ? $self->[sendRegListSrc]{$appSock}->[$idx]
+ : "DELETED or UNDEFINED");
+ }
+ # print $fh join ("\n", @{$self->[sendRegListSrc]{$appSock}});
print $fh "\n-----------------------------------\n";
}