--- rpl/src/instructions_d5.c 2013/05/23 12:45:08 1.110 +++ rpl/src/instructions_d5.c 2013/05/28 22:09:55 1.111 @@ -1452,6 +1452,30 @@ instruction_detach(struct_processus *s_e exit(EXIT_FAILURE); } + pthread_mutex_trylock(&((*s_etat_processus).mutex_interruptions)); + + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions)) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + + caractere = 0; + + while((longueur_ecriture = write_atomic(s_etat_processus, + (*s_argument_thread).pipe_nombre_elements_attente[1], + &caractere, sizeof(caractere))) != sizeof(caractere)) + { + if (longueur_ecriture == -1) + { + break; + } + } + + destruction_queue_signaux(s_etat_processus); + BUG(1, uprintf("Process management error line %d\n", __LINE__)); + exit(EXIT_FAILURE); + } + if ((*s_etat_processus).evaluation_expression_compilee == 'N') { free((*s_etat_processus).instruction_courante); @@ -2367,11 +2391,31 @@ instruction_detach(struct_processus *s_e } } + if (pthread_mutex_lock(&((*s_etat_processus).mutex_interruptions)) + != 0) + { + destruction_queue_signaux(s_etat_processus); + + pthread_mutex_unlock(&((*s_etat_processus).mutex)); + (*s_etat_processus).erreur_systeme = d_es_processus; + exit(EXIT_FAILURE); + } + if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) { affectation_interruptions_logicielles(s_etat_processus); } + if (pthread_mutex_unlock(&((*s_etat_processus) + .mutex_interruptions)) != 0) + { + destruction_queue_signaux(s_etat_processus); + + pthread_mutex_unlock(&((*s_etat_processus).mutex)); + (*s_etat_processus).erreur_systeme = d_es_processus; + exit(EXIT_FAILURE); + } + pthread_mutex_unlock(&((*s_etat_processus).mutex)); nanosleep(&attente, NULL); pthread_mutex_lock(&((*s_etat_processus).mutex)); @@ -2704,6 +2748,7 @@ instruction_detach(struct_processus *s_e pthread_mutex_destroy(&((*s_etat_processus).mutex)); pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_interruptions)); pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); pthread_mutex_destroy(&mutex_sections_critiques);