--- rpl/src/instructions_d5.c 2010/08/22 16:38:36 1.38 +++ rpl/src/instructions_d5.c 2011/09/01 12:14:56 1.64 @@ -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; @@ -931,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) @@ -943,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) @@ -1017,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); @@ -1159,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); @@ -1183,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) { /* @@ -1287,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; @@ -1306,6 +1294,7 @@ instruction_detach(struct_processus *s_e return; } # endif +# endif (*s_argument_thread).s_etat_processus = s_etat_processus; @@ -1608,6 +1597,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. @@ -2463,8 +2453,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; @@ -2690,14 +2678,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++) { @@ -2865,12 +2848,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); @@ -2946,6 +2923,7 @@ instruction_detach(struct_processus *s_e destruction_fifos_signaux(s_etat_processus); # endif + liberation_contexte_cas(s_etat_processus); free(s_etat_processus); # ifdef DEBUG_MEMOIRE @@ -3025,6 +3003,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)) @@ -3036,6 +3017,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.