--- rpl/src/interruptions.c 2010/04/28 11:05:45 1.10 +++ rpl/src/interruptions.c 2010/04/29 15:47:25 1.12 @@ -394,6 +394,11 @@ retrait_thread_surveillance(struct_proce if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0) { +# ifndef SEMAPHORES_NOMMES + sem_post(&semaphore_liste_threads); +# else + sem_post(semaphore_liste_threads); +# endif pthread_sigmask(SIG_SETMASK, &oldset, NULL); sigpending(&set); @@ -411,6 +416,11 @@ retrait_thread_surveillance(struct_proce { if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) { +# ifndef SEMAPHORES_NOMMES + sem_post(&semaphore_liste_threads); +# else + sem_post(semaphore_liste_threads); +# endif pthread_sigmask(SIG_SETMASK, &oldset, NULL); sigpending(&set); @@ -425,6 +435,11 @@ retrait_thread_surveillance(struct_proce { if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) { +# ifndef SEMAPHORES_NOMMES + sem_post(&semaphore_liste_threads); +# else + sem_post(semaphore_liste_threads); +# endif pthread_sigmask(SIG_SETMASK, &oldset, NULL); sigpending(&set); @@ -1291,6 +1306,7 @@ liberation_threads(struct_processus *s_e if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; + sem_post(&semaphore_liste_threads); return; } @@ -1305,6 +1321,7 @@ liberation_threads(struct_processus *s_e if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; + sem_post(&semaphore_liste_threads); return; } @@ -1316,6 +1333,7 @@ liberation_threads(struct_processus *s_e if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; + sem_post(&semaphore_liste_threads); return; } } @@ -1957,6 +1975,11 @@ interruption5(int signal, siginfo_t *sig return; } + if (signal == SIGFABORT) + { + (*s_etat_processus).arret_depuis_abort = -1; + } + if (((*s_etat_processus).type_debug & d_debug_signaux) != 0) { if (signal == SIGFSTOP) @@ -1980,25 +2003,29 @@ interruption5(int signal, siginfo_t *sig * -1 -> traitement retardé (un ou plusieurs signaux stop reçus) */ - if (signal == SIGFSTOP) + if ((*s_etat_processus).var_volatile_traitement_retarde_stop == 0) { - if ((*s_etat_processus).var_volatile_traitement_retarde_stop == 0) - { - (*s_etat_processus).var_volatile_requete_arret = -1; - } - else - { - (*s_etat_processus).var_volatile_traitement_retarde_stop = -1; - } + (*s_etat_processus).var_volatile_requete_arret = -1; } else { - (*s_etat_processus).var_volatile_requete_arret = -1; - (*s_etat_processus).arret_depuis_abort = -1; + (*s_etat_processus).var_volatile_traitement_retarde_stop = -1; } } else { + if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) + == NULL) + { + deverrouillage_gestionnaire_signaux(); + return; + } + + if (signal == SIGFABORT) + { + (*s_etat_processus).arret_depuis_abort = -1; + } + // Envoi d'un signal au thread maître du groupe. if (recherche_thread_principal(getpid(), &thread) == d_vrai) @@ -2127,7 +2154,7 @@ interruption9(int signal, siginfo_t *sig fflush(stdout); } - pthread_kill((*s_etat_processus).tid_processus_pere, SIGFSTOP); + pthread_kill((*s_etat_processus).tid_processus_pere, SIGFABORT); deverrouillage_gestionnaire_signaux(); return; }