--- rpl/src/rpl.h 2010/02/10 08:09:29 1.7 +++ rpl/src/rpl.h 2010/06/24 09:21:43 1.44 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.10 + RPL/2 (R) version 4.0.16 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -22,7 +22,15 @@ #ifndef INCLUSION_RPL #define INCLUSION_RPL + #define _GNU_SOURCE +#define _POSIX_C_SOURCE 200112L +#define _REENTRANT + +#ifdef Darwin +# define _DARWIN_C_SOURCE +#endif + /* ================================================================================ @@ -37,8 +45,10 @@ #include #include #include +#include #ifndef RPLARGS +# include # include # include # include @@ -70,6 +80,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" @@ -86,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) @@ -100,9 +118,7 @@ # define postgresqlclose(arg) #endif -#ifdef LIBRPL -# include "librplprototypes.h" -#endif +#include "librplprototypes.h" /* ================================================================================ @@ -111,10 +127,21 @@ */ #ifndef RPLARGS +# ifdef Darwin +# define SIGPOLL SIGINFO +# endif + +// 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 +// Nombre d'interruptions disponibles # define d_NOMBRE_INTERRUPTIONS 64 #endif @@ -175,27 +202,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 sem_t +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_gestionnaires_signaux; - extern pthread_key_t semaphore_fork_processus_courant; + 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 +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_liste_threads; + + 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 @@ -270,12 +372,18 @@ 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 \ + { \ + ufprintf(stderr, "[%d-%llu] %s() from %s at line %d: %s\n", \ + getpid(), (unsigned long long) pthread_self(), \ + __FUNCTION__, __FILE__, __LINE__, m); \ + fflush(stderr); \ + } while(0) +#ifdef __GLIBC__ +#include +#define __BACKTRACE #define BACKTRACE(n) \ do \ { \ @@ -291,7 +399,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 \ @@ -300,15 +408,24 @@ typedef unsigned char t_8_bits; fflush(stdout); \ pthread_mutex_unlock(&mutex); \ } while(0) +#else +#define BACKTRACE(n) NOTICE("BACKTRACE only defined in glibc") +#endif -#define NOTICE(m) \ - do \ - { \ - ufprintf(stderr, "[%d-%llu] %s() from %s at line %d: %s\n", \ - getpid(), pthread_self(), __FUNCTION__, __FILE__, __LINE__, \ - m); \ - fflush(stderr); \ - } while(0) +#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 /* @@ -317,10 +434,30 @@ 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_initialisation(); +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(); + +pid_t debug_fork(); + +#define malloc(s) debug_memoire_ajout(s, __FUNCTION__, __LINE__, #s) +#define free(s) debug_memoire_retrait(s) +#define realloc(s, t) debug_memoire_modification(s, t, \ + __FUNCTION__, __LINE__, #t) +#define fork() debug_fork() +#endif + #ifdef DEBUG_RETURN #define return uprintf("[%d] Return from <%s()> at line #%d " \ "(%s [%d])\n", (int) getpid(), __FUNCTION__, \ - __LINE__, strerror(errno), errno); fflush(stdout); errno=0; return + __LINE__, strerror(errno), errno); fflush(stdout); errno = 0; return #endif #ifdef DEBUG_MUTEX @@ -354,21 +491,6 @@ typedef unsigned char t_8_bits; if (value == 0) BUG(1, uprintf("Value %d\n", value)); sem_destroy(a); }) #endif -#ifdef DEBUG_MALLOC -#define malloc(taille) ({ size_t s = taille; void *p; \ - p = malloc(taille); if (p != NULL) memset(p, 0, s); \ - /*uprintf("[%d-%llu] Allocating %p (%d bytes) at %s() line #%d\n", \ - (int) getpid(), (unsigned long long) pthread_self(), p, \ - (int) s, __FUNCTION__, __LINE__); fflush(stdout); */ p; }) -#endif - -#ifdef DEBUG_FREE -#define free(ptr) ({ void *p = ptr; \ - /*uprintf("[%d-%llu] Freeing %p (%d bytes) at %s() line #%d\n", \ - (int) getpid(), (unsigned long long) pthread_self(), p, \ - (int) sizeof(p), __FUNCTION__, __LINE__); fflush(stdout); */ \ - if (p != NULL) memset(p, 0, sizeof(p)); free(p); }) -#endif /* ================================================================================ @@ -388,10 +510,11 @@ typedef unsigned char t_8_bits; #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" @@ -442,24 +565,36 @@ typedef unsigned char t_8_bits; -------------------------------------------------------------------------------- */ -#define __erreur { uprintf("%s() / %d\n", __FUNCTION__, __LINE__); } while(0) +#ifdef DEBUG_ERREURS +# ifdef MESSAGES +# define __erreur(i) i +# else +# define __erreur(i) ({ if (strstr(__FUNCTION__, "recherche_variable") \ + == NULL) fprintf(stderr, "ERROR %d AT %s() LINE %d\n", \ + i, __FUNCTION__, __LINE__); i; }) +# endif +#else +# define __erreur(i) i +#endif + // -1 : erreur provoquée par une bibliothèque externe #ifndef RPLARGS # define d_es 2000 -# define d_es_allocation_memoire 2001 -# define d_es_variable_introuvable 2002 -# define d_es_pile_vide 2003 -# define d_es_end_incoherent 2004 -# define d_es_peripherique_stdin 2005 -# define d_es_erreur_fichier 2006 -# define d_es_execution_bibliotheque 2007 -# define d_es_signal 2008 -# define d_es_processus 2009 -# define d_es_pile_operationnelle_vide 2010 -# define d_es_nombre_max_descripteurs 2011 -# define d_es_interruption_invalide 2012 -# define d_es_contexte 2013 +# define d_es_allocation_memoire __erreur(2001) +# define d_es_variable_introuvable __erreur(2002) +# define d_es_pile_vide __erreur(2003) +# define d_es_end_incoherent __erreur(2004) +# define d_es_peripherique_stdin __erreur(2005) +# define d_es_erreur_fichier __erreur(2006) +# define d_es_execution_bibliotheque __erreur(2007) +# define d_es_signal __erreur(2008) +# define d_es_processus __erreur(2009) +# define d_es_pile_operationnelle_vide __erreur(2010) +# define d_es_nombre_max_descripteurs __erreur(2011) +# define d_es_interruption_invalide __erreur(2012) +# define d_es_contexte __erreur(2013) +# define d_es_somme_controle __erreur(2014) #endif /* @@ -470,17 +605,17 @@ typedef unsigned char t_8_bits; #ifndef RPLARGS # define d_ep 1000 -# define d_ep_division_par_zero 1001 -# define d_ep_matrice_non_inversible 1002 -# define d_ep_resultat_indefini 1003 -# define d_ep_underflow 1004 -# define d_ep_overflow 1005 -# define d_ep_domaine_definition 1006 -# define d_ep_perte_precision 1007 -# define d_ep_decomposition_QR 1008 -# define d_ep_matrice_non_definie_positive 1009 -# define d_ep_decomposition_QZ 1010 -# define d_ep_decomposition_SVD 1011 +# define d_ep_division_par_zero __erreur(1001) +# define d_ep_matrice_non_inversible __erreur(1002) +# define d_ep_resultat_indefini __erreur(1003) +# define d_ep_underflow __erreur(1004) +# define d_ep_overflow __erreur(1005) +# define d_ep_domaine_definition __erreur(1006) +# define d_ep_perte_precision __erreur(1007) +# define d_ep_decomposition_QR __erreur(1008) +# define d_ep_matrice_non_definie_positive __erreur(1009) +# define d_ep_decomposition_QZ __erreur(1010) +# define d_ep_decomposition_SVD __erreur(1011) #endif /* @@ -491,18 +626,18 @@ typedef unsigned char t_8_bits; #ifndef RPLARGS # define d_ec 3000 -# define d_ec_niveau_definition_negatif 3001 -# define d_ec_nom_definition_invalide 3002 -# define d_ec_erreur_boucle_definie 3003 -# define d_ec_erreur_instruction_end 3004 -# define d_ec_erreur_instruction_until 3005 -# define d_ec_source_incoherent 3006 -# define d_ec_erreur_instruction_while 3007 -# define d_ec_erreur_instruction_then 3008 -# define d_ec_erreur_instruction_else 3009 -# define d_ec_erreur_instruction_elseif 3010 -# define d_ec_erreur_instruction_select 3011 -# define d_ec_erreur_instruction_case 3012 +# define d_ec_niveau_definition_negatif __erreur(3001) +# define d_ec_nom_definition_invalide __erreur(3002) +# define d_ec_erreur_boucle_definie __erreur(3003) +# define d_ec_erreur_instruction_end __erreur(3004) +# define d_ec_erreur_instruction_until __erreur(3005) +# define d_ec_source_incoherent __erreur(3006) +# define d_ec_erreur_instruction_while __erreur(3007) +# define d_ec_erreur_instruction_then __erreur(3008) +# define d_ec_erreur_instruction_else __erreur(3009) +# define d_ec_erreur_instruction_elseif __erreur(3010) +# define d_ec_erreur_instruction_select __erreur(3011) +# define d_ec_erreur_instruction_case __erreur(3012) #endif /* @@ -514,98 +649,91 @@ typedef unsigned char t_8_bits; // -1 : erreur provoquée par une bibliothèque externe #ifndef RPLARGS # define d_ex 0 -# define d_ex_pile_vide 1 -# define d_ex_manque_argument 2 -# define d_ex_argument_invalide 3 -# define d_ex_erreur_type_argument 4 -# define d_ex_nom_reserve 5 -# define d_ex_nombre_arguments 6 -# define d_ex_dimensions_invalides 7 -# define d_ex_expression_invalide 8 -# define d_ex_absence_graphique_courant 9 -# define d_ex_erreur_traitement_condition 10 -# define d_ex_erreur_traitement_boucle 11 -# define d_ex_variable_non_definie 12 -# define d_ex_drapeau_inexistant 13 -# define d_ex_nom_invalide 14 -# define d_ex_element_inexistant 15 -# define d_ex_absence_variable 16 -# define d_ex_erreur_evaluation 17 -# define d_ex_semaphore 18 -# define d_ex_longueur_fft 19 -# define d_ex_queue_impression 20 -# define d_ex_type_trace_invalide 21 -# define d_ex_erreur_fichier 22 -# define d_ex_absence_equation 23 -# define d_ex_erreur_bibliotheque 24 -# define d_ex_execution_bibliotheque 25 -# define d_ex_stop 26 -# define d_ex_matrice_statistique_invalide 27 -# define d_ex_dimensions_matrice_statistique 28 -# define d_ex_absence_observations 29 -# define d_ex_statistiques_echantillon 30 -# define d_ex_observations_inexistantes 31 -# define d_ex_syntaxe 32 -# define d_ex_cycle_hors_boucle 33 -# define d_ex_conversion_unite 34 -# define d_ex_erreur_parametre_fichier 35 -# define d_ex_erreur_acces_fichier 36 -# define d_ex_erreur_requete_fichier 37 -# define d_ex_erreur_format_fichier 38 -# define d_ex_fichier_verrouille 39 -# define d_ex_verrou_indefini 40 -# define d_ex_fin_de_fichier_atteinte 41 -# define d_ex_debut_de_fichier_atteint 42 -# define d_ex_erreur_type_fichier 43 -# define d_ex_fichier_vide 44 -# define d_ex_dimensions_differentes 45 -# define d_ex_routines_mathematiques 46 -# define d_ex_exit_hors_boucle 47 -# define d_ex_longueur_dft 48 -# define d_ex_contexte 49 -# define d_ex_processus 50 -# define d_ex_image_processus 51 -# define d_ex_erreur_sql 52 -# define d_ex_variable_verrouillee 53 -# define d_ex_variable_volatile 54 -# define d_ex_erreur_processus 55 -# define d_ex_erreur_impression 56 -# define d_ex_nombre_arguments_fonction 57 -# define d_ex_fonction_indisponible 58 -# define d_ex_bibliotheque_chargee 59 -# define d_ex_aucun_symbole 60 -# define d_ex_definition_ambigue 61 -# define d_ex_fichier_hors_contexte 62 -# define d_ex_socket_en_ecoute 63 -# define d_ex_interruption_invalide 64 -# define d_ex_erreur_transcodage 65 -# define d_ex_absence_processus_pere 66 -# define d_ex_creation_variable 67 -# define d_ex_fusible 68 -# define d_ex_iswi_hors_interruption 69 -# define d_ex_daemon 70 -# define d_ex_mutex 71 -# define d_ex_variable_statique_partagee 72 -# define d_ex_variable_partagee 73 -# define d_ex_graphique_memorise 74 -# define d_ex_matrice_non_diagonale 75 -# define d_ex_locales 76 -# define d_ex_representation 77 -# define d_ex_erreur_profilage 78 -#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 +# define d_ex_pile_vide __erreur(1) +# define d_ex_manque_argument __erreur(2) +# define d_ex_argument_invalide __erreur(3) +# define d_ex_erreur_type_argument __erreur(4) +# define d_ex_nom_reserve __erreur(5) +# define d_ex_nombre_arguments __erreur(6) +# define d_ex_dimensions_invalides __erreur(7) +# define d_ex_expression_invalide __erreur(8) +# define d_ex_absence_graphique_courant __erreur(9) +# define d_ex_erreur_traitement_condition __erreur(10) +# define d_ex_erreur_traitement_boucle __erreur(11) +# define d_ex_variable_non_definie __erreur(12) +# define d_ex_drapeau_inexistant __erreur(13) +# define d_ex_nom_invalide __erreur(14) +# define d_ex_element_inexistant __erreur(15) +# define d_ex_absence_variable __erreur(16) +# define d_ex_erreur_evaluation __erreur(17) +# define d_ex_semaphore __erreur(18) +# define d_ex_longueur_fft __erreur(19) +# define d_ex_queue_impression __erreur(20) +# define d_ex_type_trace_invalide __erreur(21) +# define d_ex_erreur_fichier __erreur(22) +# define d_ex_absence_equation __erreur(23) +# define d_ex_erreur_bibliotheque __erreur(24) +# define d_ex_execution_bibliotheque __erreur(25) +# define d_ex_stop __erreur(26) +# define d_ex_matrice_statistique_invalide __erreur(27) +# define d_ex_dimensions_matrice_statistique __erreur(28) +# define d_ex_absence_observations __erreur(29) +# define d_ex_statistiques_echantillon __erreur(30) +# define d_ex_observations_inexistantes __erreur(31) +# define d_ex_syntaxe __erreur(32) +# define d_ex_cycle_hors_boucle __erreur(33) +# define d_ex_conversion_unite __erreur(34) +# define d_ex_erreur_parametre_fichier __erreur(35) +# define d_ex_erreur_acces_fichier __erreur(36) +# define d_ex_erreur_requete_fichier __erreur(37) +# define d_ex_erreur_format_fichier __erreur(38) +# define d_ex_fichier_verrouille __erreur(39) +# define d_ex_verrou_indefini __erreur(40) +# define d_ex_fin_de_fichier_atteinte __erreur(41) +# define d_ex_debut_de_fichier_atteint __erreur(42) +# define d_ex_erreur_type_fichier __erreur(43) +# define d_ex_fichier_vide __erreur(44) +# define d_ex_dimensions_differentes __erreur(45) +# define d_ex_routines_mathematiques __erreur(46) +# define d_ex_exit_hors_boucle __erreur(47) +# define d_ex_longueur_dft __erreur(48) +# define d_ex_contexte __erreur(49) +# define d_ex_processus __erreur(50) +# define d_ex_image_processus __erreur(51) +# define d_ex_erreur_sql __erreur(52) +# define d_ex_variable_verrouillee __erreur(53) +# define d_ex_variable_volatile __erreur(54) +# define d_ex_erreur_processus __erreur(55) +# define d_ex_erreur_impression __erreur(56) +# define d_ex_nombre_arguments_fonction __erreur(57) +# define d_ex_fonction_indisponible __erreur(58) +# define d_ex_bibliotheque_chargee __erreur(59) +# define d_ex_aucun_symbole __erreur(60) +# define d_ex_definition_ambigue __erreur(61) +# define d_ex_fichier_hors_contexte __erreur(62) +# define d_ex_socket_en_ecoute __erreur(63) +# define d_ex_interruption_invalide __erreur(64) +# define d_ex_erreur_transcodage __erreur(65) +# define d_ex_absence_processus_pere __erreur(66) +# define d_ex_creation_variable __erreur(67) +# define d_ex_fusible __erreur(68) +# define d_ex_iswi_hors_interruption __erreur(69) +# define d_ex_daemon __erreur(70) +# define d_ex_mutex __erreur(71) +# define d_ex_variable_statique_partagee __erreur(72) +# define d_ex_variable_partagee __erreur(73) +# define d_ex_graphique_memorise __erreur(74) +# define d_ex_matrice_non_diagonale __erreur(75) +# define d_ex_locales __erreur(76) +# define d_ex_representation __erreur(77) +# define d_ex_erreur_profilage __erreur(78) +# define d_ex_enregistrement_inexistant __erreur(79) +# define d_ex_clef_inexistante __erreur(80) +# define d_ex_nom_implicite __erreur(81) +# define d_ex_version_bibliotheque __erreur(82) #endif + /* ================================================================================ STRUCTURES @@ -820,12 +948,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 @@ -996,12 +1126,13 @@ 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; pthread_mutex_t mutex; + volatile logical1 thread_actif; int pipe_erreurs[2]; @@ -1334,6 +1465,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*/ @@ -1396,7 +1528,12 @@ typedef struct processus pthread_t thread_fusible; pthread_t thread_surveille_par_fusible; +# ifndef Cygwin stack_t pile_signal; +# else +# define SA_ONSTACK 0 +# define RTLD_LOCAL 0 +# endif /* Contextes */ @@ -1655,6 +1792,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; @@ -1668,10 +1807,14 @@ 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 */ + char *rpl_home; + gsl_rng *generateur_aleatoire; const gsl_rng_type *type_generateur_aleatoire; @@ -1710,9 +1853,14 @@ typedef struct processus // Mutex spécifique au processus et donnant accès à la pile des processus pthread_mutex_t mutex; + pthread_mutex_t mutex_allocation; // Sémaphore autorisant les fork() - sem_t semaphore_fork; + sem_t +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_fork; /* Mutexes */ @@ -1732,7 +1880,11 @@ typedef struct processus unsigned long taille_pile_objets; struct_objet *pile_objets; -# define TAILLE_CACHE 1024 +# ifndef DEBUG_MALLOC +# define TAILLE_CACHE 16384 +# else +# define TAILLE_CACHE 4 +# endif unsigned long *objets_adr[TAILLE_CACHE]; int pointeur_adr; @@ -1771,7 +1923,7 @@ typedef struct processus /* -------------------------------------------------------------------------------- - Structures instruction intrinseque + Structures instruction intrinsèque -------------------------------------------------------------------------------- */ @@ -1836,6 +1988,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); @@ -1855,6 +2008,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); @@ -2005,6 +2159,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); @@ -2053,6 +2208,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); @@ -2107,6 +2264,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); @@ -2340,7 +2498,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); @@ -2353,6 +2511,8 @@ 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); @@ -2365,6 +2525,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, @@ -2418,6 +2579,7 @@ void interruption7(int signal, siginfo_t void interruption8(int signal, siginfo_t *siginfo, void *context); void interruption9(int signal, siginfo_t *siginfo, void *context); void interruption10(int signal, siginfo_t *siginfo, void *context); +void interruption11(int signal, siginfo_t *siginfo, void *context); void inversion_matrice(struct_processus *s_etat_processus, struct_matrice *s_matrice); void lancement_daemon(struct_processus *s_etat_processus); @@ -2448,10 +2610,11 @@ 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); +void trace(struct_processus *s_etat_processus, FILE *flux); void traitement_asynchrone_exceptions_gsl(struct_processus *s_etat_processus); void traitement_exceptions_gsl(const char *reason, const char *file, int line, int gsl_errno); @@ -2493,7 +2656,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 /* @@ -2596,6 +2759,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, @@ -2615,6 +2780,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); @@ -2662,9 +2831,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 @@ -2675,6 +2844,8 @@ inline ssize_t write_atomic(struct_proce */ int alsprintf(unsigned char **strp, const char *fmt, ...); +int tex_fprintf(struct_processus *s_etat_processus, + file *flux, const char *format, ...); int transliterated_fprintf(struct_processus *s_etat_processus, file *flux, const char *format, ...); int valsprintf(unsigned char **strp, const char *fmt, va_list ap); @@ -2735,14 +2906,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 /* @@ -3052,7 +3223,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