master/master.c
changeset 1198 be606e9caba4
parent 1197 f65f9c36ba33
child 1200 ce1a65f06efc
child 1642 9e1f528b8bdd
equal deleted inserted replaced
1197:f65f9c36ba33 1198:be606e9caba4
   311 int ec_master_thread_start(
   311 int ec_master_thread_start(
   312         ec_master_t *master, /**< EtherCAT master */
   312         ec_master_t *master, /**< EtherCAT master */
   313         int (*thread_func)(ec_master_t *) /**< thread function to start */
   313         int (*thread_func)(ec_master_t *) /**< thread function to start */
   314         )
   314         )
   315 {
   315 {
       
   316     init_completion(&master->thread_can_terminate);
   316     init_completion(&master->thread_exit);
   317     init_completion(&master->thread_exit);
   317 
   318 
   318     EC_INFO("Starting master thread.\n");
   319     EC_INFO("Starting master thread.\n");
   319     if (!(master->thread_id = kernel_thread((int (*)(void *)) thread_func,
   320     if (!(master->thread_id = kernel_thread((int (*)(void *)) thread_func,
   320                     master, CLONE_KERNEL)))
   321                     master, CLONE_KERNEL)))
   339     }
   340     }
   340 
   341 
   341     if (master->debug_level)
   342     if (master->debug_level)
   342         EC_DBG("Stopping master thread.\n");
   343         EC_DBG("Stopping master thread.\n");
   343 
   344 
       
   345     // wait until thread is ready to receive the SIGTERM
       
   346     wait_for_completion(&master->thread_can_terminate);
       
   347 
   344     kill_proc(master->thread_id, SIGTERM, 1);
   348     kill_proc(master->thread_id, SIGTERM, 1);
   345     wait_for_completion(&master->thread_exit);
   349     wait_for_completion(&master->thread_exit);
   346     EC_INFO("Master thread exited.\n");
   350     EC_INFO("Master thread exited.\n");
   347 
   351 
   348     if (master->fsm_datagram.state != EC_DATAGRAM_SENT) return;
   352     if (master->fsm_datagram.state != EC_DATAGRAM_SENT)
       
   353         return;
   349     
   354     
   350     // wait for FSM datagram
   355     // wait for FSM datagram
   351     sleep_jiffies = max(HZ / 100, 1); // 10 ms, at least 1 jiffy
   356     sleep_jiffies = max(HZ / 100, 1); // 10 ms, at least 1 jiffy
   352     schedule_timeout(sleep_jiffies);
   357     schedule_timeout(sleep_jiffies);
   353 }
   358 }
   820  */
   825  */
   821 static int ec_master_idle_thread(ec_master_t *master)
   826 static int ec_master_idle_thread(ec_master_t *master)
   822 {
   827 {
   823     daemonize("EtherCAT-IDLE");
   828     daemonize("EtherCAT-IDLE");
   824     allow_signal(SIGTERM);
   829     allow_signal(SIGTERM);
       
   830     complete(&master->thread_can_terminate);
   825 
   831 
   826     while (!signal_pending(current)) {
   832     while (!signal_pending(current)) {
   827         ec_datagram_output_stats(&master->fsm_datagram);
   833         ec_datagram_output_stats(&master->fsm_datagram);
   828 
   834 
   829         // receive
   835         // receive
   867  */
   873  */
   868 static int ec_master_operation_thread(ec_master_t *master)
   874 static int ec_master_operation_thread(ec_master_t *master)
   869 {
   875 {
   870     daemonize("EtherCAT-OP");
   876     daemonize("EtherCAT-OP");
   871     allow_signal(SIGTERM);
   877     allow_signal(SIGTERM);
       
   878     complete(&master->thread_can_terminate);
   872 
   879 
   873     while (!signal_pending(current)) {
   880     while (!signal_pending(current)) {
   874         ec_datagram_output_stats(&master->fsm_datagram);
   881         ec_datagram_output_stats(&master->fsm_datagram);
   875         if (master->injection_seq_rt != master->injection_seq_fsm ||
   882         if (master->injection_seq_rt != master->injection_seq_fsm ||
   876                 master->fsm_datagram.state == EC_DATAGRAM_SENT ||
   883                 master->fsm_datagram.state == EC_DATAGRAM_SENT ||