--- rpl/src/rpl.h 2011/11/19 17:53:46 1.142 +++ rpl/src/rpl.h 2012/09/29 17:53:02 1.176 @@ -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.10 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -71,6 +71,7 @@ #include #include #include +#include #ifndef RPLARGS # include @@ -91,6 +92,7 @@ # include # include # include +# include # ifdef OS2 # undef pthread_mutexattr_settype @@ -143,9 +145,10 @@ int sem_close_SysV(sem_t *sem); int sem_wait_SysV(sem_t *sem); int sem_trywait_SysV(sem_t *sem); + int sem_timedwait_SysV(sem_t *sem, struct timespec *ts); int sem_post_SysV(sem_t *sem); int sem_getvalue_SysV(sem_t *sem, int *value); - int sem_unlink_SysV(const char *nom); + int sem_unlink_SysV(char *nom); int sem_destroy_SysV(sem_t *sem); # endif @@ -185,7 +188,7 @@ # include #endif -// Définition spécifique à Hurd +// Définition spécifique à Hurd #ifndef PIPE_BUF # define fpathconf (".", _PC_PIPE_BUF) #endif @@ -213,28 +216,53 @@ # 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 + 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, rpl_sigint, rpl_sigterm, - rpl_sigstart, // Signal envoyé par un père pour lancer son fils. - rpl_sigcont, // Signal de redémarrage d'un processus arrêté par + rpl_sigstart, // Signal envoyé par un père pour lancer son fils. + rpl_sigcont, // Signal de redémarrage d'un processus arrêté par // SUSPEND - rpl_sigstop, // Signal d'arrêt envoyé par l'instruction STOP ou + rpl_sigstop, // Signal d'arrêt envoyé par l'instruction STOP ou // FUSE. (FSTOP) - rpl_sigabort, // Signal envoyé par l'instruction ABORT (à regrouper + rpl_sigabort, // Signal envoyé par l'instruction ABORT (à regrouper // avec FABORT) - rpl_sigurg, // Signal d'arrêt urgent - rpl_siginject, // Signal indiquant la présence d'une donnée à lire - // envoyée depuis le père - rpl_sigalrm, // Signal d'alarme (erreur système) depuis un fils + rpl_sigurg, // Signal d'arrêt urgent + rpl_siginject, // Signal indiquant la présence d'une donnée à lire + // envoyée depuis le père + rpl_sigalrm, // Signal d'alarme (erreur système) depuis un fils rpl_sighup, rpl_sigtstp, rpl_sigexcept, @@ -243,9 +271,9 @@ enum signaux_rpl #define LONGUEUR_QUEUE_SIGNAUX 1024 -// Une structure s_queue_signaux est créée par processus (et non par thread). -// Elle est projetée dans un segment de mémoire partagée pour qu'elle soit -// accessible à la fois du père et des fils. +// Une structure s_queue_signaux est créée par processus (et non par thread). +// Elle est projetée dans un segment de mémoire partagée pour qu'elle soit +// accessible à la fois du père et des fils. #ifndef RPLARGS typedef struct queue_signaux @@ -253,13 +281,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 { @@ -268,18 +300,12 @@ 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 +__EXTERN__ struct_queue_signaux *s_queue_signaux; +__EXTERN__ int f_queue_signaux; + +# ifdef SEMAPHORES_NOMMES + __EXTERN__ sem_t *semaphore_queue_signaux; + __EXTERN__ sem_t *semaphore_signalisation; # endif #endif @@ -308,7 +334,7 @@ union semun /* ================================================================================ - SÉMAPHORES + SÉMAPHORES ================================================================================ */ @@ -317,6 +343,7 @@ union semun # define sem_destroy(a) sem_destroy_SysV(a) # define sem_wait(a) sem_wait_SysV(a) # define sem_trywait(a) sem_trywait_SysV(a) +# define sem_timedwait(a, b) sem_timedwait_SysV(a, b) # define sem_post(a) sem_post_SysV(a) # define sem_getvalue(a, b) sem_getvalue_SysV(a, b) # define sem_open(...) sem_open_SysV(__VA_ARGS__) @@ -333,15 +360,16 @@ union semun #ifndef RPLARGS -// Signaux utilisés par défaut : +// Signaux utilisés par défaut : // SIGINT // SIGTSTP // SIGCONT -// SIGURG // SIGPIPE +// SIGUSR1 et SIGUSR2 sont utilisé par libsigsegv. +// SIGHUP // SIGALRM -# define SIGTEST SIGUSR1 +# define SIGTEST 255 // Nombre d'interruptions disponibles # define d_NOMBRE_INTERRUPTIONS 64 @@ -349,7 +377,7 @@ union semun /* ================================================================================ - Granularité temporelle + Granularité temporelle ================================================================================ */ @@ -384,21 +412,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 ================================================================================ */ @@ -408,66 +421,42 @@ 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 +# define __PTR__ * +# else +# define __PTR__ +# endif -# ifdef SEMAPHORES_NOMMES - extern pthread_mutex_t mutex_sem; -# endif + __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 pthread_mutex_t mutex_liste_threads; - extern pthread_mutex_t mutex_gestionnaires_signaux_atomique; + __EXTERN__ volatile int signal_test; - extern sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_gestionnaires_signaux; + __EXTERN__ pid_t pid_processus_pere; - 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; +# ifdef SEMAPHORES_NOMMES + __EXTERN__ pthread_mutex_t mutex_sem __STATIC_MUTEX_INITIALIZATION__; +# endif - int signal_test; + __EXTERN__ pthread_mutex_t mutex_liste_threads + __STATIC_MUTEX_INITIALIZATION__; + __EXTERN__ pthread_mutex_t mutex_gestionnaires_signaux_atomique + __STATIC_MUTEX_INITIALIZATION__; + __EXTERN__ pthread_mutex_t mutex_sections_critiques; - pid_t pid_processus_pere; + __EXTERN__ sem_t __PTR__ semaphore_gestionnaires_signaux; -# ifdef SEMAPHORES_NOMMES - pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; -# endif - - 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; - - 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); @@ -475,8 +464,8 @@ int sem_destroy3(sem_t *semaphore_p, pid int sem_getvalue2(sem_t *semaphore, int *valeur); sem_t *sem_open2(pid_t pid, int ordre); -// Le mutex est là uniquement pour pouvoir émuler le comportement -// de sem_getvalue() sur un système comme MacOS X qui ne possède pas +// Le mutex est là uniquement pour pouvoir émuler le comportement +// de sem_getvalue() sur un système comme MacOS X qui ne possède pas // cette fonction. #define sem_getvalue(semaphore, value) sem_getvalue2(semaphore, value) @@ -497,7 +486,7 @@ sem_t *sem_open2(pid_t pid, int ordre); ================================================================================ */ -// Par défaut, tout est redirigé vers stderr sauf indication explicite de +// Par défaut, tout est redirigé vers stderr sauf indication explicite de // stdout. #define printf(...) transliterated_fprintf(s_etat_processus, \ @@ -519,9 +508,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; }) @@ -532,8 +518,8 @@ sem_t *sem_open2(pid_t pid, int ordre); # define fflush(flux) fflush((flux == stdout) ? stderr : flux) #endif -// Ajout d'un timeout sur les fonctions pipe() pour éviter une erreur -// système dans le cas où l'on a atteint le nombre maximale de fichiers +// Ajout d'un timeout sur les fonctions pipe() pour éviter une erreur +// système dans le cas où l'on a atteint le nombre maximale de fichiers // ouverts. #define pipe(descripteurs) \ @@ -552,14 +538,14 @@ sem_t *sem_open2(pid_t pid, int ordre); erreur; \ }) -// Redéfinition de abs pour un fonctionnement en entier de type long long int +// Redéfinition de abs pour un fonctionnement en entier de type long long int #ifdef __GNUC__ # define abs(i) ({ typeof(i) _i; _i = (i); (_i >= 0) ? _i : -_i; }) -// typeof() est une extension de gcc, mais est présent sur d'autres compilateurs -// comme Sun Studio. Dans le cas où typeof() n'existe pas, il est possible -// d'utiliser la macro suivante, mais elle possède un effet de bord dû à -// l'évaluation multiple de l'argument. +// typeof() est une extension de gcc, mais est présent sur d'autres compilateurs +// comme Sun Studio. Dans le cas où typeof() n'existe pas, il est possible +// d'utiliser la macro suivante, mais elle possède un effet de bord dû à +// l'évaluation multiple de l'argument. #else # define abs(i) (((i) >= 0) ? (i) : (-i)) #endif @@ -734,7 +720,7 @@ pid_t debug_fork(); /* -------------------------------------------------------------------------------- - Paramètres du système + Paramètres du système -------------------------------------------------------------------------------- */ @@ -753,7 +739,7 @@ pid_t debug_fork(); /* -------------------------------------------------------------------------------- - Erreurs système + Erreurs système -------------------------------------------------------------------------------- */ @@ -779,7 +765,7 @@ pid_t debug_fork(); #endif -// -1 : erreur provoquée par une bibliothèque externe +// -1 : erreur provoquée par une bibliothèque externe #ifndef RPLARGS # define d_es 2000 # define d_es_allocation_memoire __erreur(2001) @@ -797,6 +783,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 /* @@ -844,11 +831,11 @@ pid_t debug_fork(); /* -------------------------------------------------------------------------------- - Erreurs à l'exécution + Erreurs à l'exécution -------------------------------------------------------------------------------- */ -// -1 : erreur provoquée par une bibliothèque externe +// -1 : erreur provoquée par une bibliothèque externe #ifndef RPLARGS # define d_ex 0 # define d_ex_pile_vide __erreur(1) @@ -936,6 +923,9 @@ pid_t debug_fork(); # 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 @@ -993,13 +983,13 @@ enum t_type { ADR = 0, ALG, BIN, CHN, C SLB, SPH, SQL, TBL, VCX, VIN, VRL }; /* - ADR : adresse sur 32 bits (au moins) non signés (unsigned long) - Adresse d'une définition à interpréter. + ADR : adresse sur 32 bits (au moins) non signés (unsigned long) + Adresse d'une définition à interpréter. - ALG : expression algébrique (struct_liste_chainee *) - La liste chaînée contient la définition convertie en notation - polonaise inversée. Ce type diffère du type 'RPN' au niveau - du format de sortie (notation algébrique). + ALG : expression algébrique (struct_liste_chainee *) + La liste chaînée contient la définition convertie en notation + polonaise inversée. Ce type diffère du type 'RPN' au niveau + du format de sortie (notation algébrique). BIN : entier binaire sur 64 bits (unsigned integer8 *) Sans objet. @@ -1014,8 +1004,8 @@ enum t_type { ADR = 0, ALG, BIN, CHN, C FCH : descripteur de fichier (struct_fichier *). - FCT : déclaration d'une fonction et de son nombre d'arguments - (struct_fonction *). Ce type n'est nécessaire que dans le + FCT : déclaration d'une fonction et de son nombre d'arguments + (struct_fonction *). Ce type n'est nécessaire que dans le traitement des types 'ALG' et 'RPN'. INT : entier sur 64 bits (integer*8, integer8 *) @@ -1023,10 +1013,10 @@ enum t_type { ADR = 0, ALG, BIN, CHN, C Type C/Fortran : integer8 LST : liste (struct_liste_chainee *) - Les objets sont enregistrés sous forme de liste chaînée récursive. - Cela permet de traiter des tableaux de données hétérogènes de - grandes dimensions. Le nombre de dimensions maximal est fixé par - la mémoire de la station. + Les objets sont enregistrés sous forme de liste chaînée récursive. + Cela permet de traiter des tableaux de données hétérogènes de + grandes dimensions. Le nombre de dimensions maximal est fixé par + la mémoire de la station. MCX : matrice de complexes (struct_matrice *) Sans objet. @@ -1050,17 +1040,17 @@ enum t_type { ADR = 0, ALG, BIN, CHN, C Sans objet. RPN : definition (struct_liste_chainee *) - Ce type diffère du type 'ALG' au niveau du format de sortie - (notation polonaise inversée). + Ce type diffère du type 'ALG' au niveau du format de sortie + (notation polonaise inversée). SCK : socket (struct_socket *) - SLB : bibliothèque dynamique partagée (struct_bibliotheque *) + SLB : bibliothèque dynamique partagée (struct_bibliotheque *) Sans objet. - SPH : sémaphore nommé (struct_semaphore *) + SPH : sémaphore nommé (struct_semaphore *) - SQL : connecteur sur une base de données SQL (struct_connecteur_sql *) + SQL : connecteur sur une base de données SQL (struct_connecteur_sql *) TBL : tableau multidimensionnel d'objets (struct_tableau *). @@ -1123,13 +1113,14 @@ typedef struct fichier typedef struct rpl_mutex { pthread_mutex_t mutex; + pthread_t tid; } struct_mutex; #endif /* -------------------------------------------------------------------------------- - Structure sémaphore + Structure sémaphore -------------------------------------------------------------------------------- */ @@ -1161,7 +1152,7 @@ typedef struct marque /* -------------------------------------------------------------------------------- - Structure bibliothèque + Structure bibliothèque -------------------------------------------------------------------------------- */ @@ -1196,8 +1187,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 @@ -1278,7 +1272,7 @@ typedef struct socket /* -------------------------------------------------------------------------------- - Structure liste chaînee + Structure liste chaînee -------------------------------------------------------------------------------- */ @@ -1292,6 +1286,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 -------------------------------------------------------------------------------- */ @@ -1317,7 +1346,7 @@ typedef struct liste_profilage2 /* -------------------------------------------------------------------------------- - Structure contenant les fichiers graphiques (liste chaînée) + Structure contenant les fichiers graphiques (liste chaînée) -------------------------------------------------------------------------------- */ @@ -1349,7 +1378,7 @@ typedef struct nom { unsigned char *nom; logical1 symbole; /* d_vrai/d_faux */ - // symbole == d_vrai signifie que le nom a été introduit dans un + // symbole == d_vrai signifie que le nom a été introduit dans un // calcul sans les apostrophes. } struct_nom; @@ -1431,7 +1460,7 @@ typedef struct liste_pile_systeme clause : I : IF R : IFERR - X : IFERR indiquant la présence d'une erreur. + X : IFERR indiquant la présence d'une erreur. T : THEN E : ELSE Z : traitement en cours de ELSE @@ -1440,8 +1469,8 @@ typedef struct liste_pile_systeme W : WHILE M : WHILE avec une clause fausse. S : SELECT - K : aucun cas CASE n'a encore été traité. - C : au moins un cas de SELECT...CASE a été traité. + K : aucun cas CASE n'a encore été traité. + C : au moins un cas de SELECT...CASE a été traité. Q : traitement en cours d'un cas CASE. F : traitement du cas DEFAULT */ @@ -1452,19 +1481,21 @@ typedef struct liste_pile_systeme unsigned char type_cloture; /* - type clôture : - C SELECT : END termine un test SELECT/DEFAULT/END. - D DO : END termine une boucle DO/UNTIL/END. - I IF : END termine un test IF/THEN (ELSE)/END. - J IFERR : END termine un test IFERR/THEN (ELSE)/END. - K CASE : END termine un test CASE/THEN/END - W WHILE : END termine une boucle WHILE/REPEAT/END. + type clôture : + C SELECT : END termine un test SELECT/DEFAULT/END. + D DO : END termine une boucle DO/UNTIL/END. + I IF : END termine un test IF/THEN (ELSE)/END. + J IFERR : END termine un test IFERR/THEN (ELSE)/END. + K CASE : END termine un test CASE/THEN/END + W WHILE : END termine une boucle WHILE/REPEAT/END. + Q CRITICAL : END termine une section critique CRITICAL/END F FOR : NEXT ou STEP termine une boucle avec compteur. S START : NEXT ou STEP termine une boucle sans compteur. - L LOOP : boucle utilisé dans le traitement de l'instruction RETURN. - Elle correspond à une boucle FOR ou START mais sans son + L LOOP : boucle utilisé dans le traitement de l'instruction RETURN. + Elle correspond à une boucle FOR ou START mais sans son initialisation. + A FORALL : NEXT termine une boucle sur un objet. */ unsigned long adresse_retour; @@ -1506,7 +1537,7 @@ typedef struct variable /* -------------------------------------------------------------------------------- - Structure variable partagée + Structure variable partagée -------------------------------------------------------------------------------- */ @@ -1551,7 +1582,7 @@ typedef struct variable_statique unsigned char *nom; unsigned char origine; - // Position de création de la variable statique dans le programme ou dans + // Position de création de la variable statique dans le programme ou dans // l'expression. 'origine' vaut 'P' pour programme ou 'E' pour expression. unsigned long niveau; @@ -1659,8 +1690,8 @@ typedef struct rpl_arguments /* Traitement des erreurs */ unsigned char *message_erreur; - unsigned char type_erreur; /* S = système - E = exécution */ + unsigned char type_erreur; /* S = système + E = exécution */ integer8 erreur; /* Traitement des messages d'aide */ @@ -1684,7 +1715,7 @@ typedef struct rpl_arguments /* -------------------------------------------------------------------------------- - Structure d'arbre des instructions intrinsèques + Structure d'arbre des instructions intrinsèques -------------------------------------------------------------------------------- */ @@ -1716,7 +1747,7 @@ typedef struct tableau_variables { unsigned char origine; unsigned char *nom; // pointeur sur la struct_variable - // réelle et non copie de la chaîne + // réelle et non copie de la chaîne unsigned long niveau; struct_objet *objet; // pointeur sur l'objet et non copie @@ -1733,7 +1764,7 @@ typedef struct liste_variables { // Utilisation dans la gestion des variables struct_variable *variable; - // Utilisation dans la pile système (variables par niveau) + // Utilisation dans la pile système (variables par niveau) struct_liste_chainee *liste; }; @@ -1846,13 +1877,13 @@ typedef struct processus /* Variables */ - // La liste des variables par niveau est doublement chaînée. - // À tout moment, elle pointe sur le niveau le plus haut existant et + // La liste des variables par niveau est doublement chaînée. + // À tout moment, elle pointe sur le niveau le plus haut existant et // l_liste_variable_par_niveau->precedent renvoie la liste des - // définitions. l_liste_variable_par_niveau->precedent->precedent pointe + // définitions. l_liste_variable_par_niveau->precedent->precedent pointe // sur la liste des variables globales. // - // À l'initialisation : + // À l'initialisation : // l_liste_variables_par_niveau->suivant == l_liste_variables_par_niveau // l_liste_variables_par_niveau->precedent == l_liste_variables_par_niveau @@ -1889,11 +1920,11 @@ typedef struct processus struct_liste_chainee *s_sockets; -/* Connecteurs aux bases de données */ +/* Connecteurs aux bases de données */ struct_liste_chainee *s_connecteurs_sql; -/* Bibliothèques dynamiques */ +/* Bibliothèques dynamiques */ struct_liste_chainee *s_bibliotheques; struct_instruction_externe *s_instructions_externes; @@ -2095,8 +2126,8 @@ typedef struct processus unsigned char masque_interruptions[d_NOMBRE_INTERRUPTIONS]; /* - * 'I' : interruption ignorée - * 'Q' : interruption mise en queue pour un traitement ultérieur + * 'I' : interruption ignorée + * 'Q' : interruption mise en queue pour un traitement ultérieur * 'N' : traitement normal de l'interruption */ @@ -2118,7 +2149,7 @@ typedef struct processus /* Variables volatiles */ volatile sig_atomic_t var_volatile_alarme; - // Traitement de ctrl+C et des arrêts brutaux + // Traitement de ctrl+C et des arrêts brutaux volatile sig_atomic_t var_volatile_requete_arret; // Traitement de ctrl+Z volatile sig_atomic_t var_volatile_requete_arret2; @@ -2145,12 +2176,12 @@ typedef struct processus integer8 nombre_arguments; /* - * Il s'agit du nombre d'arguments utilisé pour l'évaluation - * des expressions algébriques. - * -1 : la fonction ne peut être dans un objet de type ALG. + * Il s'agit du nombre d'arguments utilisé pour l'évaluation + * des expressions algébriques. + * -1 : la fonction ne peut être dans un objet de type ALG. * -2 : nombre d'arguments inconnu - * 0 : la fonction doit apparaître en notation infixe - * >0 : la fonction apparaît comme une fonction normale + * 0 : la fonction doit apparaître en notation infixe + * >0 : la fonction apparaît comme une fonction normale */ logical1 lancement_interactif; @@ -2164,6 +2195,7 @@ typedef struct processus pid_t pid_processus_pere; pthread_t tid_processus_pere; + pthread_t tid; logical1 processus_detache; @@ -2175,23 +2207,24 @@ typedef struct processus struct_liste_profilage2 *pile_profilage_fonctions; struct timeval horodatage_profilage; - // Mutex spécifique au processus et donnant accès à la pile des processus + // Mutex spécifique au processus et donnant accès à la pile des processus pthread_mutex_t mutex; 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; + unsigned int sections_critiques; + +/* Drapeau nécessaire à RESTART */ + + volatile logical1 requete_redemarrage; -/* Gestion optimisée de la mémoire */ +/* Gestion optimisée de la mémoire */ double estimation_taille_pile_tampon; unsigned long taille_pile_tampon; @@ -2281,7 +2314,7 @@ typedef struct fonction /* -------------------------------------------------------------------------------- - Procédures d'exécution des mots-clef du langage RPL/2 + Procédures d'exécution des mots-clef du langage RPL/2 -------------------------------------------------------------------------------- */ @@ -2358,6 +2391,7 @@ void instruction_cosh(struct_processus * void instruction_cov(struct_processus *s_etat_processus); void instruction_cr(struct_processus *s_etat_processus); void instruction_create(struct_processus *s_etat_processus); +void instruction_critical(struct_processus *s_etat_processus); void instruction_crmtx(struct_processus *s_etat_processus); void instruction_cross(struct_processus *s_etat_processus); void instruction_crsmphr(struct_processus *s_etat_processus); @@ -2442,6 +2476,7 @@ void instruction_fleche_str(struct_proce void instruction_fleche_table(struct_processus *s_etat_processus); void instruction_floor(struct_processus *s_etat_processus); void instruction_for(struct_processus *s_etat_processus); +void instruction_forall(struct_processus *s_etat_processus); void instruction_format(struct_processus *s_etat_processus); void instruction_fp(struct_processus *s_etat_processus); void instruction_fs_test(struct_processus *s_etat_processus); @@ -2578,6 +2613,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); @@ -2634,9 +2670,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); @@ -2807,7 +2845,7 @@ void instruction_yield(struct_processus /* -------------------------------------------------------------------------------- - Procédures + Procédures -------------------------------------------------------------------------------- */ @@ -2906,6 +2944,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); @@ -2991,7 +3030,7 @@ int envoi_signal_thread(pthread_t tid, e /* -------------------------------------------------------------------------------- - Fonctions de sommation de vecteur dans perte de précision + Fonctions de sommation de vecteur dans perte de précision -------------------------------------------------------------------------------- */ @@ -3007,7 +3046,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 /* @@ -3036,7 +3076,7 @@ struct_vecteur *variance_statistique(str /* -------------------------------------------------------------------------------- - Gestion des bibliothèques + Gestion des bibliothèques -------------------------------------------------------------------------------- */ @@ -3065,6 +3105,8 @@ struct_liste_chainee *sauvegarde_argumen #ifndef RPLARGS unsigned char *analyse_algebrique(struct_processus *s_etat_processus, unsigned char *chaine_algebrique, struct_liste_chainee **l_base_liste); +unsigned char *analyse_flux(struct_processus *s_etat_processus, + unsigned char *flux, long longueur); unsigned char *recherche_chemin_fichiers_temporaires(struct_processus *s_etat_processus); unsigned char *compactage(unsigned char *chaine); @@ -3120,6 +3162,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, @@ -3213,6 +3257,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, ...); @@ -3234,7 +3280,7 @@ unsigned char longueur_entiers_binaires( /* -------------------------------------------------------------------------------- - Fonctions retournant un INTEGER*8 (valeur binaire non signée) + Fonctions retournant un INTEGER*8 (valeur binaire non signée) -------------------------------------------------------------------------------- */ @@ -3258,7 +3304,7 @@ integer8 position_caractere_de_chaine(st /* -------------------------------------------------------------------------------- - Fonctions renvoyant une liste chaînée (pointeur sur *struct_liste_chainee) + Fonctions renvoyant une liste chaînée (pointeur sur *struct_liste_chainee) -------------------------------------------------------------------------------- */ @@ -3311,7 +3357,7 @@ struct_objet *simplification(struct_proc /* -------------------------------------------------------------------------------- - Fonctions gérant les arbres de simplification + Fonctions gérant les arbres de simplification -------------------------------------------------------------------------------- */ @@ -3328,7 +3374,7 @@ void simplification_arbre(struct_process /* -------------------------------------------------------------------------------- - Fonctions gérant la complétion automatique + Fonctions gérant la complétion automatique -------------------------------------------------------------------------------- */ @@ -3340,7 +3386,7 @@ char **completion_matches(); /* -------------------------------------------------------------------------------- - Arithmétique + Arithmétique -------------------------------------------------------------------------------- */ @@ -3386,7 +3432,7 @@ void f77soustractionrc_(real8 *ra, compl /* -------------------------------------------------------------------------------- - Trigonométrie complexe + Trigonométrie complexe -------------------------------------------------------------------------------- */ @@ -3483,7 +3529,7 @@ void zgeev_(unsigned char *calcul_vp_gau integer4 *erreur, integer4 longueur_1, integer4 longueur_2); /* - * Valeurs propres généralisées + * Valeurs propres généralisées */ void zggev_(unsigned char *calcul_vp_gauches, unsigned char *calcul_vp_droits, @@ -3496,7 +3542,7 @@ void zggev_(unsigned char *calcul_vp_gau integer4 *erreur, integer4 longueur_1, integer4 longueur_2); /* - * Moindres carrés + * Moindres carrés */ void dgelsd_(integer4 *nombre_lignes_a, integer4 *nombre_colonnes_a, @@ -3511,11 +3557,11 @@ void zgelsd_(integer4 *nombre_lignes_a, real8 *rwork, integer4 *iwork, integer4 *info); /* - * Moindres carrés généralisé + * Moindres carrés généralisé */ /* - * Décomposition en valeurs singulières + * Décomposition en valeurs singulières */ void dgesvd_(unsigned char *jobu, unsigned char *jobvh, @@ -3572,7 +3618,7 @@ void zgees_(unsigned char *calcul_vecteu real8 *rwork, logical4 *bwork, integer4 *info, integer4 l1, integer4 l2); - /* Déterminant et rang */ + /* Déterminant et rang */ void dgecon_(unsigned char *norm, integer4 *n, real8 *a, integer4 *lda, real8 *anorm, real8 *rcond, real8 *work, integer4 *iwork, integer4 *info, integer4 l1); @@ -3593,8 +3639,8 @@ void zgelsy_(integer4 *m, integer4 *n, i #endif /* - * Fonction testant la requête d'arrêt (nécessaire pour tester le - * drapeau depuis une bibliothèque). + * Fonction testant la requête d'arrêt (nécessaire pour tester le + * drapeau depuis une bibliothèque). */ int test_arret(struct_processus *s_etat_processus);