version 1.13, 2010/03/17 14:14:36
|
version 1.27, 2010/05/25 18:09:44
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.0.13 |
RPL/2 (R) version 4.0.16 |
Copyright (C) 1989-2010 Dr. BERTRAND Joël |
Copyright (C) 1989-2010 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
Line 99 rplinit(int argc, char *argv[], unsigned
|
Line 99 rplinit(int argc, char *argv[], unsigned
|
volatile int erreur; |
volatile int erreur; |
volatile unsigned char traitement_fichier_temporaire; |
volatile unsigned char traitement_fichier_temporaire; |
|
|
|
# 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); |
|
|
|
# ifndef SEMAPHORES_NOMMES |
sem_init(&semaphore_liste_threads, 0, 1); |
sem_init(&semaphore_liste_threads, 0, 1); |
sem_init(&semaphore_gestionnaires_signaux, 0, 0); |
sem_init(&semaphore_gestionnaires_signaux, 0, 0); |
sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); |
sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); |
|
# else |
|
semaphore_liste_threads = sem_init2(1, sem_liste_threads); |
|
semaphore_gestionnaires_signaux = sem_init2(0, sem_gestionnaires_signaux); |
|
semaphore_gestionnaires_signaux_atomique = sem_init2(1, |
|
sem_gestionnaires_signaux_atomique); |
|
|
|
if ((semaphore_liste_threads == SEM_FAILED) || |
|
(semaphore_gestionnaires_signaux == SEM_FAILED) || |
|
(semaphore_gestionnaires_signaux_atomique == SEM_FAILED)) |
|
{ |
|
erreur = d_es_allocation_memoire; |
|
|
|
if ((langue = getenv("LANG")) != NULL) |
|
{ |
|
if (strncmp(langue, "fr", 2) == 0) |
|
{ |
|
uprintf("+++Système : Mémoire insuffisante\n"); |
|
} |
|
else |
|
{ |
|
uprintf("+++System : Not enough memory\n"); |
|
} |
|
} |
|
else |
|
{ |
|
uprintf("+++System : Not enough memory\n"); |
|
} |
|
|
|
return(EXIT_FAILURE); |
|
} |
|
# endif |
|
|
if ((s_etat_processus = malloc(sizeof(struct_processus))) == NULL) |
if ((s_etat_processus = malloc(sizeof(struct_processus))) == NULL) |
{ |
{ |
erreur = d_es_allocation_memoire; |
erreur = d_es_allocation_memoire; |
|
|
if ((*s_etat_processus).langue == 'F') |
if ((langue = getenv("LANG")) != NULL) |
{ |
{ |
printf("+++Système : Mémoire insuffisante\n"); |
if (strncmp(langue, "fr", 2) == 0) |
|
{ |
|
uprintf("+++Système : Mémoire insuffisante\n"); |
|
} |
|
else |
|
{ |
|
uprintf("+++System : Not enough memory\n"); |
|
} |
} |
} |
else |
else |
{ |
{ |
printf("+++System : Not enough memory\n"); |
uprintf("+++System : Not enough memory\n"); |
} |
} |
|
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
if ((langue = getenv("LANG")) != NULL) |
|
{ |
|
(*s_etat_processus).langue = (strncmp(langue, "fr", 2) == 0) |
|
? 'F' : 'E'; |
|
} |
|
else |
|
{ |
|
(*s_etat_processus).langue = 'E'; |
|
} |
|
|
(*s_etat_processus).exception = d_ep; |
(*s_etat_processus).exception = d_ep; |
(*s_etat_processus).erreur_systeme = d_es; |
(*s_etat_processus).erreur_systeme = d_es; |
(*s_etat_processus).erreur_execution = d_ex; |
(*s_etat_processus).erreur_execution = d_ex; |
Line 135 rplinit(int argc, char *argv[], unsigned
|
Line 188 rplinit(int argc, char *argv[], unsigned
|
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); |
|
|
|
# ifndef SEMAPHORES_NOMMES |
sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); |
sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); |
|
# else |
|
if (((*s_etat_processus).semaphore_fork = sem_init2(0, sem_fork)) == |
|
SEM_FAILED) |
|
{ |
|
if ((*s_etat_processus).langue == 'F') |
|
{ |
|
uprintf("+++Système : Mémoire insuffisante\n"); |
|
} |
|
else |
|
{ |
|
uprintf("+++System : Not enough memory\n"); |
|
} |
|
|
|
return(EXIT_FAILURE); |
|
} |
|
# endif |
|
|
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); |
Line 155 rplinit(int argc, char *argv[], unsigned
|
Line 225 rplinit(int argc, char *argv[], unsigned
|
.mutex), &attributs_mutex); |
.mutex), &attributs_mutex); |
pthread_mutexattr_destroy(&attributs_mutex); |
pthread_mutexattr_destroy(&attributs_mutex); |
|
|
if ((langue = getenv("LANG")) != NULL) |
|
{ |
|
(*s_etat_processus).langue = (strncmp(langue, "fr", 2) == 0) |
|
? 'F' : 'E'; |
|
} |
|
else |
|
{ |
|
(*s_etat_processus).langue = 'E'; |
|
} |
|
|
|
localisation_courante(s_etat_processus); |
localisation_courante(s_etat_processus); |
|
(*s_etat_processus).erreur_systeme = d_es; |
|
|
if ((*s_etat_processus).erreur_systeme != d_es) |
if ((*s_etat_processus).localisation == NULL) |
{ |
{ |
if ((*s_etat_processus).langue == 'F') |
if (((*s_etat_processus).localisation = malloc((strlen(d_locale) + 1) * |
|
sizeof(unsigned char))) == NULL) |
{ |
{ |
uprintf("+++Système : Mémoire insuffisante\n"); |
if ((*s_etat_processus).langue == 'F') |
} |
{ |
else |
uprintf("+++Système : Mémoire insuffisante\n"); |
{ |
} |
uprintf("+++System : Not enough memory\n"); |
else |
|
{ |
|
uprintf("+++System : Not enough memory\n"); |
|
} |
|
|
|
return(EXIT_FAILURE); |
} |
} |
|
|
return(EXIT_FAILURE); |
strcpy((*s_etat_processus).localisation, d_locale); |
} |
} |
|
|
printf("+++RPL/2 (R) version %s (%s)\n", d_version_rpl, |
printf("+++RPL/2 (R) version %s (%s)\n", d_version_rpl, |
Line 231 rplinit(int argc, char *argv[], unsigned
|
Line 298 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
# ifndef SEMAPHORES_NOMMES |
if (pthread_setspecific(semaphore_fork_processus_courant, |
if (pthread_setspecific(semaphore_fork_processus_courant, |
&((*s_etat_processus).semaphore_fork)) != 0) |
&((*s_etat_processus).semaphore_fork)) != 0) |
|
# else |
|
if (pthread_setspecific(semaphore_fork_processus_courant, |
|
(*s_etat_processus).semaphore_fork) != 0) |
|
# endif |
{ |
{ |
if ((*s_etat_processus).langue == 'F') |
if ((*s_etat_processus).langue == 'F') |
{ |
{ |
Line 379 rplinit(int argc, char *argv[], unsigned
|
Line 451 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
action.sa_sigaction = interruption11; |
|
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); |
|
} |
|
|
action.sa_sigaction = interruption8; |
action.sa_sigaction = interruption8; |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
action.sa_flags = SA_NODEFER | SA_ONSTACK | SA_SIGINFO; |
|
|
Line 1272 rplinit(int argc, char *argv[], unsigned
|
Line 1364 rplinit(int argc, char *argv[], unsigned
|
return(EXIT_FAILURE); |
return(EXIT_FAILURE); |
} |
} |
|
|
|
free(type_debug); |
break; |
break; |
} |
} |
|
|
Line 1623 rplinit(int argc, char *argv[], unsigned
|
Line 1716 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'; |
(*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'; |
Line 1770 rplinit(int argc, char *argv[], unsigned
|
Line 1864 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).at_exit = NULL; |
|
|
(*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 1785 rplinit(int argc, char *argv[], unsigned
|
Line 1881 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); |
Line 2548 rplinit(int argc, char *argv[], unsigned
|
Line 2645 rplinit(int argc, char *argv[], unsigned
|
erreur = sequenceur_optimise(s_etat_processus); |
erreur = sequenceur_optimise(s_etat_processus); |
} |
} |
} |
} |
|
|
|
if (erreur == d_absence_erreur) |
|
{ |
|
if (((*s_etat_processus).var_volatile_alarme == 0) |
|
&& ((*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).at_exit); |
} |
} |
|
|
if ((*s_etat_processus).generateur_aleatoire != NULL) |
if ((*s_etat_processus).generateur_aleatoire != NULL) |
Line 2666 rplinit(int argc, char *argv[], unsigned
|
Line 2778 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 2694 rplinit(int argc, char *argv[], unsigned
|
Line 2817 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 2730 rplinit(int argc, char *argv[], unsigned
|
Line 2868 rplinit(int argc, char *argv[], unsigned
|
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 2795 rplinit(int argc, char *argv[], unsigned
|
Line 2926 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 3318 rplinit(int argc, char *argv[], unsigned
|
Line 3457 rplinit(int argc, char *argv[], unsigned
|
} |
} |
|
|
# ifndef Cygwin |
# ifndef Cygwin |
|
(*s_etat_processus).pile_signal.ss_flags = SS_DISABLE; |
|
sigaltstack(&((*s_etat_processus).pile_signal), NULL); |
free((*s_etat_processus).pile_signal.ss_sp); |
free((*s_etat_processus).pile_signal.ss_sp); |
# endif |
# endif |
|
|
Line 3330 rplinit(int argc, char *argv[], unsigned
|
Line 3471 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)); |
|
# 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)); |
|
# else |
|
sem_post((*s_etat_processus).semaphore_fork); |
|
sem_destroy2((*s_etat_processus).semaphore_fork, sem_fork); |
|
# endif |
|
|
free((*s_etat_processus).localisation); |
free((*s_etat_processus).localisation); |
free(s_etat_processus); |
|
|
|
|
# ifndef SEMAPHORES_NOMMES |
sem_destroy(&semaphore_liste_threads); |
sem_destroy(&semaphore_liste_threads); |
|
# else |
|
sem_destroy2(semaphore_liste_threads, sem_liste_threads); |
|
# endif |
|
# ifndef SEMAPHORES_NOMMES |
sem_post(&semaphore_gestionnaires_signaux); |
sem_post(&semaphore_gestionnaires_signaux); |
sem_destroy(&semaphore_gestionnaires_signaux); |
sem_destroy(&semaphore_gestionnaires_signaux); |
sem_destroy(&semaphore_gestionnaires_signaux_atomique); |
sem_destroy(&semaphore_gestionnaires_signaux_atomique); |
|
# else |
|
sem_post(semaphore_gestionnaires_signaux); |
|
sem_destroy2(semaphore_gestionnaires_signaux, sem_gestionnaires_signaux); |
|
sem_destroy2(semaphore_gestionnaires_signaux_atomique, |
|
sem_gestionnaires_signaux_atomique); |
|
# endif |
|
|
|
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); |