--- rpl/src/interruptions.c 2010/08/17 11:59:28 1.30 +++ rpl/src/interruptions.c 2010/08/17 14:15:20 1.31 @@ -1774,6 +1774,8 @@ queue_de_signal(int signal) switch(signal) { case SIGINT: + BUG(1, uprintf("SIGINT is not queued as it does not " + "come from program itself !\n")); return(0); case SIGTSTP: return(1); @@ -1929,7 +1931,7 @@ creation_fifos_signaux(struct_processus */ pthread_mutexattr_init(&attributs_mutex); - pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); for(i = 0; i < nombre_queues; i++) { @@ -1962,6 +1964,7 @@ void destruction_fifos_signaux(struct_processus *s_etat_processus) { int i; + unsigned char *nom; if (shmdt(fifos) == -1) @@ -2124,7 +2127,6 @@ origine_signal(int signal) if (pthread_mutex_lock(&(mutexes[queue])) != 0) { - perror("lock"); return(-1); } @@ -2136,7 +2138,6 @@ origine_signal(int signal) if (base[3] > base[2]) { - uprintf("Base\n"); pthread_mutex_unlock(&(mutexes[queue])); return(-1); } @@ -2163,7 +2164,17 @@ interruption1(SIGHANDLER_ARGS) volatile sig_atomic_t exclusion = 0; # ifdef _BROKEN_SIGINFO - pid = origine_signal(signal); + if (signal == SIGINT) + { + // Si l'interruption provient du clavier, il n'y a pas eu d'appel + // à queue_in(). + + pid = getpid(); + } + else + { + pid = origine_signal(signal); + } # else pid = (*siginfo).si_pid; # endif @@ -2880,7 +2891,7 @@ rpl_kill(pid_t pid, int signal) * queue. */ - if (signal != 0) + if ((signal != 0) && (signal != SIGINT)) { if (queue_in(pid, signal) != 0) { @@ -2894,7 +2905,7 @@ rpl_kill(pid_t pid, int signal) int rpl_pthread_kill(pthread_t tid, int signal) { - if (signal != 0) + if ((signal != 0) && (signal != SIGINT)) { if (queue_in(getpid(), signal) != 0) {