equal
deleted
inserted
replaced
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 || |