lock io_mutex when unqueueing datagrams; unqueue datagrams from send-receive queue.

This commit is contained in:
Martin Troxler 2011-01-17 11:09:11 +01:00
parent 0f18d720ec
commit 7ddaa2b007
2 changed files with 9 additions and 7 deletions

View File

@ -137,6 +137,9 @@ void ec_datagram_unqueue(ec_datagram_t *datagram /**< EtherCAT datagram. */)
if (!list_empty(&datagram->fsm_queue)) {
list_del_init(&datagram->fsm_queue);
}
if (!list_empty(&datagram->queue)) {
list_del_init(&datagram->queue);
}
}
/*****************************************************************************/

View File

@ -416,18 +416,14 @@ void ec_master_clear_slaves(ec_master_t *master)
wake_up(&master->reg_queue);
}
// we must lock the fsm_queue here because the slave's fsm_datagram will be unqueued
if (master->fsm_queue_lock_cb)
master->fsm_queue_lock_cb(master->fsm_queue_locking_data);
ec_mutex_lock(&master->fsm_queue_mutex);
// we must lock the io_mutex here because the slave's fsm_datagram will be unqueued
ec_mutex_lock(&master->io_mutex);
for (slave = master->slaves;
slave < master->slaves + master->slave_count;
slave++) {
ec_slave_clear(slave);
}
ec_mutex_unlock(&master->fsm_queue_mutex);
if (master->fsm_queue_unlock_cb)
master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
ec_mutex_unlock(&master->io_mutex);
if (master->slaves) {
kfree(master->slaves);
@ -445,11 +441,14 @@ void ec_master_clear_domains(ec_master_t *master)
{
ec_domain_t *domain, *next;
// we must lock the io_mutex here because the domains's datagram will be unqueued
ec_mutex_lock(&master->io_mutex);
list_for_each_entry_safe(domain, next, &master->domains, list) {
list_del(&domain->list);
ec_domain_clear(domain);
kfree(domain);
}
ec_mutex_unlock(&master->io_mutex);
}
/*****************************************************************************/