--- rpl/src/sequenceur.c 2019/02/03 14:41:30 1.105 +++ rpl/src/sequenceur.c 2024/01/09 07:33:56 1.113 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.31 - Copyright (C) 1989-2019 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.35 + Copyright (C) 1989-2024 Dr. BERTRAND Joël This file is part of RPL/2. @@ -134,7 +134,7 @@ sequenceur(struct_processus *s_etat_proc */ action.sa_handler = SIG_IGN; - action.sa_flags = SA_NODEFER | SA_ONSTACK; + action.sa_flags = 0; (*s_etat_processus).execution_pas_suivant = d_faux; (*s_etat_processus).traitement_instruction_halt = d_vrai; @@ -162,14 +162,22 @@ sequenceur(struct_processus *s_etat_proc fflush(stdout); } + if (pthread_mutex_lock(&mutex_sigaction) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(d_erreur); + } + if (sigaction(SIGINT, &action, &action_defaut) != 0) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_signal; return(d_erreur); } if (sigaction(SIGTSTP, &action, &action_defaut2) != 0) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_signal; return(d_erreur); } @@ -203,6 +211,7 @@ sequenceur(struct_processus *s_etat_proc (*s_etat_processus).localisation, d_locale)) == NULL) { + pthread_mutex_unlock(&mutex_sigaction); free((*s_etat_processus).instruction_courante); return(d_erreur); } @@ -212,6 +221,7 @@ sequenceur(struct_processus *s_etat_proc if ((ligne = compactage(s_etat_processus, ligne)) == NULL) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return(d_erreur); @@ -220,16 +230,24 @@ sequenceur(struct_processus *s_etat_proc if (sigaction(SIGINT, &action_defaut, NULL) != 0) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_signal; return(d_erreur); } if (sigaction(SIGTSTP, &action_defaut2, NULL) != 0) { + pthread_mutex_unlock(&mutex_sigaction); (*s_etat_processus).erreur_systeme = d_es_signal; return(d_erreur); } + if (pthread_mutex_unlock(&mutex_sigaction) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return(d_erreur); + } + if (ligne == NULL) { if ((ligne = (unsigned char *) malloc(6 *