diff --git a/src/TODO b/src/TODO index 0e65ad0..db2c500 100644 --- a/src/TODO +++ b/src/TODO @@ -1,2 +1,3 @@ dans la RFC, indiquer si le temps commence à 0 ou à 1 indiquer si l'index de la machine commence à 0 ou à 1 +envoyer les messages au highreceiver diff --git a/src/clock.h b/src/clock.h index be06acd..9503def 100644 --- a/src/clock.h +++ b/src/clock.h @@ -23,7 +23,7 @@ class Clock { public: virtual TimeStamp inc() = 0; - virtual void adjust(TimeStamp timestamp) = 0; + virtual bool adjust(TimeStamp timestamp) = 0; }; #endif diff --git a/src/clock_ab.cc b/src/clock_ab.cc index 1f26680..a24e1fc 100644 --- a/src/clock_ab.cc +++ b/src/clock_ab.cc @@ -20,6 +20,6 @@ TimeStamp ClockAb::inc(){ return ts; } -void ClockAb::adjust(TimeStamp ts){ +bool ClockAb::adjust(TimeStamp ts){ printf("ClockAb::adjust -- NOT IMPLEMENTED\n"); } diff --git a/src/clock_ab.h b/src/clock_ab.h index 55656e7..ffd38ea 100644 --- a/src/clock_ab.h +++ b/src/clock_ab.h @@ -13,7 +13,7 @@ class ClockAb : public Clock { ClockAb(size_t index); virtual TimeStamp inc(); - virtual void adjust(TimeStamp stamp); + virtual bool adjust(TimeStamp stamp); }; #endif diff --git a/src/clock_cb.cc b/src/clock_cb.cc index 053f40d..699d92b 100644 --- a/src/clock_cb.cc +++ b/src/clock_cb.cc @@ -18,7 +18,14 @@ ClockCb::ClockCb(size_t size, size_t index){ } } -void ClockCb::adjust(TimeStamp ts){ +bool ClockCb::adjust(TimeStamp ts){ + bool result = false; + // lock jusqu'a la fin de la fonction + Glib::Mutex::Lock lock(_mutex); + // si les conditions sont remplies, alors on peut modifier l'horloge + + + return result; } TimeStamp ClockCb::inc(){ diff --git a/src/clock_cb.h b/src/clock_cb.h index 47e6e4d..630e2d3 100644 --- a/src/clock_cb.h +++ b/src/clock_cb.h @@ -13,7 +13,7 @@ class ClockCb : public Clock { ClockCb(size_t size, size_t index); virtual TimeStamp inc(); - virtual void adjust(TimeStamp stamp); + virtual bool adjust(TimeStamp stamp); }; #endif diff --git a/src/clock_test.cc b/src/clock_test.cc index f38977c..f2826b9 100644 --- a/src/clock_test.cc +++ b/src/clock_test.cc @@ -10,6 +10,6 @@ TimeStamp ClockTest::inc(){ //prin } -void ClockTest::adjust(TimeStamp ts){ +bool ClockTest::adjust(TimeStamp ts){ //do nothing } diff --git a/src/clock_test.h b/src/clock_test.h index 2feb759..53fb202 100644 --- a/src/clock_test.h +++ b/src/clock_test.h @@ -14,7 +14,7 @@ class ClockTest : public Clock { public: ClockTest(); //int truc, int truc); virtual TimeStamp inc(); - virtual void adjust(TimeStamp stamp); + virtual bool adjust(TimeStamp stamp); }; #endif diff --git a/src/config.cc b/src/config.cc index ba5a0a4..54f62e9 100644 --- a/src/config.cc +++ b/src/config.cc @@ -122,7 +122,7 @@ bool Config::isValid() { } valid++; - if (_index > 0) { + if (_index >= 0) { score++; } valid++; diff --git a/src/dabroadcast.cc b/src/dabroadcast.cc index 73037e5..608ded5 100644 --- a/src/dabroadcast.cc +++ b/src/dabroadcast.cc @@ -30,7 +30,7 @@ int main(int argc, char ** argv){ Clock * clk; short portHigh = -1; - HighReceiver high_receiver; + HighReceiver high_receiver(config.getPort()+1); portHigh = high_receiver.getPort(); diff --git a/src/highreceiver.cc b/src/highreceiver.cc index b315611..547b95b 100644 --- a/src/highreceiver.cc +++ b/src/highreceiver.cc @@ -7,10 +7,12 @@ #include #include -HighReceiver::HighReceiver(){ +HighReceiver::HighReceiver(short low_port){ printf("LowReceiver::LowReceiver --"); + _port = low_port + 1; + _socket_desc = socket(AF_INET, SOCK_DGRAM, 0); /* et l'autre variante : AF_UNIX */ @@ -29,7 +31,7 @@ HighReceiver::HighReceiver(){ // port_high = interne bzero(_socket_addr,sizeof(sockaddr_in)); _socket_addr->sin_family = AF_INET; - _socket_addr->sin_port = 0; //FIXME random port ? + _socket_addr->sin_port = htons(_port); _socket_addr->sin_addr.s_addr = htonl(INADDR_ANY); // chopper une socket @@ -39,7 +41,6 @@ HighReceiver::HighReceiver(){ fprintf(stderr,"BOUM at %s:%d",__FILE__,__LINE__); exit(-1); } - //FIXME: initialiser le port } short HighReceiver::getPort(){ diff --git a/src/highreceiver.h b/src/highreceiver.h index e634365..3ce44f9 100644 --- a/src/highreceiver.h +++ b/src/highreceiver.h @@ -9,7 +9,7 @@ class HighReceiver { protected: public: - HighReceiver(); + HighReceiver(short low_port); ~HighReceiver(); void run(); // thread part diff --git a/src/lowreceiver_cb.cc b/src/lowreceiver_cb.cc index f421274..6d0a73c 100644 --- a/src/lowreceiver_cb.cc +++ b/src/lowreceiver_cb.cc @@ -4,8 +4,8 @@ void LowReceiver::manage_cbcast(Message * mesg) { - static std::list fifo_get; - static std::list fifo_send; + static std::list fifo_undelivered; + //static std::list fifo_send; std::list::iterator iter; printf("LowReceiver::manage_cbcast -- init\n"); @@ -19,76 +19,17 @@ void LowReceiver::manage_cbcast(Message * mesg) { } if (iAmTheEmitter){ - printf("LowReceiver::manage_cbcast - Received my own message \n"); + printf("LowReceiver::manage_cbcast - Received my own message -- delivering automatically\n"); //on faire la gestion du cbcast/send ici, c'est plus simple que //de partager une variable+mutex avec le sender - //FIXME: chercher si l'on a déja recu ce message - MessageCellCb * 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 - MessageCellCb * cur = *iter; - if (cur->message == mesg){ - printf("LowReceiver::manage_cbcast -- message seen\n"); - firstSeenMessage = false; - cell = cur; - break; - } - } - if (firstSeenMessage){ - //sinon on le crée - printf("LowReceiver::manage_cbcast -- message is first\n"); - cell = new MessageCellCb(); - cell->message = new Message(*mesg); - //et on l'ajoute au fifo - fifo_send.push_back(cell); - } - //FIXME: comparer le timestamp max a ceux que l'on recoit - cell->count += 1; - if (cell->count == _group.getCount()){ - // broadcaster le nouveau timestamp du message - // - // 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); - } + } else { printf("LowReceiver::manage_cbcast - Received a message from a friend\n"); - for (iter = fifo_get.begin(); iter != fifo_get.end(); iter++){ - MessageCellCb * cur = *iter; - if (cur->message == mesg) { - printf("LowReceiver::manage_cbcast -- message seen\n"); - firstSeenMessage = false; - break; - } - } - - if (firstSeenMessage){ - printf("LowReceiver::manage_cbcast -- message is first\n"); - // si le message est vu pour la premiere fois: - // - on l'ajoute dans la liste d'attente - MessageCellCb * cell = new MessageCellCb(); - cell->message = new Message(*mesg); - cell->type = MessageCellCb::TYPE_TEMPORARY; - // - on retourne une estampille(reception) a l'emeteur - - } else { - // sinon - // - l'estampille du message est mise a jour - TimeStamp * stamp = new TimeStamp (Protocol::TYPE_ABCAST, mesg->getData(), mesg->getDataSize()); - - // - le message est marqué comme final - // - on défile les estampille finale la - } + // FIXME: si l'horloge est ajustable + // (donc les contraintes TS_m[j] = TS_m[j]+1 && ... ), + // alors on délivre directement } }