--- rpl/src/rpl.h 2011/09/26 15:57:17 1.133 +++ rpl/src/rpl.h 2012/05/31 12:11:30 1.167 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.4 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.9 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -43,7 +43,6 @@ #ifdef OS2 # ifndef __RPLCAS # define _BSD_SOURCE -# define _XOPEN_SOURCE 600 # endif # include @@ -72,6 +71,7 @@ #include #include #include +#include #ifndef RPLARGS # include @@ -92,6 +92,7 @@ # include # include # include +# include # ifdef OS2 # undef pthread_mutexattr_settype @@ -99,7 +100,9 @@ # endif # include -# include +# ifdef SHARED_MEMORY +# include +# endif # ifndef IPCS_SYSV # include @@ -163,6 +166,10 @@ # include "openssl/evp.h" # include "sqlite3.h" # include "sigsegv.h" +# ifdef OS2 + // Bug de libsigsegv +# undef HAVE_STACK_OVERFLOW_RECOVERY +# endif # define HAVE_INLINE # define GSL_RANGE_CHECK_OFF @@ -208,12 +215,37 @@ # endif #endif +#ifdef MAIN_RPL +# define __EXTERN__ +# define __STATIC_MUTEX_INITIALIZATION__ = PTHREAD_MUTEX_INITIALIZER +#else +# define __EXTERN__ extern +# define __STATIC_MUTEX_INITIALIZATION__ +#endif + /* ================================================================================ Bugs spécifiques ================================================================================ */ +// Néant + +/* +================================================================================ + TYPES +================================================================================ +*/ + +typedef FILE file; +typedef unsigned char t_8_bits; + +#ifndef RPLARGS +# include "rpltypes-conv.h" +#else +# include "rpltypes.h" +#endif + enum signaux_rpl { rpl_signull = 0, @@ -248,13 +280,17 @@ typedef struct queue_signaux # ifndef IPCS_SYSV # ifndef SEMAPHORES_NOMMES sem_t semaphore; + sem_t signalisation; # endif # else sem_t semaphore; + sem_t signalisation; # endif volatile int pointeur_lecture; volatile int pointeur_ecriture; + pthread_t thread_signaux; + volatile logical1 requete_arret; volatile struct { @@ -263,26 +299,13 @@ typedef struct queue_signaux } queue[LONGUEUR_QUEUE_SIGNAUX]; } struct_queue_signaux; -# ifndef MAIN_RPL - extern struct_queue_signaux *s_queue_signaux; - extern int f_queue_signaux; -# ifdef SEMAPHORES_NOMMES - extern sem_t *semaphore_queue_signaux; -# endif -# else - struct_queue_signaux *s_queue_signaux; - int f_queue_signaux; -# ifdef SEMAPHORES_NOMMES - sem_t *semaphore_queue_signaux; -# endif -# endif -#endif +__EXTERN__ struct_queue_signaux *s_queue_signaux; +__EXTERN__ int f_queue_signaux; -#ifdef OpenBSD -# ifdef PTHREAD_SCOPE_SYSTEM -# undef PTHREAD_SCOPE_SYSTEM +# ifdef SEMAPHORES_NOMMES + __EXTERN__ sem_t *semaphore_queue_signaux; + __EXTERN__ sem_t *semaphore_signalisation; # endif -# define PTHREAD_SCOPE_SYSTEM 0 #endif #ifdef OS2 @@ -339,8 +362,9 @@ union semun // SIGINT // SIGTSTP // SIGCONT -// SIGURG // SIGPIPE +// SIGUSR1 et SIGUSR2 sont utilisé par libsigsegv. +// SIGHUP // SIGALRM # define SIGTEST SIGUSR1 @@ -386,21 +410,6 @@ union semun /* ================================================================================ - TYPES -================================================================================ -*/ - -typedef FILE file; -typedef unsigned char t_8_bits; - -#ifndef RPLARGS -# include "rpltypes-conv.h" -#else -# include "rpltypes.h" -#endif - -/* -================================================================================ Variables globales ================================================================================ */ @@ -410,66 +419,41 @@ typedef unsigned char t_8_bits; # define LONGUEUR_NOM_SEMAPHORE 64 # endif -# ifndef MAIN_RPL - extern jmp_buf contexte_ecriture; - extern jmp_buf contexte_impression; - extern jmp_buf contexte_initial; - extern jmp_buf contexte_processus; - extern jmp_buf contexte_thread; - - extern int signal_test; - - extern pid_t pid_processus_pere; - -# ifdef SEMAPHORES_NOMMES - extern pthread_mutex_t mutex_sem; -# endif - - extern pthread_mutex_t mutex_liste_threads; - extern pthread_mutex_t mutex_gestionnaires_signaux_atomique; +# ifdef SEMAPHORES_NOMMES +# define __PTR__ * +# else +# define __PTR__ +# endif - extern sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_gestionnaires_signaux; + __EXTERN__ jmp_buf contexte_ecriture; + __EXTERN__ jmp_buf contexte_impression; + __EXTERN__ jmp_buf contexte_initial; + __EXTERN__ jmp_buf contexte_processus; + __EXTERN__ jmp_buf contexte_thread; - extern volatile int routine_recursive; -# else - jmp_buf contexte_ecriture; - jmp_buf contexte_impression; - jmp_buf contexte_initial; - jmp_buf contexte_processus; - jmp_buf contexte_thread; + __EXTERN__ int signal_test; - int signal_test; + __EXTERN__ pid_t pid_processus_pere; - pid_t pid_processus_pere; +# ifdef SEMAPHORES_NOMMES + __EXTERN__ pthread_mutex_t mutex_sem __STATIC_MUTEX_INITIALIZATION__; +# endif -# ifdef SEMAPHORES_NOMMES - pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; -# endif + __EXTERN__ pthread_mutex_t mutex_liste_threads + __STATIC_MUTEX_INITIALIZATION__; + __EXTERN__ pthread_mutex_t mutex_gestionnaires_signaux_atomique + __STATIC_MUTEX_INITIALIZATION__; - pthread_mutex_t mutex_liste_threads = - PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_t mutex_gestionnaires_signaux = - PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_t mutex_gestionnaires_signaux_atomique = - PTHREAD_MUTEX_INITIALIZER; - sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_gestionnaires_signaux; + __EXTERN__ sem_t __PTR__ semaphore_gestionnaires_signaux; - volatile int routine_recursive; -# endif + __EXTERN__ volatile int routine_recursive; #endif #ifdef SEMAPHORES_NOMMES #define SEM_FORK 0 #define SEM_QUEUE 1 #define SEM_SIGNAUX 2 +#define SEM_SIGNALISATION 3 sem_t *sem_init2(unsigned int valeur, pid_t pid, int ordre); sem_t *sem_init3(unsigned int valeur, pid_t pid, pthread_t tid, int ordre); int sem_destroy2(sem_t *semaphore_p, pid_t pid, int ordre); @@ -521,9 +505,6 @@ sem_t *sem_open2(pid_t pid, int ordre); # define fclose(...) ({ int ios; \ while((ios = fclose(__VA_ARGS__)) != 0) \ { if ((errno != EINTR) && (errno != 0)) break; } ios; }) -# define fread(...) ({ int ios; \ - while((ios = fread(__VA_ARGS__)) < 0) \ - { if ((errno != EINTR) && (errno != 0)) break; } ios; }) # define fflush(flux) ({ int ios; \ while((ios = fflush((flux == stdout) ? stderr : flux)) != 0) \ { if ((errno != EINTR) && (errno != 0)) break; } ios; }) @@ -799,6 +780,7 @@ pid_t debug_fork(); # define d_es_contexte __erreur(2013) # define d_es_somme_controle __erreur(2014) # define d_es_semaphore __erreur(2015) +# define d_es_mutex_acquis_autre_thread __erreur(2016) #endif /* @@ -937,6 +919,10 @@ pid_t debug_fork(); # define d_ex_version_bibliotheque __erreur(82) # define d_ex_creation_variable_globale __erreur(83) # define d_ex_erreur_interne_rplcas __erreur(84) +# define d_ex_fichier_corrompu __erreur(85) +# define d_ex_mutex_acquis_autre_thread __erreur(86) +# define d_ex_expression_reguliere __erreur(87) +# define d_ex_instruction_indisponible __erreur(88) #endif @@ -1124,6 +1110,7 @@ typedef struct fichier typedef struct rpl_mutex { pthread_mutex_t mutex; + pthread_t tid; } struct_mutex; #endif @@ -1197,8 +1184,11 @@ typedef struct descripteur_fichier pid_t pid; pthread_t tid; - file *descripteur_c; - sqlite3 *descripteur_sqlite; + union + { + file *descripteur_c; + sqlite3 *descripteur_sqlite; + }; } struct_descripteur_fichier; #endif @@ -1293,6 +1283,41 @@ typedef struct liste_chainee /* -------------------------------------------------------------------------------- + Structure de gestion des signaux en provenance de rplsignal +-------------------------------------------------------------------------------- +*/ + +#define d_NOMBRE_SIGNAUX 64 + +typedef struct gestion_signaux +{ + unsigned char masque_signaux[d_NOMBRE_SIGNAUX]; + + /* + * 'I' : signal ignoré + * 'Q' : signal mis en queue pour un traitement ultérieur + * 'N' : traitement normal du signal + */ + + integer8 queue_signaux[d_NOMBRE_SIGNAUX]; + integer8 nombre_signaux_en_queue; + struct_objet *corps_signaux[d_NOMBRE_SIGNAUX]; + + pthread_mutex_t mutex; +} struct_gestion_signaux; + +#ifndef MAIN_RPL +# define __STATIC_GESTION_SIGNAUX__ +#else +# define __STATIC_GESTION_SIGNAUX__ = { .mutex = PTHREAD_MUTEX_INITIALIZER } +#endif + +__EXTERN__ volatile struct_gestion_signaux signaux_externes + __STATIC_GESTION_SIGNAUX__; + + +/* +-------------------------------------------------------------------------------- Structure liste profilage -------------------------------------------------------------------------------- */ @@ -2165,6 +2190,7 @@ typedef struct processus pid_t pid_processus_pere; pthread_t tid_processus_pere; + pthread_t tid; logical1 processus_detache; @@ -2181,17 +2207,17 @@ typedef struct processus pthread_mutex_t mutex_allocation; // Mutex autorisant les fork() - sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_fork; + sem_t __PTR__ semaphore_fork; /* Mutexes */ struct_liste_chainee *liste_mutexes; pthread_mutex_t protection_liste_mutexes; +/* Drapeau nécessaire à RESTART */ + + volatile logical1 requete_redemarrage; + /* Gestion optimisée de la mémoire */ double estimation_taille_pile_tampon; @@ -2579,6 +2605,7 @@ void instruction_pmax(struct_processus * void instruction_pmin(struct_processus *s_etat_processus); void instruction_poke(struct_processus *s_etat_processus); void instruction_polar(struct_processus *s_etat_processus); +void instruction_poll(struct_processus *s_etat_processus); void instruction_pos(struct_processus *s_etat_processus); void instruction_pourcent(struct_processus *s_etat_processus); void instruction_pourcent_ch(struct_processus *s_etat_processus); @@ -2635,9 +2662,11 @@ void instruction_read(struct_processus * void instruction_recode(struct_processus *s_etat_processus); void instruction_recv(struct_processus *s_etat_processus); void instruction_redraw(struct_processus *s_etat_processus); +void instruction_regex(struct_processus *s_etat_processus); void instruction_relax(struct_processus *s_etat_processus); void instruction_remove(struct_processus *s_etat_processus); void instruction_res(struct_processus *s_etat_processus); +void instruction_restart(struct_processus *s_etat_processus); void instruction_recall(struct_processus *s_etat_processus); void instruction_regv(struct_processus *s_etat_processus); void instruction_repeat(struct_processus *s_etat_processus); @@ -2830,6 +2859,8 @@ void appel_gnuplot(struct_processus *s_e void cf(struct_processus *s_etat_processus, unsigned char indice_drapeau); void cond(struct_processus *s_etat_processus, struct_matrice *s_matrice, real8 *condition); +void conversion_chaine(struct_processus *s_etat_processus, + unsigned char *chaine, unsigned char type); void conversion_decimal_vers_hms(real8 *angle); void conversion_degres_vers_radians(real8 *angle); void conversion_element_tex(unsigned char **element, unsigned char *fonction); @@ -2905,6 +2936,7 @@ void interruption2(int signal); void interruption3(int signal); void interruption4(int signal); void interruption5(int signal); +void interruption6(int signal); void interruption_depassement_pile(int urgence, stackoverflow_context_t scp); void inversion_matrice(struct_processus *s_etat_processus, struct_matrice *s_matrice); @@ -3006,7 +3038,8 @@ complex16 sommation_vecteur_complexe(com */ #ifndef RPLARGS -int rplinit(int argc, char *argv[], unsigned char ***resultats, char *rpl_home); +int rplinit(int argc, char *argv[], char *envp[], + unsigned char ***resultats, char *rpl_home); #endif /* @@ -3070,6 +3103,7 @@ unsigned char *compactage(unsigned char unsigned char *conversion_majuscule(unsigned char *chaine); unsigned char *creation_nom_fichier(struct_processus *s_etat_processus, unsigned char *chemin); +unsigned char *date_compilation(); unsigned char *extraction_chaine(unsigned char *chaine, unsigned long i, unsigned long j); unsigned char *formateur(struct_processus *s_etat_processus, long offset, @@ -3083,6 +3117,9 @@ unsigned char *formateur_flux(struct_pro unsigned char *formateur_fichier_nombre(struct_processus *s_etat_processus, void *valeur_numerique, unsigned char type, long longueur, long longueur_champ, unsigned char format); +unsigned char *formateur_fichier_binaire_nombre(struct_processus + *s_etat_processus, void *valeur_numerique, unsigned char type, + long longueur, long *longueur_conversion); unsigned char *formateur_fichier_reel(struct_processus *s_etat_processus, void *valeur_numerique, unsigned char type, long longueur, long longueur_champ, unsigned char format); @@ -3091,6 +3128,8 @@ unsigned char *formateur_nombre(struct_p unsigned char *formateur_reel(struct_processus *s_etat_processus, void *valeur_numerique, unsigned char type); unsigned char *messages(struct_processus *s_etat_processus); +unsigned char *pointeur_ieme_caractere(struct_processus *s_etat_processus, + unsigned char *chaine, integer8 position); unsigned char *purification_chaine(unsigned char *chaine); unsigned char *reencodage(struct_processus *s_etat_processus, unsigned char *chaine_entree, unsigned char *codage_entree, @@ -3113,6 +3152,8 @@ logical1 caracteristiques_fichier(struct unsigned long *unite); logical1 controle(struct_processus *s_etat_processus, unsigned char *fichier, unsigned char *type, unsigned char *somme_candidate); +logical1 controle_integrite(struct_processus *s_etat_processus, + unsigned char *executable_candidat, unsigned char *executable); logical1 creation_variable(struct_processus *s_etat_processus, struct_variable *s_variable, unsigned char autorisation_creation_variable_statique, @@ -3176,6 +3217,7 @@ logical1 test_cfsf(struct_processus *s_e unsigned char indice_drapeau); logical1 test_expression_rpn(unsigned char *chaine); logical1 test_fonction(unsigned char *chaine); +logical1 validation_chaine(unsigned char *chaine); #endif /* @@ -3205,6 +3247,8 @@ int liste_variables(struct_processus *s_ struct_arbre_variables *l_element_courant); int nombre_variables(struct_processus *s_etat_processus, struct_arbre_variables *l_element_courant); +int readline_analyse_syntaxique(int count, int key); +int readline_effacement(int count, int key); #endif int tex_fprintf(struct_processus *s_etat_processus, file *flux, const char *format, ...); @@ -3222,7 +3266,6 @@ int wrapper_instruction_intrinseque(void #ifndef RPLARGS unsigned char longueur_entiers_binaires(struct_processus *s_etat_processus); -unsigned char recherche_longueur_optimale(integer8 parametre); #endif /* @@ -3243,6 +3286,10 @@ logical8 masque_entiers_binaires(struct_ #ifndef RPLARGS integer8 occupation_memoire(struct_objet *s_objet); +integer8 longueur_chaine(struct_processus *s_etat_processus, + unsigned char *chaine); +integer8 position_caractere_de_chaine(struct_processus *s_etat_processus, + unsigned char *chaine, unsigned char *position); #endif /*