--- rpl/src/instructions_d5.c 2010/08/15 14:46:25 1.36 +++ rpl/src/instructions_d5.c 2011/09/10 20:45:06 1.66 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.18 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.3 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -814,8 +814,6 @@ instruction_der(struct_processus *s_etat void instruction_detach(struct_processus *s_etat_processus) { - int status; - logical1 drapeau; logical1 variable_partagee; @@ -890,19 +888,6 @@ instruction_detach(struct_processus *s_e return; } -# ifdef _BROKEN_SIGINFO - if ((*s_etat_processus).langue == 'F') - { - printf("+++Attention : Support des processus multiples indisponible\n"); - } - else - { - printf("+++Attention : Multiprocess unavailable\n"); - } - - return; -# endif - if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 1) == d_erreur) @@ -944,8 +929,7 @@ instruction_detach(struct_processus *s_e if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet).objet)).nom) == d_vrai) { - if ((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet + if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) @@ -956,13 +940,10 @@ instruction_detach(struct_processus *s_e } if (recherche_variable_partagee(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].nom, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] - .variable_partagee, (*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].origine) == d_faux) + (*(*s_etat_processus).pointeur_variable_courante).nom, + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee, (*(*s_etat_processus) + .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) @@ -1030,11 +1011,9 @@ instruction_detach(struct_processus *s_e } else { - if (((*(*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet) - .type != RPN) && ((*(*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet).type != ADR)) + if (((*(*(*s_etat_processus).pointeur_variable_courante).objet) + .type != RPN) && ((*(*(*s_etat_processus) + .pointeur_variable_courante).objet).type != ADR)) { liberation(s_etat_processus, s_objet); @@ -1172,17 +1151,6 @@ instruction_detach(struct_processus *s_e verrouillage_threads_concurrents(s_etat_processus); (*s_argument_thread).pid = fork(); - -# ifdef OS2 - if ((*s_argument_thread).pid == 0) - { - sem_init(&semaphore_liste_threads, 0, 1); - sem_init(&semaphore_gestionnaires_signaux, 0, 0); - sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); - sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); - } -# endif - deverrouillage_threads_concurrents(s_etat_processus); pthread_sigmask(SIG_SETMASK, &oldset2, NULL); @@ -1196,6 +1164,12 @@ instruction_detach(struct_processus *s_e pthread_mutex_init(&((*s_argument_thread).mutex), &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&((*s_argument_thread).mutex_nombre_references), + &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + if ((*s_argument_thread).pid > 0) { /* @@ -1300,6 +1274,7 @@ instruction_detach(struct_processus *s_e } # ifndef OS2 +# ifndef Cygwin if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1319,6 +1294,7 @@ instruction_detach(struct_processus *s_e return; } # endif +# endif (*s_argument_thread).s_etat_processus = s_etat_processus; @@ -1341,6 +1317,13 @@ instruction_detach(struct_processus *s_e * Processus fils */ +# ifdef _BROKEN_SIGINFO + liberation_fifos_signaux(s_etat_processus); + creation_fifos_signaux(s_etat_processus); +# endif + + (*s_etat_processus).signal_a_traiter = d_faux; + if ((*s_etat_processus).debug == d_vrai) if (((*s_etat_processus).type_debug & d_debug_processus) != 0) @@ -1530,6 +1513,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1560,6 +1547,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1593,6 +1584,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1604,6 +1599,7 @@ instruction_detach(struct_processus *s_e } (*s_etat_processus).var_volatile_processus_pere = 0; + (*s_etat_processus).var_volatile_processus_racine = 0; // On réinitialise toutes les interruptions. @@ -1741,6 +1737,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1757,6 +1757,9 @@ instruction_detach(struct_processus *s_e (*s_argument_thread2).nombre_references--; BUG((*s_argument_thread2).nombre_references < 0, +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus), +# endif printf("(*s_argument_thread2).nombre_references = %d\n", (int) (*s_argument_thread2).nombre_references)); @@ -1820,6 +1823,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1884,6 +1891,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1936,6 +1947,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -2061,61 +2076,66 @@ instruction_detach(struct_processus *s_e if ((*s_etat_processus).erreur_systeme == d_es) { - if (variable_partagee == d_faux) + if (setjmp(contexte_processus) == 0) { - if (evaluation(s_etat_processus, s_objet, 'E') == d_erreur) - { - if (((*s_etat_processus).erreur_execution == d_ex) && - ((*s_etat_processus).erreur_systeme == d_es)) - { - (*s_etat_processus).erreur_execution = - d_ex_erreur_evaluation; - } - } - else + if (variable_partagee == d_faux) { - if (((*s_etat_processus).var_volatile_alarme == 0) - && ((*s_etat_processus).arret_depuis_abort == 0) - && ((*s_etat_processus).at_exit != NULL)) + if (evaluation(s_etat_processus, s_objet, 'E') == d_erreur) { - (*s_etat_processus).var_volatile_requete_arret = 0; - - if (evaluation(s_etat_processus, - (*s_etat_processus).at_exit, 'E') == d_erreur) + if (((*s_etat_processus).erreur_execution == d_ex) && + ((*s_etat_processus).erreur_systeme == d_es)) { (*s_etat_processus).erreur_execution = d_ex_erreur_evaluation; } } - } - } - else - { - if (evaluation(s_etat_processus, s_copie, 'E') == d_erreur) - { - if (((*s_etat_processus).erreur_execution == d_ex) && - ((*s_etat_processus).erreur_systeme == d_es)) + else { - (*s_etat_processus).erreur_execution = - d_ex_erreur_evaluation; + 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 { - if ((*s_etat_processus).at_exit != NULL) + if (evaluation(s_etat_processus, s_copie, 'E') == d_erreur) { - (*s_etat_processus).var_volatile_requete_arret = 0; - - if (evaluation(s_etat_processus, - (*s_etat_processus).at_exit, 'E') == d_erreur) + if (((*s_etat_processus).erreur_execution == d_ex) && + ((*s_etat_processus).erreur_systeme == d_es)) { (*s_etat_processus).erreur_execution = d_ex_erreur_evaluation; } } - } + else + { + if ((*s_etat_processus).at_exit != NULL) + { + (*s_etat_processus).var_volatile_requete_arret = 0; - liberation(s_etat_processus, s_copie); + 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); + } } } @@ -2440,8 +2460,6 @@ instruction_detach(struct_processus *s_e while((*s_etat_processus).l_base_pile_processus != NULL) { - status = 0; - l_element_courant = (struct_liste_chainee *) (*s_etat_processus).l_base_pile_processus; @@ -2484,6 +2502,10 @@ instruction_detach(struct_processus *s_e registre_stop; } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + (*s_etat_processus).erreur_systeme = d_es_signal; exit(EXIT_FAILURE); } @@ -2518,6 +2540,10 @@ instruction_detach(struct_processus *s_e if (sigaction(SIGPIPE, ®istre, NULL) != 0) { +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + pthread_mutex_unlock(&((*s_etat_processus).mutex)); (*s_etat_processus).erreur_systeme = d_es_signal; @@ -2659,14 +2685,9 @@ instruction_detach(struct_processus *s_e (*s_etat_processus).instruction_derniere_erreur = NULL; } - for(i = 0; i < (*s_etat_processus).nombre_variables; i++) - { - liberation(s_etat_processus, - (*s_etat_processus).s_liste_variables[i].objet); - free((*s_etat_processus).s_liste_variables[i].nom); - } - - free((*s_etat_processus).s_liste_variables); + liberation_arbre_variables(s_etat_processus, + (*s_etat_processus).s_arbre_variables, d_vrai); + free((*s_etat_processus).pointeurs_caracteres_variables); for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++) { @@ -2834,12 +2855,6 @@ instruction_detach(struct_processus *s_e liberation(s_etat_processus, s_objet); -# if !defined(Cygwin) && !defined(OpenBSD) - (*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 - free((*s_etat_processus).definitions_chainees); free((*s_etat_processus).nom_fichier_historique); @@ -2911,6 +2926,11 @@ instruction_detach(struct_processus *s_e clear_history(); +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + + liberation_contexte_cas(s_etat_processus); free(s_etat_processus); # ifdef DEBUG_MEMOIRE @@ -2990,6 +3010,9 @@ instruction_detach(struct_processus *s_e // Être sûr que le processus fils soit déjà présent... + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + while(kill((*s_argument_thread).pid, 0) != 0) { //if ((errno != ESRCH) && (errno != EAGAIN)) @@ -3001,6 +3024,7 @@ instruction_detach(struct_processus *s_e } nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); } // Le fils peut être présent sans être en attente du signal de départ.