use separate queue for external datagrams to avoid corrupting master::queue

This commit is contained in:
Bjarne von Horn
2024-05-15 18:07:38 +02:00
parent 783bc19600
commit 997c81b6fa
2 changed files with 6 additions and 4 deletions

View File

@@ -77,7 +77,9 @@ typedef enum {
/** EtherCAT datagram.
*/
typedef struct {
struct list_head queue; /**< Master datagram queue item. */
struct list_head queue; /**< Master datagram queue item,
protected by user-supplied mutex. */
struct list_head ext_queue; /**< External datagram queue item, protected by ext_queue_sem. */
struct list_head sent; /**< Master list item for sent datagrams. */
ec_device_index_t device_index; /**< Device via which the datagram shall
be / was sent. */

View File

@@ -971,7 +971,7 @@ void ec_master_queue_datagram_ext(
)
{
down(&master->ext_queue_sem);
list_add_tail(&datagram->queue, &master->ext_datagram_queue);
list_add_tail(&datagram->ext_queue, &master->ext_datagram_queue);
up(&master->ext_queue_sem);
}
@@ -2525,8 +2525,8 @@ int ecrt_master_send_ext(ec_master_t *master)
down(&master->ext_queue_sem);
list_for_each_entry_safe(datagram, next, &master->ext_datagram_queue,
queue) {
list_del(&datagram->queue);
ext_queue) {
list_del_init(&datagram->ext_queue);
ec_master_queue_datagram(master, datagram);
}
up(&master->ext_queue_sem);