summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbustico2009-10-07 09:13:17 +0000
committerbustico2009-10-07 09:13:17 +0000
commit9151aab5dca0f49d389a7fa6063276f25a2bdb62 (patch)
tree948a88cd1f7b91cc40f13d73c698b9368f30e4b1
parentb933d69a4f3b6643f12fcbf2fcc92d532bcaa8a7 (diff)
downloadivy-perl-9151aab5dca0f49d389a7fa6063276f25a2bdb62.zip
ivy-perl-9151aab5dca0f49d389a7fa6063276f25a2bdb62.tar.gz
ivy-perl-9151aab5dca0f49d389a7fa6063276f25a2bdb62.tar.bz2
ivy-perl-9151aab5dca0f49d389a7fa6063276f25a2bdb62.tar.xz
Fix the condition to send "message ready" :
before fix, whe sended "message ready" after sending "end regexp", but this message ready could be ignored by peer agent if himself has not yet bound this message. fix consist to wait to two conditions : have received peer "end regexp" AND having sent "end regexp". Fix is the same as the one just applied to ivy-c.
-rw-r--r--Ivy.pm18
1 files changed, 15 insertions, 3 deletions
diff --git a/Ivy.pm b/Ivy.pm
index 78d5cd0..a243e9c 100644
--- a/Ivy.pm
+++ b/Ivy.pm
@@ -1,7 +1,7 @@
#
# Ivy, Perl interface
#
-# Copyright 1997-2008
+# Copyright 1997-2009
# Centre d'Études de la Navigation Aérienne
#
# Authors: Alexandre Bustico <alexandre.bustico@cena.fr>
@@ -361,6 +361,7 @@ use constant appName => $constantIndexer++;
use constant messWhenReady => $constantIndexer++;
use constant uuid => $constantIndexer++;
use constant pongQueue => $constantIndexer++;
+use constant readyToSend => $constantIndexer++;
#############################################################################
#### METHODES PUBLIQUES #####
@@ -683,6 +684,7 @@ sub new ($%)
($self->[useMulticast], $self->[broadcastPort], $self->[broadcastBuses]) =
_parseIvyBusParam ($options{-ivyBus});
+ $self->[readyToSend] = 0;
return ($self);
@@ -1646,8 +1648,11 @@ sub _getMessages ($$)
elsif ($type == ENDREGEXP) { # E N D R E G E X P
# on envoie le message ready uniquement a celui qui nous
- # a envoye le message endregexp
- $self->_sendMsgTo ($appSock, \$self->[messWhenReady]);
+ # 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->_sendMsgTo ($appSock, \$self->[messWhenReady]);
+ }
# on passe de l'etat Connecte a l'etat Ready
$self->[cnnxion]{"$addr:$peerPort"} =~ s/^\004//g;
@@ -1762,6 +1767,13 @@ sub _sendWantedRegexp ($$)
}
# on envoie le message de fin d'envoi de regexps
_univSend ($self, $appSock, sprintf (MSG_FMT, ENDREGEXP, 0, ""));
+
+ # 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->_sendMsgTo ($appSock, \$self->[messWhenReady]);
+ }
} # end _sendWantedRegexp
############### METHODE SEND LAST REGEXP TO ALLREADY CONNECTED