This commit is contained in:
glenux 2006-03-06 22:05:53 +00:00
parent b65e44d8bf
commit 93ef30f24d

View file

@ -1,95 +1,141 @@
/* vim: set sw=4 ts=4 si et: */
#include "lowreceiver.h" #include "lowreceiver.h"
#include "messagecell_ab.h" #include "messagecell_ab.h"
void LowReceiver::manage_abcast(Message * mesg) { void LowReceiver::manage_abcast(Message * mesg) {
static std::list<MessageCellAb *> fifo_get; static std::list<MessageCellAb *> fifo_get;
static std::list<MessageCellAb *> fifo_send; static std::list<MessageCellAb *> fifo_send;
static std::list<Message *> fifo_deliverable;
std::list<MessageCellAb *>::iterator iter; //FIXME: maintenir les temps dans les listes get/send/deliverable
printf("LowReceiver::manage_abcast -- init\n"); // pour savoir si l'on peut délivrer les messages dans "deliverable"
static short minimum_waiting_stamp = -1 ;
static short maximum_deliverable_stamp = -1;
static short minimum_deliverable_stamp = -1;
// identifiant = horloge + id_site_emeteur std::list<MessageCellAb *>::iterator iter;
bool iAmTheEmitter = false; printf("LowReceiver::manage_abcast -- init\n");
bool firstSeenMessage = true;
if (mesg->getStamp().getIndex() == _group.getIndex()){ // identifiant = horloge + id_site_emeteur
iAmTheEmitter = true; bool iAmTheEmitter = false;
} bool firstSeenMessage = true;
if (iAmTheEmitter){ if (mesg->getStamp().getIndex() == _group.getIndex()){
printf("LowReceiver::manage_abcast - Received my own message \n"); iAmTheEmitter = true;
//on faire la gestion du abcast/send ici, c'est plus simple que }
//de partager une variable+mutex avec le sender
// chercher si l'on a déja recu ce message if (iAmTheEmitter){
MessageCellAb * cell = NULL; printf("LowReceiver::manage_abcast - Received my own message \n");
for (iter = fifo_send.begin(); iter != fifo_send.end(); iter++){ //on faire la gestion du abcast/send ici, c'est plus simple que
//on fait pointer cell sur la cellule si égale a l'id du message //de partager une variable+mutex avec le sender
//courant
MessageCellAb * cur = *iter;
if (cur->message == mesg){
printf("LowReceiver::manage_abcast -- message seen\n");
firstSeenMessage = false;
cell = cur;
break;
}
}
if (firstSeenMessage){
//sinon on le crée
printf("LowReceiver::manage_abcast -- message is first\n");
cell = new MessageCellAb();
cell->message = new Message(*mesg);
//et on l'ajoute au fifo
fifo_send.push_back(cell);
}
// comparer le timestamp max a ceux que l'on recoit // chercher si l'on a déja recu ce message
cell->count += 1; MessageCellAb * cell = NULL;
if (cell->count == _group.getCount()){ for (iter = fifo_send.begin(); iter != fifo_send.end(); iter++){
// broadcaster le nouveau timestamp du message //on fait pointer cell sur la cellule si égale a l'id du message
// //courant
// le message a broadcaster est exactement le message max MessageCellAb * cur = *iter;
// reçu... mais bon... on le reconstruit quand m^eme if (cur->message == mesg){
// IMPROVE printf("LowReceiver::manage_abcast -- message seen\n");
firstSeenMessage = false;
cell = cur;
break;
}
}
if (firstSeenMessage){
//sinon on le crée
printf("LowReceiver::manage_abcast -- message is first\n");
cell = new MessageCellAb();
cell->message = new Message(*mesg);
//et on l'ajoute au fifo
fifo_send.push_back(cell);
}
TimeStamp st = cell->message->getStamp(); // comparer le timestamp max a ceux que l'on recoit
Message * nMsg = new Message(Protocol::TYPE_ABCAST, cell->count += 1;
st, if (cell->count == _group.getCount()){
cell->maximum->getRaw(), // broadcaster le nouveau timestamp du message
cell->maximum->getRawSize()); //
_group.broadcast(*nMsg); // le message a broadcaster est exactement le message max
// FIXME: délivrer le message // reçu... mais bon... on le reconstruit quand même
} // A AMéLIORER...
} else {
printf("LowReceiver::manage_abcast - Received a message from a friend\n");
for (iter = fifo_get.begin(); iter != fifo_get.end(); iter++){
MessageCellAb * cur = *iter;
if (cur->message == mesg) {
printf("LowReceiver::manage_abcast -- message seen\n");
firstSeenMessage = false;
break;
}
}
if (firstSeenMessage){ TimeStamp st = cell->message->getStamp();
printf("LowReceiver::manage_abcast -- message is first\n"); // on construit un message identifié par le timestamp original
// si le message est vu pour la premiere fois: // et contenant le timestamp final choisi
// - on l'ajoute dans la liste d'attente Message * nMsg = new Message(Protocol::TYPE_ABCAST,
MessageCellAb * cell = new MessageCellAb(); st,
cell->message = new Message(*mesg); cell->maximum->getRaw(),
cell->type = MessageCellAb::TYPE_TEMPORARY; cell->maximum->getRawSize());
// - FIXME: on retourne une estampille(reception) a l'emeteur _group.broadcast(*nMsg);
} else { Message * deliverableMesg = new Message(Protocol::TYPE_ABCAST,
// sinon st,
// - l'estampille du message est mise a jour cell->message->getData(),
TimeStamp * stamp = new TimeStamp (Protocol::TYPE_ABCAST, mesg->getData(), mesg->getDataSize()); cell->message->getDataSize());
// enfiler dans la liste des messager a délivrer, avec l'estampille finale.
fifo_deliverable.push_back(deliverableMesg);
// FIXME: retirer le message_cell de la liste des send...
}
} else {
printf("LowReceiver::manage_abcast - Received a message from a friend\n");
// on cherche si l'on a déja croisé le message
MessageCellAb * cell = NULL;
for (iter = fifo_get.begin(); iter != fifo_get.end(); iter++){
MessageCellAb * cur = *iter;
if (cur->message == mesg) {
printf("LowReceiver::manage_abcast -- message seen\n");
firstSeenMessage = false;
cell = cur;
break;
}
}
if (firstSeenMessage){
printf("LowReceiver::manage_abcast -- message is first\n");
// si le message est vu pour la premiere fois:
// - on l'ajoute dans la liste d'attente
cell = new MessageCellAb();
cell->message = new Message(*mesg);
cell->type = MessageCellAb::TYPE_TEMPORARY;
fifo_get.push_back(cell);
TimeStamp st = cell->message->getStamp();
TimeStamp nSt = _clock.inc();
// - on retourne une estampille(reception) à l'emeteur
// via un message identifié comme le message courant mais contenant
// l'estampille...
Message * nMsg = new Message(Protocol::TYPE_ABCAST,
st,
nSt->getRaw(),
nSt->getRawSize());
_group.sendto(*(cell->message), cell->message->getStamp().getIndex());
} else {
// sinon
// - l'estampille du message est mise a jour
TimeStamp st = mesg->getStamp();
TimeStamp nSt = _clock.inc();
Message * nMsg = new Message(Protocol::TYPE_ABCAST,
st,
nSt->getRaw(),
nSt->getRawSize());
// - le message est marqué comme final
cell->type = MessageCellAb::TYPE_DEFINITIVE;
// - FIXME: on défile les estampille finale la
}
}
// FIXME: prendre les messages à délivrer, dans le bon ordre, et les délivrer...
// - le message est marqué comme final
// - on défile les estampille finale la
}
}
} }