--- rpl/src/instructions_d5.c 2010/03/06 18:29:07 1.7 +++ rpl/src/instructions_d5.c 2010/05/19 09:22:34 1.21 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.12 + RPL/2 (R) version 4.0.15 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -1062,6 +1062,12 @@ instruction_detach(struct_processus *s_e return; } + if (sigaddset(&set, SIGFABORT) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + if (sigaddset(&set, SIGURG) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1290,21 +1296,65 @@ instruction_detach(struct_processus *s_e * Processus fils */ +# ifdef DEBUG_MEMOIRE + debug_memoire_reinitialisation(); +# endif + +# ifndef SEMAPHORES_NOMMES sem_post(&semaphore_gestionnaires_signaux); sem_destroy(&semaphore_gestionnaires_signaux); sem_init(&semaphore_gestionnaires_signaux, 0, 0); +# else + sem_post(semaphore_gestionnaires_signaux); + sem_destroy2(semaphore_gestionnaires_signaux, + sem_gestionnaires_signaux); + if ((semaphore_gestionnaires_signaux = sem_init2(0, + sem_gestionnaires_signaux)) == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + } +# endif + +# ifndef SEMAPHORES_NOMMES sem_post(&semaphore_liste_threads); sem_destroy(&semaphore_liste_threads); sem_init(&semaphore_liste_threads, 0, 1); +# else + sem_post(semaphore_liste_threads); + sem_destroy2(semaphore_liste_threads, sem_liste_threads); + + if ((semaphore_liste_threads = sem_init2(1, + sem_liste_threads)) == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + } +# endif +# ifndef SEMAPHORES_NOMMES sem_destroy(&semaphore_gestionnaires_signaux_atomique); sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); - sem_trywait(&((*s_etat_processus).semaphore_fork)); +# else + sem_destroy2(semaphore_gestionnaires_signaux_atomique, + sem_gestionnaires_signaux_atomique); + + if ((semaphore_gestionnaires_signaux_atomique = sem_init2(1, + sem_gestionnaires_signaux_atomique)) == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + } + + sem_trywait((*s_etat_processus).semaphore_fork); +# endif +# ifndef SEMAPHORES_NOMMES if (pthread_setspecific(semaphore_fork_processus_courant, &((*s_etat_processus).semaphore_fork)) != 0) +# else + if (pthread_setspecific(semaphore_fork_processus_courant, + (*s_etat_processus).semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; } @@ -1482,6 +1532,9 @@ instruction_detach(struct_processus *s_e (*s_etat_processus).nombre_interruptions_non_affectees = 0; (*s_etat_processus).processus_detache = d_vrai; + liberation(s_etat_processus, (*s_etat_processus).at_exit); + (*s_etat_processus).at_exit = NULL; + for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++) { liberation(s_etat_processus, @@ -1781,6 +1834,12 @@ instruction_detach(struct_processus *s_e * Destruction des piles de connecteurs SQL */ +/* +================================================================================ + À noter : on ne ferme pas la connexion car la conséquence immédiate est + une destruction de l'objet pour le processus père. +================================================================================ + l_element_courant = (*s_etat_processus).s_connecteurs_sql; while(l_element_courant != NULL) @@ -1791,6 +1850,9 @@ instruction_detach(struct_processus *s_e liberation(s_etat_processus, (*l_element_courant).donnee); l_element_courant = l_element_suivant; } +*/ + + (*s_etat_processus).s_connecteurs_sql = NULL; /* * On ne détruit pas les sockets car il faut utiliser DETACH @@ -1819,6 +1881,22 @@ instruction_detach(struct_processus *s_e d_ex_erreur_evaluation; } } + else + { + if (((*s_etat_processus).var_volatile_alarme == 0) + && ((*s_etat_processus).arret_depuis_abort == 0) + && ((*s_etat_processus).at_exit != NULL)) + { + (*s_etat_processus).var_volatile_requete_arret = 0; + + if (evaluation(s_etat_processus, + (*s_etat_processus).at_exit, 'E') == d_erreur) + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_evaluation; + } + } + } } else { @@ -1831,11 +1909,27 @@ instruction_detach(struct_processus *s_e d_ex_erreur_evaluation; } } + else + { + if ((*s_etat_processus).at_exit != NULL) + { + (*s_etat_processus).var_volatile_requete_arret = 0; + + if (evaluation(s_etat_processus, + (*s_etat_processus).at_exit, 'E') == d_erreur) + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_evaluation; + } + } + } liberation(s_etat_processus, s_copie); } } + liberation(s_etat_processus, (*s_etat_processus).at_exit); + l_element_courant = (*s_etat_processus).liste_mutexes; while(l_element_courant != NULL) { @@ -2062,9 +2156,18 @@ instruction_detach(struct_processus *s_e } else { - kill((*(*((struct_processus_fils *) - (*(*l_element_courant).donnee).objet)).thread).pid, - SIGFSTOP); + if ((*s_etat_processus).arret_depuis_abort == -1) + { + kill((*(*((struct_processus_fils *) + (*(*l_element_courant).donnee).objet)).thread) + .pid, SIGFABORT); + } + else + { + kill((*(*((struct_processus_fils *) + (*(*l_element_courant).donnee).objet)).thread) + .pid, SIGFSTOP); + } } } else @@ -2111,9 +2214,18 @@ instruction_detach(struct_processus *s_e } else { - pthread_kill((*(*((struct_processus_fils *) - (*(*l_element_courant).donnee).objet)).thread) - .tid, SIGFSTOP); + if ((*s_etat_processus).arret_depuis_abort == -1) + { + pthread_kill((*(*((struct_processus_fils *) + (*(*l_element_courant).donnee).objet)) + .thread).tid, SIGFABORT); + } + else + { + pthread_kill((*(*((struct_processus_fils *) + (*(*l_element_courant).donnee).objet)) + .thread).tid, SIGFSTOP); + } } } @@ -2141,11 +2253,6 @@ instruction_detach(struct_processus *s_e l_element_courant = (struct_liste_chainee *) (*s_etat_processus).l_base_pile_processus; - if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) - { - affectation_interruptions_logicielles(s_etat_processus); - } - registre_stop = (*s_etat_processus) .var_volatile_traitement_retarde_stop; (*s_etat_processus).var_volatile_traitement_retarde_stop = 1; @@ -2228,6 +2335,12 @@ instruction_detach(struct_processus *s_e } pthread_mutex_unlock(&((*s_etat_processus).mutex)); + + if ((*s_etat_processus).nombre_interruptions_non_affectees != 0) + { + affectation_interruptions_logicielles(s_etat_processus); + } + nanosleep(&attente, NULL); pthread_mutex_lock(&((*s_etat_processus).mutex)); } @@ -2530,6 +2643,8 @@ instruction_detach(struct_processus *s_e liberation(s_etat_processus, s_objet); # ifndef Cygwin + (*s_etat_processus).pile_signal.ss_flags = SS_DISABLE; + sigaltstack(&((*s_etat_processus).pile_signal), NULL); free((*s_etat_processus).pile_signal.ss_sp); # endif @@ -2576,22 +2691,38 @@ instruction_detach(struct_processus *s_e pthread_key_delete(semaphore_fork_processus_courant); +# ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); sem_destroy(&((*s_etat_processus).semaphore_fork)); +# else + sem_post((*s_etat_processus).semaphore_fork); + sem_destroy2((*s_etat_processus).semaphore_fork, sem_fork); +# endif free((*s_etat_processus).localisation); - free(s_etat_processus); free(s_argument_thread); +# ifndef SEMAPHORES_NOMMES sem_destroy(&semaphore_liste_threads); sem_post(&semaphore_gestionnaires_signaux); sem_destroy(&semaphore_gestionnaires_signaux); sem_destroy(&semaphore_gestionnaires_signaux_atomique); +# else + sem_destroy2(semaphore_liste_threads, sem_liste_threads); + sem_post(semaphore_gestionnaires_signaux); + sem_destroy2(semaphore_gestionnaires_signaux, + sem_gestionnaires_signaux); + sem_destroy2(semaphore_gestionnaires_signaux_atomique, + sem_gestionnaires_signaux_atomique); +# endif clear_history(); + free(s_etat_processus); + # ifdef DEBUG_MEMOIRE - debug_memoire_verification(s_etat_processus); + debug_memoire_verification(); + analyse_post_mortem(); # endif exit(EXIT_SUCCESS);