This is necessary to avoid crashes when stop() is called earlier than
motion-control thread fully starts.
void *thread_trajectory_follower(void *arg)
{
struct timespec next;
+ sigset_t sigset;
int ret;
// Register an empty handler, so that clock_nanosleep bellow
// is interrupted by this signal.
signal(SIG_DO_CONTROL_NOW, dummy_handler);
+
+ sigemptyset(&sigset);
+ sigaddset(&sigset, SIG_DO_CONTROL_NOW);
+ pthread_sigmask(SIG_UNBLOCK, &sigset, (sigset_t*) NULL);
+
+
clock_gettime(CLOCK_MONOTONIC, &next);
while (1) {
struct lock_log robot_lock_log;
#endif
+static void block_signals()
+{
+ sigset_t sigset;
+ int i;
+
+ sigemptyset(&sigset);
+ for (i=SIGRTMIN; i<=SIGRTMAX; i++)
+ sigaddset(&sigset, i);
+
+ pthread_sigmask(SIG_BLOCK, &sigset, (sigset_t*)NULL);
+}
+
static void int_handler(int sig)
{
robot_exit();
signal(SIGINT, int_handler);
signal(SIGTERM, int_handler);
+ block_signals();
/* initial values */
robot.orte.motion_speed.left = 0;