]> rtime.felk.cvut.cz Git - eurobot/public.git/commitdiff
Block real-time signals on startup
authorMichal Sojka <sojkam1@fel.cvut.cz>
Wed, 1 Apr 2009 14:21:27 +0000 (16:21 +0200)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Wed, 1 Apr 2009 14:21:27 +0000 (16:21 +0200)
This is necessary to avoid crashes when stop() is called earlier than
motion-control thread fully starts.

src/robofsm/motion-control.cc
src/robofsm/robot.c

index 40221deb3f440d3e986bce8a5513aea9e01c11b9..7131af75c5a8a7b0e5960379c86fc759bb247673 100644 (file)
@@ -252,11 +252,18 @@ void dummy_handler(int)
 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) {
index f059b4dafe6659d2c499eae0872f2f11cd4d9fb5..84b5fb797c924c5c0c1c45a551b25d8a60ae5de0 100644 (file)
@@ -29,6 +29,18 @@ struct robot robot;
 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();
@@ -107,6 +119,7 @@ int robot_init()
 
        signal(SIGINT, int_handler);
        signal(SIGTERM, int_handler);
+       block_signals();
 
        /* initial values */
        robot.orte.motion_speed.left = 0;