# HG changeset patch # User Florian Pose # Date 1218203243 0 # Node ID be606e9caba4f263a546d24dc70b554117d29b62 # Parent f65f9c36ba33d72c528903af3dd40cfb699906fd Fixed race concerning thread signaling when master thread had no opportunity to run, but shall be killed immediately. diff -r f65f9c36ba33 -r be606e9caba4 master/master.c --- a/master/master.c Fri Aug 08 13:42:46 2008 +0000 +++ b/master/master.c Fri Aug 08 13:47:23 2008 +0000 @@ -313,6 +313,7 @@ int (*thread_func)(ec_master_t *) /**< thread function to start */ ) { + init_completion(&master->thread_can_terminate); init_completion(&master->thread_exit); EC_INFO("Starting master thread.\n"); @@ -341,11 +342,15 @@ if (master->debug_level) EC_DBG("Stopping master thread.\n"); + // wait until thread is ready to receive the SIGTERM + wait_for_completion(&master->thread_can_terminate); + kill_proc(master->thread_id, SIGTERM, 1); wait_for_completion(&master->thread_exit); EC_INFO("Master thread exited.\n"); - if (master->fsm_datagram.state != EC_DATAGRAM_SENT) return; + if (master->fsm_datagram.state != EC_DATAGRAM_SENT) + return; // wait for FSM datagram sleep_jiffies = max(HZ / 100, 1); // 10 ms, at least 1 jiffy @@ -822,6 +827,7 @@ { daemonize("EtherCAT-IDLE"); allow_signal(SIGTERM); + complete(&master->thread_can_terminate); while (!signal_pending(current)) { ec_datagram_output_stats(&master->fsm_datagram); @@ -869,6 +875,7 @@ { daemonize("EtherCAT-OP"); allow_signal(SIGTERM); + complete(&master->thread_can_terminate); while (!signal_pending(current)) { ec_datagram_output_stats(&master->fsm_datagram); diff -r f65f9c36ba33 -r be606e9caba4 master/master.h --- a/master/master.h Fri Aug 08 13:42:46 2008 +0000 +++ b/master/master.h Fri Aug 08 13:47:23 2008 +0000 @@ -135,6 +135,13 @@ call to ecrt_master_receive(). */ int thread_id; /**< Master thread PID. */ + struct completion thread_can_terminate; /**< Thread termination completion + object. When stopping the + thread, it must be assured, that + it 'hears' a SIGTERM, therefore + the allow_singal() function must + have been called. + */ struct completion thread_exit; /**< Thread completion object. */ #ifdef EC_EOE