master/master.c
changeset 2090 45e9b47d0841
parent 2084 eefccfa312ef
child 2094 83e9160319ec
equal deleted inserted replaced
2089:adbf7900b848 2090:45e9b47d0841
   841         ec_datagram_t *datagram /**< datagram */
   841         ec_datagram_t *datagram /**< datagram */
   842         )
   842         )
   843 {
   843 {
   844     ec_datagram_t *queued_datagram;
   844     ec_datagram_t *queued_datagram;
   845 
   845 
   846     if (datagram->state == EC_DATAGRAM_SENT)
   846     switch (datagram->state) {
   847         return;
   847         case EC_DATAGRAM_QUEUED:
   848     // check, if the datagram is already queued
   848             datagram->skip_count++;
       
   849             EC_MASTER_DBG(master, 1, "Skipping already queued datagram %p.\n",
       
   850                     datagram);
       
   851             break;
       
   852 
       
   853         case EC_DATAGRAM_SENT:
       
   854             datagram->skip_count++;
       
   855             EC_MASTER_DBG(master, 1, "Skipping already sent datagram %p.\n",
       
   856                     datagram);
       
   857             break;
       
   858 
       
   859         default:
       
   860             break;
       
   861     }
       
   862 
       
   863     /* It is possible, that a datagram in the queue is re-initialized with the
       
   864      * ec_datagram_<type>() methods and then shall be queued with this method.
       
   865      * In that case, the state is already reset to EC_DATAGRAM_INIT. Check if
       
   866      * the datagram is queued to avoid duplicate queuing (which results in an
       
   867      * infinite loop!). Set the state to EC_DATAGRAM_QUEUED again, probably
       
   868      * causing an unmatched datagram. */
   849     list_for_each_entry(queued_datagram, &master->datagram_queue, queue) {
   869     list_for_each_entry(queued_datagram, &master->datagram_queue, queue) {
   850         if (queued_datagram == datagram) {
   870         if (queued_datagram == datagram) {
   851             datagram->skip_count++;
   871             datagram->skip_count++;
   852             EC_MASTER_DBG(master, 1, "skipping datagram %p.\n", datagram);
   872             EC_MASTER_DBG(master, 1, "Skipping re-initialized datagram %p.\n",
       
   873                     datagram);
   853             datagram->state = EC_DATAGRAM_QUEUED;
   874             datagram->state = EC_DATAGRAM_QUEUED;
   854             return;
   875             return;
   855         }
   876         }
   856     }
   877     }
   857 
   878 
   858     list_add_tail(&datagram->queue, &master->datagram_queue);
   879     list_add_tail(&datagram->queue, &master->datagram_queue);
   859     datagram->state = EC_DATAGRAM_QUEUED;
   880     datagram->state = EC_DATAGRAM_QUEUED;
   860 }
   881 }
   861 
       
   862 
   882 
   863 /*****************************************************************************/
   883 /*****************************************************************************/
   864 
   884 
   865 /** Sends the datagrams in the queue.
   885 /** Sends the datagrams in the queue.
   866  *
   886  *