master/master.c
changeset 2040 45706e3273fd
parent 2039 629d3cf05180
child 2042 8b358effa78b
child 2045 ff2a13a4603c
equal deleted inserted replaced
2039:629d3cf05180 2040:45706e3273fd
   414         request->state = EC_INT_REQUEST_FAILURE;
   414         request->state = EC_INT_REQUEST_FAILURE;
   415         kref_put(&request->refcount,ec_master_reg_request_release);
   415         kref_put(&request->refcount,ec_master_reg_request_release);
   416         wake_up(&master->reg_queue);
   416         wake_up(&master->reg_queue);
   417     }
   417     }
   418 
   418 
   419     // we must lock the fsm_queue here because the slave's fsm_datagram will be unqueued
   419     // we must lock the io_mutex here because the slave's fsm_datagram will be unqueued
   420     if (master->fsm_queue_lock_cb)
   420     ec_mutex_lock(&master->io_mutex);
   421         master->fsm_queue_lock_cb(master->fsm_queue_locking_data);
       
   422     ec_mutex_lock(&master->fsm_queue_mutex);
       
   423     for (slave = master->slaves;
   421     for (slave = master->slaves;
   424             slave < master->slaves + master->slave_count;
   422             slave < master->slaves + master->slave_count;
   425             slave++) {
   423             slave++) {
   426         ec_slave_clear(slave);
   424         ec_slave_clear(slave);
   427     }
   425     }
   428     ec_mutex_unlock(&master->fsm_queue_mutex);
   426     ec_mutex_unlock(&master->io_mutex);
   429     if (master->fsm_queue_unlock_cb)
       
   430         master->fsm_queue_unlock_cb(master->fsm_queue_locking_data);
       
   431 
   427 
   432     if (master->slaves) {
   428     if (master->slaves) {
   433         kfree(master->slaves);
   429         kfree(master->slaves);
   434         master->slaves = NULL;
   430         master->slaves = NULL;
   435     }
   431     }
   443  */
   439  */
   444 void ec_master_clear_domains(ec_master_t *master)
   440 void ec_master_clear_domains(ec_master_t *master)
   445 {
   441 {
   446     ec_domain_t *domain, *next;
   442     ec_domain_t *domain, *next;
   447 
   443 
       
   444     // we must lock the io_mutex here because the domains's datagram will be unqueued
       
   445     ec_mutex_lock(&master->io_mutex);
   448     list_for_each_entry_safe(domain, next, &master->domains, list) {
   446     list_for_each_entry_safe(domain, next, &master->domains, list) {
   449         list_del(&domain->list);
   447         list_del(&domain->list);
   450         ec_domain_clear(domain);
   448         ec_domain_clear(domain);
   451         kfree(domain);
   449         kfree(domain);
   452     }
   450     }
       
   451     ec_mutex_unlock(&master->io_mutex);
   453 }
   452 }
   454 
   453 
   455 /*****************************************************************************/
   454 /*****************************************************************************/
   456 
   455 
   457 /** Clear the configuration applied by the application.
   456 /** Clear the configuration applied by the application.