This commit is contained in:
parent
b65e44d8bf
commit
93ef30f24d
1 changed files with 126 additions and 80 deletions
|
@ -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
|
|
||||||
MessageCellAb * cell = NULL;
|
|
||||||
for (iter = fifo_send.begin(); iter != fifo_send.end(); iter++){
|
|
||||||
//on fait pointer cell sur la cellule si égale a l'id du message
|
|
||||||
//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
|
if (iAmTheEmitter){
|
||||||
cell->count += 1;
|
printf("LowReceiver::manage_abcast - Received my own message \n");
|
||||||
if (cell->count == _group.getCount()){
|
//on faire la gestion du abcast/send ici, c'est plus simple que
|
||||||
// broadcaster le nouveau timestamp du message
|
//de partager une variable+mutex avec le sender
|
||||||
//
|
|
||||||
// le message a broadcaster est exactement le message max
|
|
||||||
// reçu... mais bon... on le reconstruit quand m^eme
|
|
||||||
// IMPROVE
|
|
||||||
|
|
||||||
TimeStamp st = cell->message->getStamp();
|
|
||||||
Message * nMsg = new Message(Protocol::TYPE_ABCAST,
|
|
||||||
st,
|
|
||||||
cell->maximum->getRaw(),
|
|
||||||
cell->maximum->getRawSize());
|
|
||||||
_group.broadcast(*nMsg);
|
|
||||||
// FIXME: délivrer le message
|
|
||||||
}
|
|
||||||
} 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){
|
// chercher si l'on a déja recu ce message
|
||||||
printf("LowReceiver::manage_abcast -- message is first\n");
|
MessageCellAb * cell = NULL;
|
||||||
// si le message est vu pour la premiere fois:
|
for (iter = fifo_send.begin(); iter != fifo_send.end(); iter++){
|
||||||
// - on l'ajoute dans la liste d'attente
|
//on fait pointer cell sur la cellule si égale a l'id du message
|
||||||
MessageCellAb * cell = new MessageCellAb();
|
//courant
|
||||||
cell->message = new Message(*mesg);
|
MessageCellAb * cur = *iter;
|
||||||
cell->type = MessageCellAb::TYPE_TEMPORARY;
|
if (cur->message == mesg){
|
||||||
// - FIXME: on retourne une estampille(reception) a l'emeteur
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
// comparer le timestamp max a ceux que l'on recoit
|
||||||
// sinon
|
cell->count += 1;
|
||||||
// - l'estampille du message est mise a jour
|
if (cell->count == _group.getCount()){
|
||||||
TimeStamp * stamp = new TimeStamp (Protocol::TYPE_ABCAST, mesg->getData(), mesg->getDataSize());
|
// broadcaster le nouveau timestamp du message
|
||||||
|
//
|
||||||
|
// le message a broadcaster est exactement le message max
|
||||||
|
// reçu... mais bon... on le reconstruit quand même
|
||||||
|
// A AMéLIORER...
|
||||||
|
|
||||||
// - le message est marqué comme final
|
TimeStamp st = cell->message->getStamp();
|
||||||
// - on défile les estampille finale la
|
// on construit un message identifié par le timestamp original
|
||||||
}
|
// et contenant le timestamp final choisi
|
||||||
}
|
Message * nMsg = new Message(Protocol::TYPE_ABCAST,
|
||||||
|
st,
|
||||||
|
cell->maximum->getRaw(),
|
||||||
|
cell->maximum->getRawSize());
|
||||||
|
_group.broadcast(*nMsg);
|
||||||
|
|
||||||
|
Message * deliverableMesg = new Message(Protocol::TYPE_ABCAST,
|
||||||
|
st,
|
||||||
|
cell->message->getData(),
|
||||||
|
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...
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue