From 091d7af1a06fd1c2ffb0d241db40ab05ed9b6dd2 Mon Sep 17 00:00:00 2001 From: bustico Date: Mon, 20 Jun 2011 09:35:58 +0000 Subject: fix a bug on the conditions required to send ready message. --- Ivy.pm | 24 +++++++++++++++++++----- 1 file 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"; } -- cgit v1.1