Skip to content
Snippets Groups Projects
Commit 67ce7cd0 authored by Florian Pose's avatar Florian Pose
Browse files

Improved ecrt_master_queue_datagram(); detect skipped datagrams also when

already sent.

--HG--
branch : stable-1.5
parent aa139574
No related branches found
No related tags found
No related merge requests found
/****************************************************************************** /******************************************************************************
* *
* $Id$ * $Id: master.c,v b5391b329b5d 2010/11/30 14:24:21 fp $
* *
* Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH * Copyright (C) 2006-2008 Florian Pose, Ingenieurgemeinschaft IgH
* *
...@@ -821,22 +821,24 @@ void ec_master_queue_datagram( ...@@ -821,22 +821,24 @@ void ec_master_queue_datagram(
ec_datagram_t *datagram /**< datagram */ ec_datagram_t *datagram /**< datagram */
) )
{ {
ec_datagram_t *queued_datagram; switch (datagram->state) {
case EC_DATAGRAM_QUEUED:
datagram->skip_count++;
EC_MASTER_DBG(master, 1, "Skipping already queued datagram %p.\n",
datagram);
break;
if (datagram->state == EC_DATAGRAM_SENT) case 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) {
datagram->skip_count++; datagram->skip_count++;
EC_MASTER_DBG(master, 1, "skipping datagram %p.\n", datagram); 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; datagram->state = EC_DATAGRAM_QUEUED;
return; break;
}
} }
list_add_tail(&datagram->queue, &master->datagram_queue);
datagram->state = EC_DATAGRAM_QUEUED;
} }
/*****************************************************************************/ /*****************************************************************************/
...@@ -1303,7 +1305,8 @@ static int ec_master_operation_thread(void *priv_data) ...@@ -1303,7 +1305,8 @@ static int ec_master_operation_thread(void *priv_data)
} }
up(&master->master_sem); 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) if (fsm_exec)
master->injection_seq_fsm++; master->injection_seq_fsm++;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment