version 1.19, 2010/04/27 15:53:36
|
version 1.75, 2011/07/25 07:45:00
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.0.15 |
RPL/2 (R) version 4.1.2 |
Copyright (C) 1989-2010 Dr. BERTRAND Joël |
Copyright (C) 1989-2011 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
|
|
Line 21
|
Line 21
|
|
|
|
|
#define MAIN_RPL |
#define MAIN_RPL |
#include "rpl.conv.h" |
#include "rpl-conv.h" |
|
|
|
#ifdef IPCS_SYSV |
|
#ifndef OS2 |
|
unsigned char *chemin_semaphores_SysV; |
|
#endif |
|
#endif |
|
|
|
|
/* |
/* |
Line 33
|
Line 39
|
int |
int |
rplinit(int argc, char *argv[], unsigned char ***resultats, char *rpl_home) |
rplinit(int argc, char *argv[], unsigned char ***resultats, char *rpl_home) |
{ |
{ |
# include "copyright.conv.h" |
# include "copyright-conv.h" |
# include "licence.conv.h" |
# include "licence-conv.h" |
|
|
file *f_source; |
file *f_source; |
|
|
int erreur_historique; |
int erreur_historique; |
int option_P; |
int option_P; |
int status; |
|
|
|
logical1 core; |
logical1 core; |
logical1 debug; |
logical1 debug; |
Line 99 rplinit(int argc, char *argv[], unsigned
|
Line 104 rplinit(int argc, char *argv[], unsigned
|
volatile int erreur; |
volatile int erreur; |
volatile unsigned char traitement_fichier_temporaire; |
volatile unsigned char traitement_fichier_temporaire; |
|
|
|
errno = 0; |
|
|
|
# ifdef DEBUG_MEMOIRE |
|
debug_memoire_initialisation(); |
|
# endif |
|
|
setvbuf(stdout, NULL, _IOLBF, 0); |
setvbuf(stdout, NULL, _IOLBF, 0); |
setvbuf(stderr, NULL, _IOLBF, 0); |
setvbuf(stderr, NULL, _IOLBF, 0); |
|
|
Line 177 rplinit(int argc, char *argv[], unsigned
|
Line 188 rplinit(int argc, char *argv[], unsigned
|
|
|
(*s_etat_processus).rpl_home = rpl_home; |
(*s_etat_processus).rpl_home = rpl_home; |
|
|
insertion_thread(s_etat_processus, d_vrai); |
|
|
|
pthread_mutexattr_init(&attributs_mutex); |
pthread_mutexattr_init(&attributs_mutex); |
pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); |
pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); |
pthread_mutex_init(&((*s_etat_processus).mutex), &attributs_mutex); |
pthread_mutex_init(&((*s_etat_processus).mutex), &attributs_mutex); |
pthread_mutexattr_destroy(&attributs_mutex); |
pthread_mutexattr_destroy(&attributs_mutex); |
|
|
|
pthread_mutexattr_init(&attributs_mutex); |
|
pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); |
|
pthread_mutex_init(&((*s_etat_processus).mutex_allocation), |
|
&attributs_mutex); |
|
pthread_mutexattr_destroy(&attributs_mutex); |
|
|
# ifndef SEMAPHORES_NOMMES |
# ifndef SEMAPHORES_NOMMES |
sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); |
sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); |
# else |
# else |
Line 221 rplinit(int argc, char *argv[], unsigned
|
Line 236 rplinit(int argc, char *argv[], unsigned
|
.mutex), &attributs_mutex); |
.mutex), &attributs_mutex); |
pthread_mutexattr_destroy(&attributs_mutex); |
pthread_mutexattr_destroy(&attributs_mutex); |
|
|
|
(*s_etat_processus).chemin_fichiers_temporaires = |
|
recherche_chemin_fichiers_temporaires(s_etat_processus); |
|
|
|
# ifdef IPCS_SYSV |
|
# ifndef OS2 |
|
chemin_semaphores_SysV = (*s_etat_processus).chemin_fichiers_temporaires; |
|
# endif |
|
# endif |
|
|
|
# ifdef _BROKEN_SIGINFO |
|
creation_fifos_signaux(s_etat_processus); |
|
# ifdef return |
|
# undef return |
|
# endif |
|
# define return destruction_fifos_signaux(s_etat_processus); return |
|
# endif |
|
|
|
insertion_thread(s_etat_processus, d_vrai); |
|
|
|
# ifndef OS2 |
localisation_courante(s_etat_processus); |
localisation_courante(s_etat_processus); |
|
# else |
|
if ((*s_etat_processus).erreur_systeme != d_es) |
|
{ |
|
if (((*s_etat_processus).localisation = malloc((strlen(d_locale) + 1) * |
|
sizeof(unsigned char))) == NULL) |
|
{ |
|
if ((*s_etat_processus).langue == 'F') |
|
{ |
|
uprintf("+++Système : Mémoire insuffisante\n"); |
|
} |
|
else |
|
{ |
|
uprintf("+++System : Not enough memory\n"); |
|
} |
|
|
|
return(EXIT_FAILURE); |
|
} |
|
|
|
strcpy((*s_etat_processus).localisation, d_locale); |
|
} |
|
# endif |
|
|
(*s_etat_processus).erreur_systeme = d_es; |
(*s_etat_processus).erreur_systeme = d_es; |
|
|
if ((*s_etat_processus).localisation == NULL) |
if ((*s_etat_processus).localisation == NULL) |
Line 249 rplinit(int argc, char *argv[], unsigned
|
Line 306 rplinit(int argc, char *argv[], unsigned
|
|
|
if ((*s_etat_processus).langue == 'F') |
if ((*s_etat_processus).langue == 'F') |
{ |
{ |
printf("+++Copyright (C) 1989 à 2009, 2010 BERTRAND Joël\n"); |
printf("+++Copyright (C) 1989 à 2010, 2011 BERTRAND Joël\n"); |
} |
} |
else |
else |
{ |
{ |
printf("+++Copyright (C) 1989 to 2009, 2010 BERTRAND Joel\n"); |
printf("+++Copyright (C) 1989 to 2010, 2011 BERTRAND Joel\n"); |
} |
} |
|
|
if (getenv("HOME") != NULL) |
if (getenv("HOME") != NULL) |
Line 317 rplinit(int argc, char *argv[], unsigned
|
Line 374 rplinit(int argc, char *argv[], unsigned
|
// Initialisation d'une pile de signal pour récupérer les |
// Initialisation d'une pile de signal pour récupérer les |
// débordement de pile |
// débordement de pile |
|
|
# ifndef Cygwin |
# if !defined(Cygwin) && !defined(OpenBSD) |
if (((*s_etat_processus).pile_signal.ss_sp = |
if (((*s_etat_processus).pile_signal.ss_sp = |
malloc((*s_etat_processus).pile_signal.ss_size = |
malloc((*s_etat_processus).pile_signal.ss_size = |
SIGSTKSZ)) == NULL) |
SIGSTKSZ)) == NULL) |
Line 356 rplinit(int argc, char *argv[], unsigned
|
Line 413 rplinit(int argc, char *argv[], unsigned
|
} |
} |
# endif |
# endif |
|
|
|
# ifndef _BROKEN_SIGINFO |
action.sa_sigaction = interruption1; |
action.sa_sigaction = interruption1; |
|
# else |
|
action.sa_handler = interruption1; |
|
# endif |
action.sa_flags = SA_ONSTACK | SA_SIGINFO; |
action.sa_flags = SA_ONSTACK | SA_SIGINFO; |
|
|
if (sigaction(SIGINT, &action, NULL) != 0) |
if (sigaction(SIGINT, &action, NULL) != 0) |
Line 376 rplinit(int argc, char *argv[], unsigned
|
Line 437 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
if (sigaction(SIGTERM, &action, NULL) != 0) |
|
{ |
|
erreur = d_es_signal; |
|
|
|
if ((*s_etat_processus).langue == 'F') |
|
{ |
|
printf("+++Système : Initialisation des signaux POSIX " |
|
"impossible\n"); |
|
} |
|
else |
|
{ |
|
printf("+++System : Initialization of POSIX signals failed\n"); |
|
} |
|
|
|
return(EXIT_FAILURE); |
|
} |
|
|
|
# ifndef _BROKEN_SIGINFO |
action.sa_sigaction = interruption2; |
action.sa_sigaction = interruption2; |
|
# else |
|
action.sa_handler = interruption2; |
|
# endif |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
|
|
if (sigaction(SIGTSTP, &action, NULL) != 0) |
if (sigaction(SIGTSTP, &action, NULL) != 0) |
Line 394 rplinit(int argc, char *argv[], unsigned
|
Line 476 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
# ifndef _BROKEN_SIGINFO |
action.sa_sigaction = interruption4; |
action.sa_sigaction = interruption4; |
|
# else |
|
action.sa_handler = interruption4; |
|
# endif |
|
// SIGCONT ne doit pas pouvoir être appelé depuis son gestionnaire. |
action.sa_flags = SA_ONSTACK | SA_SIGINFO; |
action.sa_flags = SA_ONSTACK | SA_SIGINFO; |
|
|
if (sigaction(SIGSTART, &action, NULL) != 0) |
if (sigaction(SIGSTART, &action, NULL) != 0) |
Line 427 rplinit(int argc, char *argv[], unsigned
|
Line 514 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
# ifndef _BROKEN_SIGINFO |
action.sa_sigaction = interruption5; |
action.sa_sigaction = interruption5; |
|
# else |
|
action.sa_handler = interruption5; |
|
# endif |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
|
|
if (sigaction(SIGFSTOP, &action, NULL) != 0) |
if (sigaction(SIGFSTOP, &action, NULL) != 0) |
Line 447 rplinit(int argc, char *argv[], unsigned
|
Line 538 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
# ifndef _BROKEN_SIGINFO |
|
action.sa_sigaction = interruption11; |
|
# else |
|
action.sa_handler = interruption11; |
|
# endif |
|
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
|
|
|
if (sigaction(SIGFABORT, &action, NULL) != 0) |
|
{ |
|
erreur = d_es_signal; |
|
|
|
if ((*s_etat_processus).langue == 'F') |
|
{ |
|
printf("+++Système : Initialisation des signaux POSIX " |
|
"impossible\n"); |
|
} |
|
else |
|
{ |
|
printf("+++System : Initialization of POSIX signals failed\n"); |
|
} |
|
|
|
return(EXIT_FAILURE); |
|
} |
|
|
|
# ifndef _BROKEN_SIGINFO |
action.sa_sigaction = interruption8; |
action.sa_sigaction = interruption8; |
|
# else |
|
action.sa_handler = interruption8; |
|
# endif |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
|
|
if (sigaction(SIGURG, &action, NULL) != 0) |
if (sigaction(SIGURG, &action, NULL) != 0) |
Line 467 rplinit(int argc, char *argv[], unsigned
|
Line 586 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
# ifndef _BROKEN_SIGINFO |
action.sa_sigaction = interruption7; |
action.sa_sigaction = interruption7; |
|
# else |
|
action.sa_handler = interruption7; |
|
# endif |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
|
|
if (sigaction(SIGPIPE, &action, NULL) != 0) |
if (sigaction(SIGPIPE, &action, NULL) != 0) |
Line 487 rplinit(int argc, char *argv[], unsigned
|
Line 610 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
# ifndef _BROKEN_SIGINFO |
action.sa_sigaction = interruption6; |
action.sa_sigaction = interruption6; |
action.sa_flags = SA_ONSTACK | SA_SIGINFO; |
# else |
|
action.sa_handler = interruption6; |
|
# endif |
|
action.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_NODEFER; |
|
|
if (sigaction(SIGINJECT, &action, NULL) != 0) |
if (sigaction(SIGINJECT, &action, NULL) != 0) |
{ |
{ |
Line 507 rplinit(int argc, char *argv[], unsigned
|
Line 634 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
# ifndef _BROKEN_SIGINFO |
action.sa_sigaction = interruption9; |
action.sa_sigaction = interruption9; |
action.sa_flags = SA_ONSTACK | SA_SIGINFO; |
# else |
|
action.sa_handler = interruption9; |
|
# endif |
|
action.sa_flags = SA_ONSTACK | SA_SIGINFO | SA_NODEFER; |
|
|
if (sigaction(SIGABORT, &action, NULL) != 0) |
if (sigaction(SIGABORT, &action, NULL) != 0) |
{ |
{ |
Line 527 rplinit(int argc, char *argv[], unsigned
|
Line 658 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
# ifndef _BROKEN_SIGINFO |
action.sa_sigaction = interruption1; |
action.sa_sigaction = interruption1; |
|
# else |
|
action.sa_handler = interruption1; |
|
# endif |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
|
|
if (sigaction(SIGALRM, &action, NULL) != 0) |
if (sigaction(SIGALRM, &action, NULL) != 0) |
Line 547 rplinit(int argc, char *argv[], unsigned
|
Line 682 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
# ifndef _BROKEN_SIGINFO |
action.sa_sigaction = interruption3; |
action.sa_sigaction = interruption3; |
|
# else |
|
action.sa_handler = interruption3; |
|
# endif |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
|
|
(*s_etat_processus).chemin_fichiers_temporaires = |
|
recherche_chemin_fichiers_temporaires(s_etat_processus); |
|
|
|
erreur = d_absence_erreur; |
erreur = d_absence_erreur; |
core = d_faux; |
core = d_faux; |
mode_interactif = d_faux; |
mode_interactif = d_faux; |
Line 1475 rplinit(int argc, char *argv[], unsigned
|
Line 1611 rplinit(int argc, char *argv[], unsigned
|
|
|
if (option_n == d_vrai) |
if (option_n == d_vrai) |
{ |
{ |
|
# ifndef _BROKEN_SIGINFO |
action.sa_sigaction = interruption10; |
action.sa_sigaction = interruption10; |
|
# else |
|
action.sa_handler = interruption10; |
|
# endif |
action.sa_flags = SA_ONSTACK | SA_SIGINFO; |
action.sa_flags = SA_ONSTACK | SA_SIGINFO; |
|
|
if (sigaction(SIGHUP, &action, NULL) != 0) |
if (sigaction(SIGHUP, &action, NULL) != 0) |
Line 1692 rplinit(int argc, char *argv[], unsigned
|
Line 1832 rplinit(int argc, char *argv[], unsigned
|
(*s_etat_processus).affichage_arguments = 'N'; |
(*s_etat_processus).affichage_arguments = 'N'; |
(*s_etat_processus).autorisation_conversion_chaine = 'Y'; |
(*s_etat_processus).autorisation_conversion_chaine = 'Y'; |
(*s_etat_processus).autorisation_evaluation_nom = 'Y'; |
(*s_etat_processus).autorisation_evaluation_nom = 'Y'; |
(*s_etat_processus).autorisation_nom_implicite = 'Y'; |
|
|
if (mode_interactif == d_vrai) |
|
{ |
|
(*s_etat_processus).autorisation_nom_implicite = 'Y'; |
|
} |
|
else |
|
{ |
|
(*s_etat_processus).autorisation_nom_implicite = 'N'; |
|
} |
|
|
(*s_etat_processus).autorisation_empilement_programme = 'N'; |
(*s_etat_processus).autorisation_empilement_programme = 'N'; |
(*s_etat_processus).requete_arret = 'N'; |
(*s_etat_processus).requete_arret = 'N'; |
(*s_etat_processus).evaluation_forcee = 'N'; |
(*s_etat_processus).evaluation_forcee = 'N'; |
|
(*s_etat_processus).recherche_type = 'N'; |
|
|
(*s_etat_processus).constante_symbolique = 'N'; |
(*s_etat_processus).constante_symbolique = 'N'; |
(*s_etat_processus).traitement_symbolique = 'N'; |
(*s_etat_processus).traitement_symbolique = 'N'; |
Line 1707 rplinit(int argc, char *argv[], unsigned
|
Line 1857 rplinit(int argc, char *argv[], unsigned
|
(*s_etat_processus).l_base_pile = NULL; |
(*s_etat_processus).l_base_pile = NULL; |
(*s_etat_processus).l_base_pile_last = NULL; |
(*s_etat_processus).l_base_pile_last = NULL; |
|
|
(*s_etat_processus).s_liste_variables = NULL; |
(*s_etat_processus).s_arbre_variables = NULL; |
|
(*s_etat_processus).l_liste_variables_par_niveau = NULL; |
(*s_etat_processus).gel_liste_variables = d_faux; |
(*s_etat_processus).gel_liste_variables = d_faux; |
(*s_etat_processus).nombre_variables = 0; |
(*s_etat_processus).pointeur_variable_courante = NULL; |
(*s_etat_processus).nombre_variables_allouees = 0; |
|
(*s_etat_processus).s_liste_variables_statiques = NULL; |
(*s_etat_processus).s_liste_variables_statiques = NULL; |
(*s_etat_processus).nombre_variables_statiques = 0; |
(*s_etat_processus).nombre_variables_statiques = 0; |
(*s_etat_processus).nombre_variables_statiques_allouees = 0; |
(*s_etat_processus).nombre_variables_statiques_allouees = 0; |
Line 1718 rplinit(int argc, char *argv[], unsigned
|
Line 1868 rplinit(int argc, char *argv[], unsigned
|
(*s_etat_processus).niveau_initial = 0; |
(*s_etat_processus).niveau_initial = 0; |
(*s_etat_processus).creation_variables_statiques = d_faux; |
(*s_etat_processus).creation_variables_statiques = d_faux; |
(*s_etat_processus).creation_variables_partagees = d_faux; |
(*s_etat_processus).creation_variables_partagees = d_faux; |
(*s_etat_processus).position_variable_courante = 0; |
|
(*s_etat_processus).position_variable_statique_courante = 0; |
(*s_etat_processus).position_variable_statique_courante = 0; |
|
|
(*s_etat_processus).s_bibliotheques = NULL; |
(*s_etat_processus).s_bibliotheques = NULL; |
Line 1840 rplinit(int argc, char *argv[], unsigned
|
Line 1989 rplinit(int argc, char *argv[], unsigned
|
(*s_etat_processus).pile_origine_interruptions[i] = NULL; |
(*s_etat_processus).pile_origine_interruptions[i] = NULL; |
} |
} |
|
|
(*s_etat_processus).on_exit = NULL; |
(*s_etat_processus).at_exit = NULL; |
|
(*s_etat_processus).at_poke = NULL; |
|
(*s_etat_processus).traitement_at_poke = 'N'; |
|
|
(*s_etat_processus).pointeurs_caracteres = NULL; |
(*s_etat_processus).pointeurs_caracteres = NULL; |
(*s_etat_processus).arbre_instructions = NULL; |
(*s_etat_processus).arbre_instructions = NULL; |
Line 1849 rplinit(int argc, char *argv[], unsigned
|
Line 2000 rplinit(int argc, char *argv[], unsigned
|
(*s_etat_processus).pid_processus_pere = getpid(); |
(*s_etat_processus).pid_processus_pere = getpid(); |
(*s_etat_processus).processus_detache = d_vrai; |
(*s_etat_processus).processus_detache = d_vrai; |
(*s_etat_processus).var_volatile_processus_pere = -1; |
(*s_etat_processus).var_volatile_processus_pere = -1; |
|
(*s_etat_processus).var_volatile_processus_racine = -1; |
(*s_etat_processus).var_volatile_traitement_retarde_stop = 0; |
(*s_etat_processus).var_volatile_traitement_retarde_stop = 0; |
(*s_etat_processus).var_volatile_alarme = 0; |
(*s_etat_processus).var_volatile_alarme = 0; |
(*s_etat_processus).var_volatile_requete_arret = 0; |
(*s_etat_processus).var_volatile_requete_arret = 0; |
Line 1857 rplinit(int argc, char *argv[], unsigned
|
Line 2009 rplinit(int argc, char *argv[], unsigned
|
(*s_etat_processus).var_volatile_traitement_sigint = 0; |
(*s_etat_processus).var_volatile_traitement_sigint = 0; |
(*s_etat_processus).var_volatile_recursivite = 0; |
(*s_etat_processus).var_volatile_recursivite = 0; |
(*s_etat_processus).var_volatile_exception_gsl = 0; |
(*s_etat_processus).var_volatile_exception_gsl = 0; |
|
(*s_etat_processus).arret_depuis_abort = 0; |
|
|
initialisation_allocateur(s_etat_processus); |
initialisation_allocateur(s_etat_processus); |
initialisation_drapeaux(s_etat_processus); |
initialisation_drapeaux(s_etat_processus); |
|
initialisation_variables(s_etat_processus); |
|
initialisation_instructions(s_etat_processus); |
|
|
if ((*s_etat_processus).erreur_systeme != d_es) |
if ((*s_etat_processus).erreur_systeme != d_es) |
{ |
{ |
Line 1876 rplinit(int argc, char *argv[], unsigned
|
Line 2031 rplinit(int argc, char *argv[], unsigned
|
} |
} |
|
|
if (((*s_etat_processus).instruction_derniere_erreur = |
if (((*s_etat_processus).instruction_derniere_erreur = |
malloc(2 * sizeof(unsigned char))) == NULL) |
malloc(sizeof(unsigned char))) == NULL) |
{ |
{ |
erreur = d_es_allocation_memoire; |
erreur = d_es_allocation_memoire; |
|
|
Line 1927 rplinit(int argc, char *argv[], unsigned
|
Line 2082 rplinit(int argc, char *argv[], unsigned
|
|
|
free((*s_etat_processus).instruction_courante); |
free((*s_etat_processus).instruction_courante); |
|
|
if ((*s_etat_processus).erreur_systeme == d_es_allocation_memoire) |
if ((*s_etat_processus).erreur_systeme != d_es) |
{ |
{ |
erreur = d_es_allocation_memoire; |
erreur = d_es_allocation_memoire; |
} |
} |
Line 2245 rplinit(int argc, char *argv[], unsigned
|
Line 2400 rplinit(int argc, char *argv[], unsigned
|
(*s_etat_processus).position_courante = 0; |
(*s_etat_processus).position_courante = 0; |
(*s_etat_processus).traitement_cycle_exit = 'N'; |
(*s_etat_processus).traitement_cycle_exit = 'N'; |
|
|
if ((*s_etat_processus).nombre_variables == 0) |
if ((*s_etat_processus).s_arbre_variables == NULL) |
{ |
{ |
if ((*s_etat_processus).langue == 'F') |
if ((*s_etat_processus).langue == 'F') |
{ |
{ |
Line 2305 rplinit(int argc, char *argv[], unsigned
|
Line 2460 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
if ((*s_etat_processus).s_liste_variables |
if ((*(*s_etat_processus).pointeur_variable_courante) |
[(*s_etat_processus) |
.niveau != 0) |
.position_variable_courante].niveau != 0) |
|
{ |
{ |
if ((*s_etat_processus).langue == 'F') |
if ((*s_etat_processus).langue == 'F') |
{ |
{ |
Line 2393 rplinit(int argc, char *argv[], unsigned
|
Line 2547 rplinit(int argc, char *argv[], unsigned
|
|
|
fflush(stdout); |
fflush(stdout); |
|
|
initialisation_instructions(s_etat_processus); |
|
|
|
if (arguments != NULL) |
if (arguments != NULL) |
{ |
{ |
tampon = (*s_etat_processus).definitions_chainees; |
tampon = (*s_etat_processus).definitions_chainees; |
Line 2623 rplinit(int argc, char *argv[], unsigned
|
Line 2775 rplinit(int argc, char *argv[], unsigned
|
|
|
if (erreur == d_absence_erreur) |
if (erreur == d_absence_erreur) |
{ |
{ |
erreur = evaluation(s_etat_processus, |
if (((*s_etat_processus).var_volatile_alarme == 0) |
(*s_etat_processus).on_exit, 'E'); |
&& ((*s_etat_processus).arret_depuis_abort |
|
== 0) && ((*s_etat_processus).at_exit |
|
!= NULL)) |
|
{ |
|
erreur = evaluation(s_etat_processus, |
|
(*s_etat_processus).at_exit, 'E'); |
|
} |
} |
} |
|
|
liberation(s_etat_processus, |
|
(*s_etat_processus).on_exit); |
|
} |
} |
|
|
|
liberation(s_etat_processus, (*s_etat_processus).at_exit); |
|
liberation(s_etat_processus, (*s_etat_processus).at_poke); |
|
|
if ((*s_etat_processus).generateur_aleatoire != NULL) |
if ((*s_etat_processus).generateur_aleatoire != NULL) |
{ |
{ |
liberation_generateur_aleatoire(s_etat_processus); |
liberation_generateur_aleatoire(s_etat_processus); |
Line 2747 rplinit(int argc, char *argv[], unsigned
|
Line 2905 rplinit(int argc, char *argv[], unsigned
|
} |
} |
else |
else |
{ |
{ |
kill((*(*((struct_processus_fils *) |
if ((*s_etat_processus).arret_depuis_abort |
(*(*((struct_liste_chainee *) |
== -1) |
l_element_courant)).donnee).objet)) |
{ |
.thread).pid, SIGFSTOP); |
kill((*(*((struct_processus_fils *) |
|
(*(*((struct_liste_chainee *) |
|
l_element_courant)).donnee).objet)) |
|
.thread).pid, SIGFABORT); |
|
} |
|
else |
|
{ |
|
kill((*(*((struct_processus_fils *) |
|
(*(*((struct_liste_chainee *) |
|
l_element_courant)).donnee).objet)) |
|
.thread).pid, SIGFSTOP); |
|
} |
} |
} |
} |
} |
else |
else |
Line 2775 rplinit(int argc, char *argv[], unsigned
|
Line 2944 rplinit(int argc, char *argv[], unsigned
|
} |
} |
else |
else |
{ |
{ |
pthread_kill((*(*((struct_processus_fils *) |
if ((*s_etat_processus).arret_depuis_abort |
(*(*((struct_liste_chainee *) |
== -1) |
l_element_courant)).donnee).objet)) |
{ |
.thread).tid, SIGFSTOP); |
pthread_kill( |
|
(*(*((struct_processus_fils *) |
|
(*(*((struct_liste_chainee *) |
|
l_element_courant)).donnee) |
|
.objet)).thread).tid, |
|
SIGFABORT); |
|
} |
|
else |
|
{ |
|
pthread_kill( |
|
(*(*((struct_processus_fils *) |
|
(*(*((struct_liste_chainee *) |
|
l_element_courant)).donnee) |
|
.objet)).thread).tid, |
|
SIGFSTOP); |
|
} |
} |
} |
} |
} |
|
|
Line 2806 rplinit(int argc, char *argv[], unsigned
|
Line 2990 rplinit(int argc, char *argv[], unsigned
|
|
|
while((*s_etat_processus).l_base_pile_processus != NULL) |
while((*s_etat_processus).l_base_pile_processus != NULL) |
{ |
{ |
status = 0; |
|
|
|
l_element_courant = (void *) |
l_element_courant = (void *) |
(*s_etat_processus).l_base_pile_processus; |
(*s_etat_processus).l_base_pile_processus; |
|
|
if ((*s_etat_processus) |
|
.nombre_interruptions_non_affectees != 0) |
|
{ |
|
affectation_interruptions_logicielles( |
|
s_etat_processus); |
|
} |
|
|
|
for(i = 0; i < (unsigned long) |
for(i = 0; i < (unsigned long) |
(*(*((struct_processus_fils *) |
(*(*((struct_processus_fils *) |
(*(*((struct_liste_chainee *) |
(*(*((struct_liste_chainee *) |
Line 2876 rplinit(int argc, char *argv[], unsigned
|
Line 3051 rplinit(int argc, char *argv[], unsigned
|
} |
} |
|
|
pthread_mutex_unlock(&((*s_etat_processus).mutex)); |
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); |
nanosleep(&attente, NULL); |
pthread_mutex_lock(&((*s_etat_processus).mutex)); |
pthread_mutex_lock(&((*s_etat_processus).mutex)); |
} |
} |
Line 3030 rplinit(int argc, char *argv[], unsigned
|
Line 3213 rplinit(int argc, char *argv[], unsigned
|
* le libérer... |
* le libérer... |
*/ |
*/ |
|
|
for(i = 0; i < (*s_etat_processus).nombre_variables; i++) |
liberation_arbre_variables(s_etat_processus, |
{ |
(*s_etat_processus).s_arbre_variables, d_vrai); |
liberation(s_etat_processus, |
free((*s_etat_processus).pointeurs_caracteres_variables); |
(*s_etat_processus).s_liste_variables[i].objet); |
|
free((*s_etat_processus).s_liste_variables[i].nom); |
|
} |
|
|
|
free((*s_etat_processus).s_liste_variables); |
|
|
|
for(i = 0; i < (*s_etat_processus) |
for(i = 0; i < (*s_etat_processus) |
.nombre_variables_statiques; i++) |
.nombre_variables_statiques; i++) |
Line 3345 rplinit(int argc, char *argv[], unsigned
|
Line 3523 rplinit(int argc, char *argv[], unsigned
|
l_element_courant = l_element_suivant; |
l_element_courant = l_element_suivant; |
} |
} |
|
|
free((*s_etat_processus).chemin_fichiers_temporaires); |
|
|
|
l_element_courant = (*s_etat_processus).s_marques; |
l_element_courant = (*s_etat_processus).s_marques; |
while(l_element_courant != NULL) |
while(l_element_courant != NULL) |
{ |
{ |
Line 3398 rplinit(int argc, char *argv[], unsigned
|
Line 3574 rplinit(int argc, char *argv[], unsigned
|
} |
} |
} |
} |
|
|
# ifndef Cygwin |
|
free((*s_etat_processus).pile_signal.ss_sp); |
|
# endif |
|
|
|
closelog(); |
closelog(); |
|
|
pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); |
pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); |
Line 3411 rplinit(int argc, char *argv[], unsigned
|
Line 3583 rplinit(int argc, char *argv[], unsigned
|
retrait_thread(s_etat_processus); |
retrait_thread(s_etat_processus); |
|
|
pthread_mutex_destroy(&((*s_etat_processus).mutex)); |
pthread_mutex_destroy(&((*s_etat_processus).mutex)); |
|
pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); |
|
|
# ifndef SEMAPHORES_NOMMES |
# ifndef SEMAPHORES_NOMMES |
sem_post(&((*s_etat_processus).semaphore_fork)); |
sem_post(&((*s_etat_processus).semaphore_fork)); |
sem_destroy(&((*s_etat_processus).semaphore_fork)); |
sem_destroy(&((*s_etat_processus).semaphore_fork)); |
Line 3420 rplinit(int argc, char *argv[], unsigned
|
Line 3594 rplinit(int argc, char *argv[], unsigned
|
# endif |
# endif |
|
|
free((*s_etat_processus).localisation); |
free((*s_etat_processus).localisation); |
free(s_etat_processus); |
|
|
|
# ifndef SEMAPHORES_NOMMES |
# ifndef SEMAPHORES_NOMMES |
sem_destroy(&semaphore_liste_threads); |
sem_destroy(&semaphore_liste_threads); |
Line 3438 rplinit(int argc, char *argv[], unsigned
|
Line 3611 rplinit(int argc, char *argv[], unsigned
|
sem_gestionnaires_signaux_atomique); |
sem_gestionnaires_signaux_atomique); |
# endif |
# endif |
|
|
|
# ifdef _BROKEN_SIGINFO |
|
destruction_fifos_signaux(s_etat_processus); |
|
# undef return |
|
# endif |
|
|
|
free((*s_etat_processus).chemin_fichiers_temporaires); |
|
free(s_etat_processus); |
|
|
# ifdef DEBUG_MEMOIRE |
# ifdef DEBUG_MEMOIRE |
debug_memoire_verification(s_etat_processus); |
debug_memoire_verification(); |
|
analyse_post_mortem(); |
# endif |
# endif |
|
|
return((erreur == d_absence_erreur) ? EXIT_SUCCESS : EXIT_FAILURE); |
return((erreur == d_absence_erreur) ? EXIT_SUCCESS : EXIT_FAILURE); |