--- rpl/src/rpl.h 2010/03/06 18:29:07 1.15 +++ rpl/src/rpl.h 2010/05/02 08:05:02 1.29 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.12 + RPL/2 (R) version 4.0.15 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -26,8 +26,6 @@ #define _GNU_SOURCE #define _REENTRANT -// Nécessaire pour les systèmes qui ne comprennent pas _GNU_SOURCE -#define _XOPEN_SOURCE 500 /* ================================================================================ @@ -42,6 +40,7 @@ #include #include #include +#include #ifndef RPLARGS # include @@ -94,6 +93,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) @@ -108,9 +112,7 @@ # define postgresqlclose(arg) #endif -#ifdef LIBRPL -# include "librplprototypes.h" -#endif +#include "librplprototypes.h" /* ================================================================================ @@ -119,10 +121,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 @@ -183,27 +191,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 sem_t +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_liste_threads; - extern pthread_key_t semaphore_fork_processus_courant; + 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; - pthread_key_t semaphore_fork_processus_courant; +# ifdef SEMAPHORES_NOMMES + pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; +# endif - sem_t semaphore_liste_threads; - sem_t semaphore_gestionnaires_signaux; - sem_t semaphore_gestionnaires_signaux_atomique; + pthread_key_t semaphore_fork_processus_courant; + + 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 @@ -310,7 +393,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 \ @@ -620,19 +703,11 @@ void debug_memoire_retrait(void *ptr); # define d_ex_locales 76 # define d_ex_representation 77 # 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 -/* --------------------------------------------------------------------------------- - Erreurs de la ligne de commande --------------------------------------------------------------------------------- -*/ - -#ifndef RPLARGS -# define d_os 4000 -# define d_os_ligne_de_commande 4001 -# define d_os_fichier_introuvable 4002 -#endif /* ================================================================================ @@ -1364,6 +1439,7 @@ typedef struct processus unsigned char autorisation_conversion_chaine; /*Y/N*/ unsigned char autorisation_empilement_programme; /*Y/N*/ unsigned char autorisation_evaluation_nom; /*Y/N*/ + unsigned char autorisation_nom_implicite; /*Y/N*/ unsigned char evaluation_forcee; /*Y/N*/ unsigned char instruction_valide; /*Y/N*/ unsigned char instruction_intrinseque; /*Y/I/N*/ @@ -1690,6 +1766,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; @@ -1703,6 +1781,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 */ @@ -1749,7 +1829,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 */ @@ -1873,6 +1957,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); @@ -1892,6 +1977,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); @@ -2042,6 +2128,7 @@ void instruction_ifft(struct_processus * void instruction_ift(struct_processus *s_etat_processus); void instruction_ifte(struct_processus *s_etat_processus); void instruction_im(struct_processus *s_etat_processus); +void instruction_implicit(struct_processus *s_etat_processus); void instruction_in(struct_processus *s_etat_processus); void instruction_incr(struct_processus *s_etat_processus); void instruction_indep(struct_processus *s_etat_processus); @@ -2403,6 +2490,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, @@ -2658,7 +2746,7 @@ logical1 evaluation(struct_processus *s_ logical1 initialisation_fichier_acces_direct(struct_processus *s_etat_processus, sqlite3 *sqlite, logical1 binaire); logical1 initialisation_fichier_acces_indexe(struct_processus *s_etat_processus, - sqlite3 *sqlite, logical1 binaire); + sqlite3 *sqlite, integer8 position_clef, logical1 binaire); logical1 recherche_instruction_suivante(struct_processus *s_etat_processus); logical1 retrait_variable(struct_processus *s_etat_processus, unsigned char *nom_variable, unsigned char type);