--- rpl/src/gestion_processus.c 2010/07/14 14:19:34 1.21 +++ rpl/src/gestion_processus.c 2010/09/23 15:27:36 1.28 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.18 + RPL/2 (R) version 4.0.20 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -925,6 +925,9 @@ surveillance_processus(void *argument) (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus; } + + pthread_kill((*s_argument_thread).thread_pere, + SIGINJECT); } } else @@ -1839,6 +1842,7 @@ surveillance_processus(void *argument) } pthread_exit(NULL); + return(NULL); } @@ -3396,28 +3400,35 @@ lecture_pipe(struct_processus *s_etat_pr ================================================================================ */ -extern inline void +#ifndef OS2 +extern inline +#endif +void scrutation_injection(struct_processus *s_etat_processus) { fd_set ensemble_descripteurs; -# ifndef OpenBSD +# if !defined(OpenBSD) && !defined(OS2) struct timespec timeout; # else struct timeval timeout; # endif + logical1 drapeau_erreur; + logical1 registre_arret_si_exception; + unsigned char tampon; + unsigned char tampon_profilage[20]; // Si on est dans le processus père, il n'y a rien à surveiller. - if ((*s_etat_processus).var_volatile_processus_pere == 0) + if ((*s_etat_processus).var_volatile_processus_racine == 0) { FD_ZERO(&ensemble_descripteurs); FD_SET((*s_etat_processus).pipe_nombre_injections, &ensemble_descripteurs); -# ifndef OpenBSD +# if !defined(OpenBSD) && !defined(OS2) timeout.tv_sec = 0; timeout.tv_nsec = 0; @@ -3454,6 +3465,139 @@ scrutation_injection(struct_processus *s } } } + + /* + * Traitement de l'interruption d'injection + */ + + if (((*s_etat_processus).nombre_objets_injectes != 0) && + ((*s_etat_processus).traitement_at_poke == 'N')) + { + if ((*s_etat_processus).at_poke != NULL) + { + registre_arret_si_exception = + (*s_etat_processus).arret_si_exception; + (*s_etat_processus).arret_si_exception = d_vrai; + + if ((*s_etat_processus).debug == d_vrai) + if (((*s_etat_processus).type_debug & + d_traitement_interruption) != 0) + { + if ((*s_etat_processus).langue == 'F') + { + printf("[%d] Traitement de l'interruption " + "d'injection\n", (int) getpid()); + } + else + { + printf("[%d] Start injection interrupt\n", + (int) getpid()); + } + + fflush(stdout); + } + + if ((*s_etat_processus).profilage == d_vrai) + { + sprintf(tampon_profilage, "Injection interrupt"); + profilage(s_etat_processus, tampon_profilage); + + if ((*s_etat_processus).erreur_systeme != d_es) + { + return; + } + } + + (*s_etat_processus).traitement_at_poke = 'Y'; + drapeau_erreur = evaluation(s_etat_processus, + (*s_etat_processus).at_poke, 'E'); + (*s_etat_processus).traitement_at_poke = 'N'; + + if ((*s_etat_processus).profilage == d_vrai) + { + profilage(s_etat_processus, NULL); + } + + if (drapeau_erreur == d_absence_erreur) + { + (*s_etat_processus).arret_si_exception = + registre_arret_si_exception; + } + else + { + if ((((*s_etat_processus).erreur_execution != d_ex) || + ((*s_etat_processus).exception != d_ep) || + ((*s_etat_processus).erreur_systeme != d_es)) && + ((*s_etat_processus).core == d_vrai) && + ((*s_etat_processus) + .var_volatile_traitement_sigint == 0)) + { + printf("\n"); + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Information : " + "Génération du fichier rpl-core " + "[%d]\n", (int) getpid()); + } + else + { + printf("+++Information : " + "Writing rpl-core file [%d]\n", + (int) getpid()); + } + + rplcore(s_etat_processus); + + if ((*s_etat_processus).langue == 'F') + { + printf("+++Information : " + "Processus tracé [%d]\n", + (int) getpid()); + } + else + { + printf("+++Information : Done [%d]\n", + (int) getpid()); + } + + printf("\n"); + fflush(stdout); + } + + } + + if ((*s_etat_processus).debug == d_vrai) + if (((*s_etat_processus).type_debug & + d_traitement_interruption) != 0) + { + if ((*s_etat_processus).langue == 'F') + { + printf("[%d] Fin de l'interruption d'injection\n", + (int) getpid()); + } + else + { + printf("[%d] Stop injection interrupt\n", + (int) getpid()); + } + + fflush(stdout); + } + + if ((drapeau_erreur == d_erreur) && + ((*s_etat_processus).erreur_execution == d_ex)) + { + if (((*s_etat_processus).erreur_execution == d_ex) && + ((*s_etat_processus).erreur_systeme == d_es)) + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_evaluation; + } + } + } + } + } return;