--- rpl/src/rpl.h 2011/07/22 07:38:41 1.106 +++ rpl/src/rpl.h 2011/09/15 17:51:44 1.122 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.1 + RPL/2 (R) version 4.1.3 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -25,7 +25,7 @@ #ifndef __RPLCAS # define _GNU_SOURCE -# define _POSIX_C_SOURCE 200112L +# define _XOPEN_SOURCE 700 #endif #define _REENTRANT @@ -99,11 +99,7 @@ # endif # include - -# ifdef _BROKEN_SIGINFO -# include -# include -# endif +# include # ifndef IPCS_SYSV # include @@ -213,30 +209,56 @@ ================================================================================ */ -#ifdef _BROKEN_SIGINFO -# define SIGHANDLER_ARGS int signal -# ifdef SA_SIGINFO -# undef SA_SIGINFO -# endif -# define SA_SIGINFO 0 +enum signaux_rpl +{ + rpl_signull = 0, + rpl_sigint, + rpl_sigterm, + rpl_sigstart, // Signal envoyé par un père pour lancer son fils. + rpl_sigcont, // Signal de redémarrage d'un processus arrêté par + // SUSPEND + rpl_sigstop, // Signal d'arrêt envoyé par l'instruction STOP ou + // FUSE. (FSTOP) + rpl_sigabort, // Signal envoyé par l'instruction ABORT (à regrouper + // avec FABORT) + rpl_sigurg, // Signal d'arrêt urgent + rpl_siginject, // Signal indiquant la présence d'une donnée à lire + // envoyée depuis le père + rpl_sigalrm, // Signal d'alarme (erreur système) depuis un fils + rpl_sighup, + rpl_sigtstp, + rpl_sigexcept, + rpl_sigmax +}; -# ifndef __BROKEN_SIGINFO_ROUTINES__ +#define LONGUEUR_QUEUE_SIGNAUX 1024 -// pthread_kill() est une macro sous OS/2. -# ifdef pthread_kill -# undef pthread_kill -# endif +// Une structure s_queue_signaux est créée par processus (et non par thread). +// Elle est projetée dans un segment de mémoire partagée pour qu'elle soit +// accessible à la fois du père et des fils. -# define kill(a, b) kill_broken_siginfo(a, b) -# define pthread_kill(a, b) pthread_kill_broken_siginfo(a, b) -# endif +typedef struct queue_signaux +{ + pthread_mutex_t mutex; - int kill_broken_siginfo(pid_t pid, int signal); - int pthread_kill_broken_siginfo(pthread_t tid, int signal); - pid_t origine_signal(int signal); - int queue_in(pid_t pid, int signal); -#else -# define SIGHANDLER_ARGS int signal, siginfo_t *siginfo, void *context + volatile int pointeur_lecture; + volatile int pointeur_ecriture; + + volatile struct + { + pid_t pid; + enum signaux_rpl signal; + } queue[LONGUEUR_QUEUE_SIGNAUX]; +} struct_queue_signaux; + +#ifndef RPLARGS +# ifndef MAIN_RPL + extern struct_queue_signaux *s_queue_signaux; + extern int f_queue_signaux; +# else + struct_queue_signaux *s_queue_signaux; + int f_queue_signaux; +# endif #endif #ifdef OpenBSD @@ -297,25 +319,7 @@ union semun // SIGPIPE // SIGALRM -// Arrêt par STOP -# define SIGFSTOP SIGUSR1 -// Démarrage d'un processus fils -# define SIGSTART SIGUSR2 -// Injection de données -# define SIGINJECT SIGQUIT -// Arrêt général -# ifndef OpenBSD -// La libpthread d'OpenBSD utilise SIGPROF -# define SIGABORT SIGPROF -# else -# define SIGABORT SIGTHR -# endif -// Arrêt d'un processus fils depuis autre chose que STOP -# if defined(Darwin) || defined(OpenBSD) -# define SIGFABORT SIGINFO -# else -# define SIGFABORT SIGPOLL -# endif +# define SIGTEST SIGUSR1 // Nombre d'interruptions disponibles # define d_NOMBRE_INTERRUPTIONS 64 @@ -383,81 +387,52 @@ typedef unsigned char t_8_bits; # endif # ifndef MAIN_RPL -# ifdef _BROKEN_SIGINFO - extern int *fifos_signaux; -# endif - extern jmp_buf contexte; extern jmp_buf contexte_initial; + extern jmp_buf contexte_processus; + extern jmp_buf contexte_thread; -# ifdef SEMAPHORES_NOMMES - extern pthread_mutex_t mutex_sem; -# endif + extern int signal_test; - extern pthread_key_t semaphore_fork_processus_courant; + extern pid_t pid_processus_pere; - extern sem_t # ifdef SEMAPHORES_NOMMES - * + extern pthread_mutex_t mutex_sem; # endif - semaphore_liste_threads; - extern sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_gestionnaires_signaux; + extern pthread_mutex_t mutex_liste_threads; + extern pthread_mutex_t mutex_gestionnaires_signaux_atomique; extern sem_t # ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_gestionnaires_signaux_atomique; - -# ifdef SEMAPHORES_NOMMES - // 0 -> liste_threads - // 1 -> gestionnaire_signaux - // 2 -> gestionnaire_signaux_atomique - // 3 -> &((*s_etat_processus).semaphore_fork) - extern unsigned char noms_semaphores[4][LONGUEUR_NOM_SEMAPHORE]; - extern sem_t *semaphores_nommes[4]; + * # endif + semaphore_gestionnaires_signaux; # else -# ifdef _BROKEN_SIGINFO - int *fifos_signaux; -# endif - jmp_buf contexte; jmp_buf contexte_initial; + jmp_buf contexte_processus; + jmp_buf contexte_thread; -# ifdef SEMAPHORES_NOMMES - pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; -# endif + int signal_test; - pthread_key_t semaphore_fork_processus_courant; + pid_t pid_processus_pere; - sem_t # ifdef SEMAPHORES_NOMMES - * + pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; # endif - semaphore_liste_threads; + pthread_mutex_t mutex_liste_threads = + PTHREAD_MUTEX_INITIALIZER; + pthread_mutex_t mutex_gestiionnaires_signaux = + PTHREAD_MUTEX_INITIALIZER; + pthread_mutex_t mutex_gestionnaires_signaux_atomique = + PTHREAD_MUTEX_INITIALIZER; sem_t # ifdef SEMAPHORES_NOMMES - * + * # endif semaphore_gestionnaires_signaux; - - sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_gestionnaires_signaux_atomique; - -# ifdef SEMAPHORES_NOMMES - unsigned char noms_semaphores[4][LONGUEUR_NOM_SEMAPHORE]; - sem_t *semaphores_nommes[4]; -# endif # endif #endif @@ -753,6 +728,7 @@ pid_t debug_fork(); -------------------------------------------------------------------------------- */ +#define DEBUG_ERREURS #ifdef DEBUG_ERREURS # ifdef MESSAGES # define __erreur(i) i @@ -1388,9 +1364,6 @@ typedef struct descripteur_thread logical1 processus_detache; logical1 destruction_objet; - sigset_t oldset; - sigset_t set; - volatile signed long nombre_references; } struct_descripteur_thread; @@ -1845,6 +1818,12 @@ typedef struct processus # define RTLD_LOCAL 0 # endif + volatile int pointeur_signal_ecriture; + volatile int pointeur_signal_lecture; + volatile enum signaux_rpl signaux_en_queue[LONGUEUR_QUEUE_SIGNAUX]; + volatile logical1 demarrage_fils; + volatile logical1 redemarrage_processus; + /* Contextes */ struct_liste_chainee *l_base_pile_contextes; @@ -2059,6 +2038,7 @@ typedef struct processus /* Traitement des erreurs */ + unsigned int compteur_violation_d_acces; unsigned int erreur_compilation; unsigned int erreur_execution; unsigned int erreur_systeme; @@ -2146,6 +2126,8 @@ typedef struct processus gsl_rng *generateur_aleatoire; const gsl_rng_type *type_generateur_aleatoire; + void *contexte_cas; + integer8 nombre_arguments; /* @@ -2183,12 +2165,8 @@ typedef struct processus pthread_mutex_t mutex; pthread_mutex_t mutex_allocation; - // Sémaphore autorisant les fork() - sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_fork; + // Mutex autorisant les fork() + pthread_mutex_t mutex_fork; /* Mutexes */ @@ -2292,6 +2270,7 @@ typedef struct fonction // BEGIN C PROTOTYPES void instruction_sensible_e(struct_processus *s_etat_processus); void instruction_sensible_i(struct_processus *s_etat_processus); +void instruction_sensible_infinity(struct_processus *s_etat_processus); void instruction_abort(struct_processus *s_etat_processus); void instruction_abs(struct_processus *s_etat_processus); @@ -2488,6 +2467,7 @@ void instruction_in(struct_processus *s_ void instruction_incr(struct_processus *s_etat_processus); void instruction_indep(struct_processus *s_etat_processus); void instruction_input(struct_processus *s_etat_processus); +void instruction_infinity(struct_processus *s_etat_processus); void instruction_inquire(struct_processus *s_etat_processus); void instruction_int(struct_processus *s_etat_processus); void instruction_interrupt(struct_processus *s_etat_processus); @@ -2511,6 +2491,7 @@ void instruction_lcd_fleche(struct_proce void instruction_lchol(struct_processus *s_etat_processus); void instruction_le(struct_processus *s_etat_processus); void instruction_legv(struct_processus *s_etat_processus); +void instruction_limit(struct_processus *s_etat_processus); void instruction_line(struct_processus *s_etat_processus); void instruction_list_fleche(struct_processus *s_etat_processus); void instruction_ln(struct_processus *s_etat_processus); @@ -2703,6 +2684,7 @@ void instruction_sqlquery(struct_process void instruction_sqrt(struct_processus *s_etat_processus); void instruction_sr(struct_processus *s_etat_processus); void instruction_srb(struct_processus *s_etat_processus); +void instruction_srev(struct_processus *s_etat_processus); void instruction_sst(struct_processus *s_etat_processus); void instruction_star_d(struct_processus *s_etat_processus); void instruction_star_h(struct_processus *s_etat_processus); @@ -2764,7 +2746,6 @@ void instruction_t_vers_l(struct_process void instruction_ucase(struct_processus *s_etat_processus); void instruction_uchol(struct_processus *s_etat_processus); -void instruction_undo(struct_processus *s_etat_processus); void instruction_unlock(struct_processus *s_etat_processus); void instruction_unprotect(struct_processus *s_etat_processus); void instruction_until(struct_processus *s_etat_processus); @@ -2880,6 +2861,7 @@ void impression_tex(struct_processus *s_ void informations(struct_processus *s_etat_processus); void initialisation_allocateur(struct_processus *s_etat_processus); void initialisation_completion(void); +void initialisation_contexte_cas(struct_processus *s_etat_processus); void initialisation_drapeaux(struct_processus *s_etat_processus); void initialisation_generateur_aleatoire(struct_processus *s_etat_processus, logical1 initialisation_automatique, unsigned long int racine); @@ -2899,17 +2881,11 @@ void integrale_romberg(struct_processus real8 a, real8 b, real8 precision); void interface_cas(struct_processus *s_etat_processus, enum t_rplcas_commandes commande); -void interruption1(SIGHANDLER_ARGS); -void interruption2(SIGHANDLER_ARGS); -void interruption3(SIGHANDLER_ARGS); -void interruption4(SIGHANDLER_ARGS); -void interruption5(SIGHANDLER_ARGS); -void interruption6(SIGHANDLER_ARGS); -void interruption7(SIGHANDLER_ARGS); -void interruption8(SIGHANDLER_ARGS); -void interruption9(SIGHANDLER_ARGS); -void interruption10(SIGHANDLER_ARGS); -void interruption11(SIGHANDLER_ARGS); +void interruption1(int signal); +void interruption2(int signal); +void interruption3(int signal); +void interruption4(int signal); +void interruption5(int signal); void inversion_matrice(struct_processus *s_etat_processus, struct_matrice *s_matrice); void lancement_daemon(struct_processus *s_etat_processus); @@ -2926,6 +2902,7 @@ void liberation_arbre_instructions(struc struct_instruction *arbre); void liberation_arbre_variables(struct_processus *s_etat_processus, struct_arbre_variables *arbre, logical1 definitions); +void liberation_contexte_cas(struct_processus *s_etat_processus); void liberation_generateur_aleatoire(struct_processus *s_etat_processus); void liberation_threads(struct_processus *s_etat_processus); void liberation_profil(struct_processus *s_etat_processus); @@ -2943,6 +2920,7 @@ void retrait_thread_surveillance(struct_ struct_descripteur_thread *s_argument_thread); void rplcore(struct_processus *s_etat_processus); void scrutation_injection(struct_processus *s_etat_processus); +void scrutation_interruptions(struct_processus *s_etat_processus); void sf(struct_processus *s_etat_processus, unsigned char indice_drapeau); void *surveillance_processus(void *argument); void swap(void *variable_1, void *variable_2, unsigned long taille_octets); @@ -2970,12 +2948,20 @@ void valeurs_singulieres(struct_processu void verrouillage_threads_concurrents(struct_processus *s_etat_processus); #endif +/* +-------------------------------------------------------------------------------- + Fonctions de gestion des signaux +-------------------------------------------------------------------------------- +*/ + #ifndef RPLARGS -#ifdef _BROKEN_SIGINFO -void creation_fifos_signaux(struct_processus *s_etat_processus); -void destruction_fifos_signaux(struct_processus *s_etat_processus); -void liberation_fifos_signaux(struct_processus *s_etat_processus); -#endif +void creation_queue_signaux(struct_processus *s_etat_processus); +void liberation_queue_signaux(struct_processus *s_etat_processus); +void destruction_queue_signaux(struct_processus *s_etat_processus); +int envoi_signal_contexte(struct_processus *s_etat_processus, + enum signaux_rpl signal); +int envoi_signal_processus(pid_t pid, enum signaux_rpl signal); +int envoi_signal_thread(pthread_t tid, enum signaux_rpl signal); #endif /*