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. /** EtherCAT datagram.
*/ */
typedef struct { 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. */ struct list_head sent; /**< Master list item for sent datagrams. */
ec_device_index_t device_index; /**< Device via which the datagram shall ec_device_index_t device_index; /**< Device via which the datagram shall
be / was sent. */ be / was sent. */

View File

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