--- rpl/src/rpl.h 2010/04/07 13:33:23 1.20 +++ rpl/src/rpl.h 2010/05/16 19:36:20 1.35 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.13 + RPL/2 (R) version 4.0.15 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -24,8 +24,13 @@ #define INCLUSION_RPL #define _GNU_SOURCE +#define _POSIX_C_SOURCE 200112L #define _REENTRANT +#ifdef Darwin +# define SIGPOLL SIGIO +# define _DARWIN_C_SOURCE +#endif /* ================================================================================ @@ -43,6 +48,7 @@ #include #ifndef RPLARGS +# include # include # include # include @@ -93,6 +99,11 @@ # include #endif +// Définition spécifique à Hurd +#ifndef PIPE_BUF +# define fpathconf (".", _PC_PIPE_BUF) +#endif + #ifdef MYSQL_SUPPORT # include # define mysqlclose(arg) mysql_close(arg.mysql) @@ -107,9 +118,7 @@ # define postgresqlclose(arg) #endif -#ifdef LIBRPL -# include "librplprototypes.h" -#endif +#include "librplprototypes.h" /* ================================================================================ @@ -118,10 +127,16 @@ */ #ifndef RPLARGS +// 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 # define SIGABORT SIGPROF +// Arrêt d'un processus fils depuis autre chose que STOP +# define SIGFABORT SIGPOLL # define d_NOMBRE_INTERRUPTIONS 64 #endif @@ -182,27 +197,102 @@ typedef unsigned char t_8_bits; */ #ifndef RPLARGS +# ifdef SEMAPHORES_NOMMES +# define LONGUEUR_NOM_SEMAPHORE 64 +# endif # ifndef MAIN_RPL - extern jmp_buf contexte; - extern jmp_buf contexte_initial; + extern jmp_buf contexte; + extern jmp_buf contexte_initial; + +# ifdef SEMAPHORES_NOMMES + extern pthread_mutex_t mutex_sem; +# endif + + extern pthread_key_t semaphore_fork_processus_courant; - extern pthread_key_t semaphore_fork_processus_courant; + extern sem_t +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_liste_threads; + + extern sem_t +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_gestionnaires_signaux; + + extern sem_t +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_gestionnaires_signaux_atomique; - extern sem_t semaphore_liste_threads; - extern sem_t semaphore_gestionnaires_signaux; - extern sem_t 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 # else - jmp_buf contexte; - jmp_buf contexte_initial; + jmp_buf contexte; + jmp_buf contexte_initial; + +# ifdef SEMAPHORES_NOMMES + pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; +# endif - pthread_key_t semaphore_fork_processus_courant; + pthread_key_t semaphore_fork_processus_courant; - sem_t semaphore_liste_threads; - sem_t semaphore_gestionnaires_signaux; - sem_t semaphore_gestionnaires_signaux_atomique; + sem_t +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_liste_threads; + + 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 +#ifdef SEMAPHORES_NOMMES +enum t_semaphore { sem_liste_threads = 0, + sem_gestionnaires_signaux = 1, + sem_gestionnaires_signaux_atomique = 2, + sem_fork = 3 }; + +sem_t *sem_init2(unsigned int valeur, enum t_semaphore semaphore); +int sem_destroy2(sem_t *semaphore_p, enum t_semaphore semaphore); +int sem_getvalue2(sem_t *semaphore, int *valeur); + +#define sem_getvalue(semaphore, value) sem_getvalue2(semaphore, value) +#define sem_post(semaphore) \ + ({ int r; pthread_mutex_lock(&mutex_sem); \ + r = sem_post(semaphore), pthread_mutex_unlock(&mutex_sem); r; }) +#define sem_wait(semaphore) \ + ({ int r; pthread_mutex_lock(&mutex_sem); \ + r = sem_wait(semaphore), pthread_mutex_unlock(&mutex_sem); r; }) +#define sem_trywait(semaphore) \ + ({ int r; pthread_mutex_lock(&mutex_sem); \ + r = sem_trywait(semaphore), pthread_mutex_unlock(&mutex_sem); r; }) +#endif + /* ================================================================================ Macros @@ -277,12 +367,6 @@ typedef unsigned char t_8_bits; # define abs(i) (((i) >= 0) ? (i) : (-i)) #endif -#define BUG(b, ...) \ - do { if (b) { uprintf("[%d] BUG! <%s()> at line #%d of %s\n", \ - (int) getpid(), __FUNCTION__, __LINE__, __FILE__); \ - __VA_ARGS__; fflush(stdout); \ - pthread_kill(pthread_self(), SIGBUS); }} while(0) - #define NOTICE(m) \ do \ { \ @@ -294,6 +378,7 @@ typedef unsigned char t_8_bits; #ifdef __GLIBC__ #include +#define __BACKTRACE #define BACKTRACE(n) \ do \ { \ @@ -309,7 +394,7 @@ typedef unsigned char t_8_bits; if (appels != NULL) \ { \ for(i = 0; i < nb; i++) \ - uprintf("%s\n", appels[i]); \ + uprintf(" %s\n", appels[i]); \ free(appels); \ } \ else \ @@ -322,6 +407,21 @@ typedef unsigned char t_8_bits; #define BACKTRACE(n) NOTICE("BACKTRACE only defined in glibc") #endif +#ifdef __BACKTRACE +# define BUG(b, ...) \ + do { if (b) { uprintf("[%d] BUG! <%s()> at line #%d of %s\n", \ + (int) getpid(), __FUNCTION__, __LINE__, __FILE__); \ + __VA_ARGS__; fflush(stdout); \ + BACKTRACE(64); \ + pthread_kill(pthread_self(), SIGBUS); }} while(0) +#else +# define BUG(b, ...) \ + do { if (b) { uprintf("[%d] BUG! <%s()> at line #%d of %s\n", \ + (int) getpid(), __FUNCTION__, __LINE__, __FILE__); \ + __VA_ARGS__; fflush(stdout); \ + pthread_kill(pthread_self(), SIGBUS); }} while(0) +#endif + /* ================================================================================ @@ -330,12 +430,14 @@ typedef unsigned char t_8_bits; */ #ifdef DEBUG_MEMOIRE +void analyse_post_mortem(); void *debug_memoire_ajout(size_t taille, const unsigned char *fonction, unsigned long ligne, const unsigned char *argument); void *debug_memoire_modification(void *pointeur, size_t taille, const unsigned char *fonction, unsigned long ligne, const unsigned char *argument); void debug_memoire_retrait(void *ptr); +void debug_memoire_verification(); #define malloc(s) debug_memoire_ajout(s, __FUNCTION__, __LINE__, #s) #define free(s) debug_memoire_retrait(s) @@ -414,10 +516,11 @@ void debug_memoire_retrait(void *ptr); #define d_absence_erreur ((logical1) d_faux) #define d_erreur ((logical1) d_vrai) -#define d_code_fin_chaine '\0' -#define d_code_espace ' ' -#define d_code_retour_chariot '\n' -#define d_code_tabulation '\t' +#define d_code_fin_chaine '\0' +#define d_code_espace ' ' +#define d_code_retour_chariot '\n' +#define d_code_tabulation '\t' +#define d_longueur_maximale_instruction 16 #define d_INT "integer" #define d_REL "real" @@ -487,7 +590,6 @@ void debug_memoire_retrait(void *ptr); # define d_es_interruption_invalide 2012 # define d_es_contexte 2013 # define d_es_somme_controle 2014 -# define d_es_nom_implicite 2015 #endif /* @@ -622,6 +724,7 @@ void debug_memoire_retrait(void *ptr); # define d_ex_erreur_profilage 78 # define d_ex_enregistrement_inexistant 79 # define d_ex_clef_inexistante 80 +# define d_ex_nom_implicite 81 #endif @@ -1682,6 +1785,8 @@ typedef struct processus unsigned char traitement_interruption; /* Y/N */ unsigned char traitement_interruptible; /* Y/N */ + struct_objet *at_exit; + /* Variables volatiles */ volatile sig_atomic_t var_volatile_alarme; @@ -1695,6 +1800,8 @@ typedef struct processus volatile sig_atomic_t var_volatile_processus_pere; volatile sig_atomic_t var_volatile_recursivite; + volatile sig_atomic_t arret_depuis_abort; + volatile int var_volatile_exception_gsl; /* Autres */ @@ -1741,7 +1848,11 @@ typedef struct processus pthread_mutex_t mutex; // Sémaphore autorisant les fork() - sem_t semaphore_fork; + sem_t +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_fork; /* Mutexes */ @@ -1761,7 +1872,7 @@ typedef struct processus unsigned long taille_pile_objets; struct_objet *pile_objets; -# define TAILLE_CACHE 1024 +# define TAILLE_CACHE 16384 unsigned long *objets_adr[TAILLE_CACHE]; int pointeur_adr; @@ -1865,6 +1976,7 @@ void instruction_asl(struct_processus *s void instruction_asr(struct_processus *s_etat_processus); void instruction_atan(struct_processus *s_etat_processus); void instruction_atanh(struct_processus *s_etat_processus); +void instruction_atexit(struct_processus *s_etat_processus); void instruction_autoscale(struct_processus *s_etat_processus); void instruction_axes(struct_processus *s_etat_processus); @@ -1884,6 +1996,7 @@ void instruction_clear(struct_processus void instruction_cllcd(struct_processus *s_etat_processus); void instruction_clmf(struct_processus *s_etat_processus); void instruction_close(struct_processus *s_etat_processus); +void instruction_clratexit(struct_processus *s_etat_processus); void instruction_clrcntxt(struct_processus *s_etat_processus); void instruction_clrerr(struct_processus *s_etat_processus); void instruction_clrfuse(struct_processus *s_etat_processus); @@ -2083,6 +2196,8 @@ void instruction_maxs(struct_processus * void instruction_mclrin(struct_processus *s_etat_processus); void instruction_mean(struct_processus *s_etat_processus); void instruction_mem(struct_processus *s_etat_processus); +void instruction_memlock(struct_processus *s_etat_processus); +void instruction_memunlock(struct_processus *s_etat_processus); void instruction_min(struct_processus *s_etat_processus); void instruction_mins(struct_processus *s_etat_processus); void instruction_mod(struct_processus *s_etat_processus); @@ -2137,6 +2252,7 @@ void instruction_print(struct_processus void instruction_private(struct_processus *s_etat_processus); void instruction_prlcd(struct_processus *s_etat_processus); void instruction_prmd(struct_processus *s_etat_processus); +void instruction_procid(struct_processus *s_etat_processus); void instruction_prompt(struct_processus *s_etat_processus); void instruction_protect(struct_processus *s_etat_processus); void instruction_prst(struct_processus *s_etat_processus); @@ -2370,7 +2486,7 @@ void *allocation_maillon(struct_processu #ifndef RPLARGS void analyse(struct_processus *s_etat_processus, void (*fonction)()); -inline void *analyse_instruction(struct_processus *s_etat_processus, +void *analyse_instruction(struct_processus *s_etat_processus, unsigned char *candidat); void appel_gnuplot(struct_processus *s_etat_processus, unsigned char persistance); @@ -2383,10 +2499,11 @@ void conversion_element_tex(unsigned cha void conversion_format(struct_processus *s_etat_processus, unsigned char *chaine); void conversion_hms_vers_decimal(real8 *angle); +void conversion_majuscule_limitee(unsigned char *chaine_entree, + unsigned char *chaine_sortie, unsigned long longueur); void conversion_radians_vers_degres(real8 *angle); void correction_formateur_tex(struct_processus *s_etat_processus, unsigned char **ligne); -void debug_memoire_verification(struct_processus *s_etat_processus); void depilement_pile_systeme(struct_processus *s_etat_processus); void derivation(struct_processus *s_etat_processus, struct_objet **s_expression); @@ -2396,6 +2513,7 @@ void deverrouillage_threads_concurrents( void ecriture_pile(struct_processus *s_etat_processus, file *flux, struct_liste_chainee *l_element_courant, unsigned long niveau_courant); void ecriture_profil(struct_processus *s_etat_processus); +void effacement_pile_systeme(struct_processus *s_etat_processus); void empilement_pile_systeme(struct_processus *s_etat_processus); void encart(struct_processus *s_etat_processus, unsigned long duree); void evaluation_romberg(struct_processus *s_etat_processus, @@ -2479,7 +2597,7 @@ void retrait_thread(struct_processus *s_ void retrait_thread_surveillance(struct_processus *s_etat_processus, struct_descripteur_thread *s_argument_thread); void rplcore(struct_processus *s_etat_processus); -inline void scrutation_injection(struct_processus *s_etat_processus); +void scrutation_injection(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); @@ -2699,9 +2817,9 @@ logical1 test_fonction(unsigned char *ch */ #ifndef RPLARGS -inline ssize_t read_atomic(struct_processus *s_etat_processus, +ssize_t read_atomic(struct_processus *s_etat_processus, int fd, void *buf, size_t count); -inline ssize_t write_atomic(struct_processus *s_etat_processus, +ssize_t write_atomic(struct_processus *s_etat_processus, int fd, void *buf, size_t count); #endif @@ -3091,7 +3209,7 @@ void zgelsy_(integer4 *m, integer4 *n, i * drapeau depuis une bibliothèque). */ -inline int test_arret(struct_processus *s_etat_processus); +int test_arret(struct_processus *s_etat_processus); #endif