From ae060ff2675dbb1759b0a000957874332c8ffd06 Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Fri, 8 Jul 2011 14:26:25 +0200 Subject: [PATCH] Improved ecrt_master_queue_datagram(); detect skipped datagrams also when already sent. --- master/master.c | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/master/master.c b/master/master.c index 3e7708fd..5a9d1920 100644 --- a/master/master.c +++ b/master/master.c @@ -821,22 +821,24 @@ void ec_master_queue_datagram( ec_datagram_t *datagram /**< datagram */ ) { - ec_datagram_t *queued_datagram; - - if (datagram->state == EC_DATAGRAM_SENT) - return; - // check, if the datagram is already queued - list_for_each_entry(queued_datagram, &master->datagram_queue, queue) { - if (queued_datagram == datagram) { + switch (datagram->state) { + case EC_DATAGRAM_QUEUED: datagram->skip_count++; - EC_MASTER_DBG(master, 1, "skipping datagram %p.\n", datagram); - datagram->state = EC_DATAGRAM_QUEUED; - return; - } - } + EC_MASTER_DBG(master, 1, "Skipping already queued datagram %p.\n", + datagram); + break; - list_add_tail(&datagram->queue, &master->datagram_queue); - datagram->state = EC_DATAGRAM_QUEUED; + case EC_DATAGRAM_SENT: + datagram->skip_count++; + EC_MASTER_DBG(master, 1, "Skipping already sent datagram %p.\n", + datagram); + break; + + default: + list_add_tail(&datagram->queue, &master->datagram_queue); + datagram->state = EC_DATAGRAM_QUEUED; + break; + } } /*****************************************************************************/ @@ -1303,7 +1305,8 @@ static int ec_master_operation_thread(void *priv_data) } up(&master->master_sem); - // inject datagrams (let the rt thread queue them, see ecrt_master_send) + // inject datagrams (let the rt thread queue them, see + // ecrt_master_send) if (fsm_exec) master->injection_seq_fsm++; }