Diff for /rpl/src/rpl.h between versions 1.20 and 1.35

version 1.20, 2010/04/07 13:33:23 version 1.35, 2010/05/16 19:36:20
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.13    RPL/2 (R) version 4.0.15
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2010 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
Line 24 Line 24
 #define INCLUSION_RPL  #define INCLUSION_RPL
   
 #define _GNU_SOURCE  #define _GNU_SOURCE
   #define _POSIX_C_SOURCE     200112L
 #define _REENTRANT  #define _REENTRANT
   
   #ifdef Darwin
   #   define SIGPOLL          SIGIO
   #   define _DARWIN_C_SOURCE
   #endif
   
 /*  /*
 ================================================================================  ================================================================================
Line 43 Line 48
 #include <stdarg.h>  #include <stdarg.h>
   
 #ifndef RPLARGS  #ifndef RPLARGS
   #   include <sys/mman.h>
 #   include <sys/resource.h>  #   include <sys/resource.h>
 #   include <sys/select.h>  #   include <sys/select.h>
 #   include <sys/socket.h>  #   include <sys/socket.h>
Line 93 Line 99
 #   include <ieeefp.h>  #   include <ieeefp.h>
 #endif  #endif
   
   // Définition spécifique à Hurd
   #ifndef PIPE_BUF
   #   define fpathconf (".", _PC_PIPE_BUF)
   #endif
   
 #ifdef MYSQL_SUPPORT  #ifdef MYSQL_SUPPORT
 #   include <mysql.h>  #   include <mysql.h>
 #   define mysqlclose(arg)      mysql_close(arg.mysql)  #   define mysqlclose(arg)      mysql_close(arg.mysql)
Line 107 Line 118
 #   define postgresqlclose(arg)  #   define postgresqlclose(arg)
 #endif  #endif
   
 #ifdef LIBRPL  #include "librplprototypes.h"
 #   include "librplprototypes.h"  
 #endif  
   
 /*  /*
 ================================================================================  ================================================================================
Line 118 Line 127
 */  */
   
 #ifndef RPLARGS  #ifndef RPLARGS
   //  Arrêt par STOP
 #   define SIGFSTOP                 SIGUSR1  #   define SIGFSTOP                 SIGUSR1
   //  Démarrage d'un processus fils
 #   define SIGSTART                 SIGUSR2  #   define SIGSTART                 SIGUSR2
   //  Injection de données
 #   define SIGINJECT                SIGQUIT  #   define SIGINJECT                SIGQUIT
   //  Arrêt général
 #   define SIGABORT                 SIGPROF  #   define SIGABORT                 SIGPROF
   //  Arrêt d'un processus fils depuis autre chose que STOP
   #   define SIGFABORT                SIGPOLL
 #   define d_NOMBRE_INTERRUPTIONS   64  #   define d_NOMBRE_INTERRUPTIONS   64
 #endif  #endif
   
Line 182  typedef unsigned char   t_8_bits; Line 197  typedef unsigned char   t_8_bits;
 */  */
   
 #ifndef RPLARGS  #ifndef RPLARGS
   #   ifdef SEMAPHORES_NOMMES
   #       define LONGUEUR_NOM_SEMAPHORE   64
   #   endif
 #   ifndef MAIN_RPL  #   ifndef MAIN_RPL
     extern jmp_buf                  contexte;          extern jmp_buf              contexte;
     extern jmp_buf                  contexte_initial;          extern jmp_buf              contexte_initial;
   
   #       ifdef SEMAPHORES_NOMMES
           extern pthread_mutex_t      mutex_sem;
   #       endif
   
           extern pthread_key_t        semaphore_fork_processus_courant;
   
     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 sem_t
   #       ifdef SEMAPHORES_NOMMES
           *
   #       endif
                                       semaphore_gestionnaires_signaux_atomique;
   
     extern sem_t                    semaphore_liste_threads;  #       ifdef SEMAPHORES_NOMMES
     extern sem_t                    semaphore_gestionnaires_signaux;          // 0 -> liste_threads
     extern sem_t                    semaphore_gestionnaires_signaux_atomique;          // 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  #   else
     jmp_buf                         contexte;          jmp_buf                     contexte;
     jmp_buf                         contexte_initial;          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                           semaphore_liste_threads;          sem_t
     sem_t                           semaphore_gestionnaires_signaux;  #       ifdef SEMAPHORES_NOMMES
     sem_t                           semaphore_gestionnaires_signaux_atomique;          *
   #       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
 #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    Macros
Line 277  typedef unsigned char   t_8_bits; Line 367  typedef unsigned char   t_8_bits;
 #   define abs(i) (((i) >= 0) ? (i) : (-i))  #   define abs(i) (((i) >= 0) ? (i) : (-i))
 #endif  #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) \  #define NOTICE(m) \
     do \      do \
     { \      { \
Line 294  typedef unsigned char   t_8_bits; Line 378  typedef unsigned char   t_8_bits;
   
 #ifdef __GLIBC__  #ifdef __GLIBC__
 #include <execinfo.h>  #include <execinfo.h>
   #define __BACKTRACE
 #define BACKTRACE(n) \  #define BACKTRACE(n) \
     do \      do \
     { \      { \
Line 309  typedef unsigned char   t_8_bits; Line 394  typedef unsigned char   t_8_bits;
         if (appels != NULL) \          if (appels != NULL) \
         { \          { \
             for(i = 0; i < nb; i++) \              for(i = 0; i < nb; i++) \
                 uprintf("%s\n", appels[i]); \                  uprintf("    %s\n", appels[i]); \
             free(appels); \              free(appels); \
         } \          } \
         else \          else \
Line 322  typedef unsigned char   t_8_bits; Line 407  typedef unsigned char   t_8_bits;
 #define BACKTRACE(n) NOTICE("BACKTRACE only defined in glibc")  #define BACKTRACE(n) NOTICE("BACKTRACE only defined in glibc")
 #endif  #endif
   
   #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
   
   
 /*  /*
 ================================================================================  ================================================================================
Line 330  typedef unsigned char   t_8_bits; Line 430  typedef unsigned char   t_8_bits;
 */  */
   
 #ifdef DEBUG_MEMOIRE  #ifdef DEBUG_MEMOIRE
   void analyse_post_mortem();
 void *debug_memoire_ajout(size_t taille, const unsigned char *fonction,  void *debug_memoire_ajout(size_t taille, const unsigned char *fonction,
         unsigned long ligne, const unsigned char *argument);          unsigned long ligne, const unsigned char *argument);
 void *debug_memoire_modification(void *pointeur, size_t taille,  void *debug_memoire_modification(void *pointeur, size_t taille,
         const unsigned char *fonction, unsigned long ligne,          const unsigned char *fonction, unsigned long ligne,
         const unsigned char *argument);          const unsigned char *argument);
 void debug_memoire_retrait(void *ptr);  void debug_memoire_retrait(void *ptr);
   void debug_memoire_verification();
   
 #define malloc(s) debug_memoire_ajout(s, __FUNCTION__, __LINE__, #s)  #define malloc(s) debug_memoire_ajout(s, __FUNCTION__, __LINE__, #s)
 #define free(s) debug_memoire_retrait(s)  #define free(s) debug_memoire_retrait(s)
Line 414  void debug_memoire_retrait(void *ptr); Line 516  void debug_memoire_retrait(void *ptr);
 #define d_absence_erreur        ((logical1) d_faux)  #define d_absence_erreur        ((logical1) d_faux)
 #define d_erreur                ((logical1) d_vrai)  #define d_erreur                ((logical1) d_vrai)
   
 #define d_code_fin_chaine       '\0'  #define d_code_fin_chaine                   '\0'
 #define d_code_espace           ' '  #define d_code_espace                       ' '
 #define d_code_retour_chariot   '\n'  #define d_code_retour_chariot               '\n'
 #define d_code_tabulation       '\t'  #define d_code_tabulation                   '\t'
   #define d_longueur_maximale_instruction     16
   
 #define d_INT                   "integer"  #define d_INT                   "integer"
 #define d_REL                   "real"  #define d_REL                   "real"
Line 487  void debug_memoire_retrait(void *ptr); Line 590  void debug_memoire_retrait(void *ptr);
 #   define d_es_interruption_invalide           2012  #   define d_es_interruption_invalide           2012
 #   define d_es_contexte                        2013  #   define d_es_contexte                        2013
 #   define d_es_somme_controle                  2014  #   define d_es_somme_controle                  2014
 #   define d_es_nom_implicite                   2015  
 #endif  #endif
   
 /*  /*
Line 622  void debug_memoire_retrait(void *ptr); Line 724  void debug_memoire_retrait(void *ptr);
 #   define d_ex_erreur_profilage                78  #   define d_ex_erreur_profilage                78
 #   define d_ex_enregistrement_inexistant       79  #   define d_ex_enregistrement_inexistant       79
 #   define d_ex_clef_inexistante                80  #   define d_ex_clef_inexistante                80
   #   define d_ex_nom_implicite                   81
 #endif  #endif
   
   
Line 1682  typedef struct processus Line 1785  typedef struct processus
     unsigned char               traitement_interruption;  /* Y/N */      unsigned char               traitement_interruption;  /* Y/N */
     unsigned char               traitement_interruptible; /* Y/N */      unsigned char               traitement_interruptible; /* Y/N */
   
       struct_objet                *at_exit;
   
 /* Variables volatiles                                  */  /* Variables volatiles                                  */
   
     volatile sig_atomic_t       var_volatile_alarme;      volatile sig_atomic_t       var_volatile_alarme;
Line 1695  typedef struct processus Line 1800  typedef struct processus
     volatile sig_atomic_t       var_volatile_processus_pere;      volatile sig_atomic_t       var_volatile_processus_pere;
     volatile sig_atomic_t       var_volatile_recursivite;      volatile sig_atomic_t       var_volatile_recursivite;
   
       volatile sig_atomic_t       arret_depuis_abort;
   
     volatile int                var_volatile_exception_gsl;      volatile int                var_volatile_exception_gsl;
   
 /* Autres                                               */  /* Autres                                               */
Line 1741  typedef struct processus Line 1848  typedef struct processus
     pthread_mutex_t             mutex;      pthread_mutex_t             mutex;
   
     // Sémaphore autorisant les fork()      // Sémaphore autorisant les fork()
     sem_t                       semaphore_fork;      sem_t
   #   ifdef SEMAPHORES_NOMMES
       *
   #   endif
                                   semaphore_fork;
   
 /* Mutexes                                          */  /* Mutexes                                          */
   
Line 1761  typedef struct processus Line 1872  typedef struct processus
     unsigned long               taille_pile_objets;      unsigned long               taille_pile_objets;
     struct_objet                *pile_objets;      struct_objet                *pile_objets;
   
 #   define TAILLE_CACHE 1024  #   define TAILLE_CACHE 16384
   
     unsigned long               *objets_adr[TAILLE_CACHE];      unsigned long               *objets_adr[TAILLE_CACHE];
     int                         pointeur_adr;      int                         pointeur_adr;
Line 1865  void instruction_asl(struct_processus *s Line 1976  void instruction_asl(struct_processus *s
 void instruction_asr(struct_processus *s_etat_processus);  void instruction_asr(struct_processus *s_etat_processus);
 void instruction_atan(struct_processus *s_etat_processus);  void instruction_atan(struct_processus *s_etat_processus);
 void instruction_atanh(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_autoscale(struct_processus *s_etat_processus);
 void instruction_axes(struct_processus *s_etat_processus);  void instruction_axes(struct_processus *s_etat_processus);
   
Line 1884  void instruction_clear(struct_processus Line 1996  void instruction_clear(struct_processus
 void instruction_cllcd(struct_processus *s_etat_processus);  void instruction_cllcd(struct_processus *s_etat_processus);
 void instruction_clmf(struct_processus *s_etat_processus);  void instruction_clmf(struct_processus *s_etat_processus);
 void instruction_close(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_clrcntxt(struct_processus *s_etat_processus);
 void instruction_clrerr(struct_processus *s_etat_processus);  void instruction_clrerr(struct_processus *s_etat_processus);
 void instruction_clrfuse(struct_processus *s_etat_processus);  void instruction_clrfuse(struct_processus *s_etat_processus);
Line 2083  void instruction_maxs(struct_processus * Line 2196  void instruction_maxs(struct_processus *
 void instruction_mclrin(struct_processus *s_etat_processus);  void instruction_mclrin(struct_processus *s_etat_processus);
 void instruction_mean(struct_processus *s_etat_processus);  void instruction_mean(struct_processus *s_etat_processus);
 void instruction_mem(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_min(struct_processus *s_etat_processus);
 void instruction_mins(struct_processus *s_etat_processus);  void instruction_mins(struct_processus *s_etat_processus);
 void instruction_mod(struct_processus *s_etat_processus);  void instruction_mod(struct_processus *s_etat_processus);
Line 2137  void instruction_print(struct_processus Line 2252  void instruction_print(struct_processus
 void instruction_private(struct_processus *s_etat_processus);  void instruction_private(struct_processus *s_etat_processus);
 void instruction_prlcd(struct_processus *s_etat_processus);  void instruction_prlcd(struct_processus *s_etat_processus);
 void instruction_prmd(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_prompt(struct_processus *s_etat_processus);
 void instruction_protect(struct_processus *s_etat_processus);  void instruction_protect(struct_processus *s_etat_processus);
 void instruction_prst(struct_processus *s_etat_processus);  void instruction_prst(struct_processus *s_etat_processus);
Line 2370  void *allocation_maillon(struct_processu Line 2486  void *allocation_maillon(struct_processu
   
 #ifndef RPLARGS  #ifndef RPLARGS
 void analyse(struct_processus *s_etat_processus, void (*fonction)());  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);          unsigned char *candidat);
 void appel_gnuplot(struct_processus *s_etat_processus,  void appel_gnuplot(struct_processus *s_etat_processus,
         unsigned char persistance);          unsigned char persistance);
Line 2383  void conversion_element_tex(unsigned cha Line 2499  void conversion_element_tex(unsigned cha
 void conversion_format(struct_processus *s_etat_processus,  void conversion_format(struct_processus *s_etat_processus,
         unsigned char *chaine);          unsigned char *chaine);
 void conversion_hms_vers_decimal(real8 *angle);  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 conversion_radians_vers_degres(real8 *angle);
 void correction_formateur_tex(struct_processus *s_etat_processus,  void correction_formateur_tex(struct_processus *s_etat_processus,
         unsigned char **ligne);          unsigned char **ligne);
 void debug_memoire_verification(struct_processus *s_etat_processus);  
 void depilement_pile_systeme(struct_processus *s_etat_processus);  void depilement_pile_systeme(struct_processus *s_etat_processus);
 void derivation(struct_processus *s_etat_processus,  void derivation(struct_processus *s_etat_processus,
         struct_objet **s_expression);          struct_objet **s_expression);
Line 2396  void deverrouillage_threads_concurrents( Line 2513  void deverrouillage_threads_concurrents(
 void ecriture_pile(struct_processus *s_etat_processus, file *flux,  void ecriture_pile(struct_processus *s_etat_processus, file *flux,
         struct_liste_chainee *l_element_courant, unsigned long niveau_courant);          struct_liste_chainee *l_element_courant, unsigned long niveau_courant);
 void ecriture_profil(struct_processus *s_etat_processus);  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 empilement_pile_systeme(struct_processus *s_etat_processus);
 void encart(struct_processus *s_etat_processus, unsigned long duree);  void encart(struct_processus *s_etat_processus, unsigned long duree);
 void evaluation_romberg(struct_processus *s_etat_processus,  void evaluation_romberg(struct_processus *s_etat_processus,
Line 2479  void retrait_thread(struct_processus *s_ Line 2597  void retrait_thread(struct_processus *s_
 void retrait_thread_surveillance(struct_processus *s_etat_processus,  void retrait_thread_surveillance(struct_processus *s_etat_processus,
         struct_descripteur_thread *s_argument_thread);          struct_descripteur_thread *s_argument_thread);
 void rplcore(struct_processus *s_etat_processus);  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 sf(struct_processus *s_etat_processus, unsigned char indice_drapeau);
 void *surveillance_processus(void *argument);  void *surveillance_processus(void *argument);
 void swap(void *variable_1, void *variable_2, unsigned long taille_octets);  void swap(void *variable_1, void *variable_2, unsigned long taille_octets);
Line 2699  logical1 test_fonction(unsigned char *ch Line 2817  logical1 test_fonction(unsigned char *ch
 */  */
   
 #ifndef RPLARGS  #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);          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);          int fd, void *buf, size_t count);
 #endif  #endif
   
Line 3091  void zgelsy_(integer4 *m, integer4 *n, i Line 3209  void zgelsy_(integer4 *m, integer4 *n, i
  * drapeau depuis une bibliothèque).   * drapeau depuis une bibliothèque).
  */   */
   
 inline int test_arret(struct_processus *s_etat_processus);  int test_arret(struct_processus *s_etat_processus);
   
 #endif  #endif
   

Removed from v.1.20  
changed lines
  Added in v.1.35


CVSweb interface <joel.bertrand@systella.fr>