--- rpl/src/gestion_threads.c 2010/01/26 15:22:45 1.1.1.1 +++ rpl/src/gestion_threads.c 2011/08/09 11:31:30 1.46 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.9 - 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. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -74,12 +74,17 @@ lancement_thread(void *argument) attente.tv_nsec = GRANULARITE_us * 1000; s_argument_thread = (struct_descripteur_thread *) argument; + s_etat_processus = (*s_argument_thread).s_nouvel_etat_processus; (*s_argument_thread).tid = pthread_self(); (*s_argument_thread).thread_actif = d_vrai; - s_etat_processus = (*s_argument_thread).s_nouvel_etat_processus; +# 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; @@ -256,6 +261,27 @@ lancement_thread(void *argument) 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; + (*s_etat_processus).var_volatile_traitement_retarde_stop = -1; + + 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; + } + } + } + } if ((*s_argument_thread).destruction_objet == d_vrai) { @@ -402,7 +428,14 @@ lancement_thread(void *argument) .donnee)).pid == getpid()) { fclose((*((struct_descripteur_fichier *) - (*l_element_courant).donnee)).descripteur); + (*l_element_courant).donnee)).descripteur_c); + + if ((*((struct_descripteur_fichier *) + (*l_element_courant).donnee)).type != 'C') + { + sqlite3_close((*((struct_descripteur_fichier *) + (*l_element_courant).donnee)).descripteur_sqlite); + } if ((*((struct_descripteur_fichier *) (*l_element_courant) .donnee)).effacement == 'Y') @@ -460,8 +493,16 @@ lancement_thread(void *argument) } 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 @@ -551,9 +592,18 @@ lancement_thread(void *argument) (*(*l_element_courant).donnee).objet)).thread) .thread_actif == d_vrai) { - 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); + } } if (pthread_mutex_unlock(&((*(*((struct_processus_fils *) @@ -593,11 +643,6 @@ lancement_thread(void *argument) 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; @@ -690,6 +735,12 @@ lancement_thread(void *argument) } 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)); } @@ -831,21 +882,8 @@ lancement_thread(void *argument) (*s_etat_processus).instruction_derniere_erreur = NULL; } - for(i = 0; i < (*s_etat_processus).nombre_variables; i++) - { - // Les définitions ne sont pas libérées parce qu'elles sont partagées - // avec le thread père. - - if ((*s_etat_processus).s_liste_variables[i].niveau != 0) - { - 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_faux); for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++) { @@ -979,6 +1017,8 @@ lancement_thread(void *argument) } liberation(s_etat_processus, (*s_argument_thread).argument); + liberation(s_etat_processus, (*s_etat_processus).at_exit); + liberation(s_etat_processus, (*s_etat_processus).at_poke); for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++) { @@ -1026,7 +1066,11 @@ lancement_thread(void *argument) retrait_thread(s_etat_processus); pthread_mutex_destroy(&((*s_etat_processus).mutex)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); + + sem_destroy(&((*s_etat_processus).semaphore_fork)); + liberation_contexte_cas(s_etat_processus); free((*s_etat_processus).localisation); free(s_etat_processus); @@ -1035,6 +1079,7 @@ lancement_thread(void *argument) (*s_argument_thread).thread_actif = d_faux; pthread_exit(NULL); + return(NULL); } // vim: ts=4