--- rpl/src/rpl.h 2010/05/13 19:09:18 1.34 +++ rpl/src/rpl.h 2010/07/14 14:19:40 1.49 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.15 + RPL/2 (R) version 4.0.18 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -28,10 +28,10 @@ #define _REENTRANT #ifdef Darwin -# define SIGPOLL SIGIO -# define _DARWIN_C_SOURCE +# define _DARWIN_C_SOURCE #endif + /* ================================================================================ INCLUSIONS @@ -127,6 +127,10 @@ */ #ifndef RPLARGS +# ifdef Darwin +# define SIGPOLL SIGINFO +# endif + // Arrêt par STOP # define SIGFSTOP SIGUSR1 // Démarrage d'un processus fils @@ -137,6 +141,7 @@ # 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 @@ -367,12 +372,6 @@ int sem_getvalue2(sem_t *semaphore, int # 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 \ { \ @@ -413,6 +412,21 @@ int sem_getvalue2(sem_t *semaphore, int #define BACKTRACE(n) NOTICE("BACKTRACE only defined in glibc") #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 + /* ================================================================================ @@ -421,17 +435,23 @@ int sem_getvalue2(sem_t *semaphore, int */ #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 @@ -471,21 +491,6 @@ void debug_memoire_retrait(void *ptr); 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 /* ================================================================================ @@ -560,25 +565,36 @@ void debug_memoire_retrait(void *ptr); -------------------------------------------------------------------------------- */ -#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_somme_controle 2014 +# 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 /* @@ -589,17 +605,17 @@ void debug_memoire_retrait(void *ptr); #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 /* @@ -610,18 +626,18 @@ void debug_memoire_retrait(void *ptr); #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 /* @@ -633,87 +649,88 @@ void debug_memoire_retrait(void *ptr); // -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 -# define d_ex_enregistrement_inexistant 79 -# define d_ex_clef_inexistante 80 -# define d_ex_nom_implicite 81 +# 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 @@ -1115,6 +1132,7 @@ typedef struct descripteur_thread pthread_t thread_pere; pthread_mutex_t mutex; + volatile logical1 thread_actif; int pipe_erreurs[2]; @@ -1195,21 +1213,23 @@ typedef struct liste_pile_systeme /* type clôture : - C CASE : END termine un test SELECT/CASE/THEN/END/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. - W WHILE : END termine une boucle WHILE/REPEAT/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. + 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. + + 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 initialisation. */ unsigned long adresse_retour; unsigned long niveau_courant; + struct_objet *pointeur_adresse_retour; } struct_liste_pile_systeme; #endif @@ -1835,6 +1855,7 @@ 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 @@ -1861,7 +1882,11 @@ typedef struct processus unsigned long taille_pile_objets; struct_objet *pile_objets; -# define TAILLE_CACHE 16384 +# ifndef DEBUG_MALLOC +# define TAILLE_CACHE 16384 +# else +# define TAILLE_CACHE 4 +# endif unsigned long *objets_adr[TAILLE_CACHE]; int pointeur_adr; @@ -1900,7 +1925,7 @@ typedef struct processus /* -------------------------------------------------------------------------------- - Structures instruction intrinseque + Structures instruction intrinsèque -------------------------------------------------------------------------------- */ @@ -1971,6 +1996,7 @@ void instruction_axes(struct_processus * void instruction_b_vers_r(struct_processus *s_etat_processus); void instruction_backspace(struct_processus *s_etat_processus); +void instruction_backtrace(struct_processus *s_etat_processus); void instruction_beep(struct_processus *s_etat_processus); void instruction_bessel(struct_processus *s_etat_processus); void instruction_bin(struct_processus *s_etat_processus); @@ -2493,7 +2519,6 @@ void conversion_majuscule_limitee(unsign void conversion_radians_vers_degres(real8 *angle); void correction_formateur_tex(struct_processus *s_etat_processus, unsigned char **ligne); -void debug_memoire_verification(struct_processus *s_etat_processus); void depilement_pile_systeme(struct_processus *s_etat_processus); void derivation(struct_processus *s_etat_processus, struct_objet **s_expression); @@ -2557,6 +2582,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); @@ -2591,6 +2617,7 @@ void scrutation_injection(struct_process 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);