--- rpl/src/rpl.h 2010/03/04 10:17:55 1.12 +++ rpl/src/rpl.h 2010/04/28 06:41:06 1.26 @@ -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 @@ -75,6 +74,9 @@ # include "termcap.h" # include "iconv.h" +# include "openssl/evp.h" +# include "sqlite3.h" + # define HAVE_INLINE # define GSL_RANGE_CHECK_OFF # include "gsl/gsl_cdf.h" @@ -91,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) @@ -105,9 +112,7 @@ # define postgresqlclose(arg) #endif -#ifdef LIBRPL -# include "librplprototypes.h" -#endif +#include "librplprototypes.h" /* ================================================================================ @@ -180,27 +185,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 semaphore_liste_threads; - extern sem_t semaphore_gestionnaires_signaux; - extern sem_t semaphore_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 # 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; + + sem_t +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_liste_threads; - pthread_key_t semaphore_fork_processus_courant; + sem_t +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_gestionnaires_signaux; - sem_t semaphore_liste_threads; - sem_t semaphore_gestionnaires_signaux; - sem_t semaphore_gestionnaires_signaux_atomique; + 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 @@ -307,7 +387,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 \ @@ -484,6 +564,7 @@ void debug_memoire_retrait(void *ptr); # define d_es_nombre_max_descripteurs 2011 # define d_es_interruption_invalide 2012 # define d_es_contexte 2013 +# define d_es_somme_controle 2014 #endif /* @@ -616,19 +697,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 /* ================================================================================ @@ -844,12 +917,14 @@ typedef struct descripteur_fichier unsigned long identifiant; unsigned char effacement; + unsigned char type; // C (file *) ou S (sqlite *) unsigned char *nom; pid_t pid; pthread_t tid; - file *descripteur; + file *descripteur_c; + sqlite3 *descripteur_sqlite; } struct_descripteur_fichier; #endif @@ -1020,8 +1095,8 @@ typedef struct descripteur_thread struct_objet *argument; - pid_t pid; - volatile pthread_t tid; + pid_t pid; + volatile pthread_t tid; pthread_t thread_pere; @@ -1358,6 +1433,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*/ @@ -1684,6 +1760,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; @@ -1701,6 +1779,8 @@ typedef struct processus /* Autres */ + char *rpl_home; + gsl_rng *generateur_aleatoire; const gsl_rng_type *type_generateur_aleatoire; @@ -1741,7 +1821,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 */ @@ -1865,6 +1949,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); @@ -2034,6 +2119,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); @@ -2395,6 +2481,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, @@ -2523,7 +2610,7 @@ complex16 sommation_vecteur_complexe(com */ #ifndef RPLARGS -int rplinit(int argc, char *argv[], unsigned char ***resultats); +int rplinit(int argc, char *argv[], unsigned char ***resultats, char *rpl_home); #endif /* @@ -2626,6 +2713,8 @@ logical1 analyse_syntaxique(struct_proce logical1 caracteristiques_fichier(struct_processus *s_etat_processus, unsigned char *nom, logical1 *existence, logical1 *ouverture, unsigned long *unite); +logical1 controle(struct_processus *s_etat_processus, unsigned char *fichier, + unsigned char *type, unsigned char *somme_candidate); logical1 creation_variable(struct_processus *s_etat_processus, struct_variable *s_variable, unsigned char autorisation_creation_variable_statique, @@ -2645,6 +2734,10 @@ logical1 empilement_pile_last(struct_pro unsigned long nombre_arguments); logical1 evaluation(struct_processus *s_etat_processus, struct_objet *s_objet, unsigned char type_evaluation); +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, 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); @@ -2767,14 +2860,14 @@ struct_processus *copie_etat_processus(s /* -------------------------------------------------------------------------------- - Fonctions renvoyant un pointeur sur un fichier (file *) + Fonctions renvoyant un pointeur sur un fichier (file *) ou un descripteur -------------------------------------------------------------------------------- */ #ifndef RPLARGS file *creation_fichier_tex(struct_processus *s_etat_processus); -file *descripteur_fichier(struct_processus *s_etat_processus, - struct_fichier *s_fichier); +struct_descripteur_fichier *descripteur_fichier(struct_processus + *s_etat_processus, struct_fichier *s_fichier); #endif /*