From 997c81b6fad33fcb3eed89b91934b01d8ea6fad4 Mon Sep 17 00:00:00 2001 From: Bjarne von Horn Date: Wed, 15 May 2024 18:07:38 +0200 Subject: [PATCH] use separate queue for external datagrams to avoid corrupting master::queue --- master/datagram.h | 4 +++- master/master.c | 6 +++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/master/datagram.h b/master/datagram.h index adf438cc..13184928 100644 --- a/master/datagram.h +++ b/master/datagram.h @@ -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. */ diff --git a/master/master.c b/master/master.c index d327337a..0a5f316a 100644 --- a/master/master.c +++ b/master/master.c @@ -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);