--- rpl/src/rpl.h 2012/10/05 13:12:39 1.181 +++ rpl/src/rpl.h 2012/12/20 15:32:52 1.191 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.11 + RPL/2 (R) version 4.1.12 Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -445,7 +445,10 @@ union semun __STATIC_MUTEX_INITIALIZATION__; __EXTERN__ pthread_mutex_t mutex_gestionnaires_signaux_atomique __STATIC_MUTEX_INITIALIZATION__; + __EXTERN__ pthread_mutex_t mutex_creation_variable_partagee + __STATIC_MUTEX_INITIALIZATION__; __EXTERN__ pthread_mutex_t mutex_sections_critiques; + __EXTERN__ pthread_mutex_t mutex_liste_variables_partagees; __EXTERN__ sem_t __PTR__ semaphore_gestionnaires_signaux; @@ -742,7 +745,7 @@ pid_t debug_fork(); Erreurs système -------------------------------------------------------------------------------- */ - +#define DEBUG_ERREURS #ifdef DEBUG_ERREURS # ifdef MESSAGES # define __erreur(i) i @@ -1224,6 +1227,7 @@ typedef struct connecteur_sql # ifdef POSTGRESQL_SUPPORT PGconn *postgresql; # endif + sqlite3 *sqlite; } descripteur; } struct_connecteur_sql; #endif @@ -1237,6 +1241,10 @@ typedef struct connecteur_sql "POSTGRESQL") == 0) \ postgresqlclose((*((struct_connecteur_sql *) (*s_objet).objet)) \ .descripteur); \ + else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type, \ + "SQLITE") == 0) \ + sqlite3_close((*((struct_connecteur_sql *) (*s_objet).objet)) \ + .descripteur.sqlite); \ else \ BUG(1, uprintf("SQL type '%s' not allowed!", \ (*((struct_connecteur_sql *) (*s_objet).objet)).type)); @@ -1553,19 +1561,9 @@ typedef struct variable_partage union_position_variable variable_partagee; struct_objet *objet; -} struct_variable_partagee; - -typedef struct table_variables_partagees -{ - pthread_mutex_t mutex; - - volatile struct_variable_partagee *table; - - volatile unsigned long nombre_variables; - volatile unsigned long nombre_variables_allouees; - unsigned long position_variable; -} struct_table_variables_partagees; + pthread_mutex_t mutex; +} struct_variable_partagee; #endif @@ -1750,6 +1748,32 @@ typedef struct arbre_variables struct liste_variables_statiques *feuille_statique; } struct_arbre_variables; +typedef struct arbre_variables_partagees +{ + unsigned int noeuds_utilises; + // Nombre de noeuds utilisés dans le + // tableau **noeuds + signed int indice_tableau_pere; + // Position de la structure dans le + // tableau **noeuds du père + + struct arbre_variables_partagees *noeud_pere; + struct arbre_variables_partagees **noeuds; + + struct liste_variables_partagees *feuille; + + pthread_mutex_t mutex_feuille; +} struct_arbre_variables_partagees; + +#define INITIALISATION_MUTEX(mutex) \ + do { \ + pthread_mutexattr_t attributs_mutex; \ + pthread_mutexattr_init(&attributs_mutex); \ + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); \ + pthread_mutex_init(&(mutex), &attributs_mutex); \ + pthread_mutexattr_destroy(&attributs_mutex); \ + } while(0) + typedef struct tableau_variables { unsigned char origine; @@ -1790,8 +1814,20 @@ typedef struct liste_variables_statiques struct liste_variables_statiques *suivant; struct liste_variables_statiques *precedent; struct liste_variables_statiques *reference; + struct_arbre_variables *feuille; struct_variable_statique *variable; } struct_liste_variables_statiques; + +typedef struct liste_variables_partagees +{ + struct liste_variables_partagees *suivant; + struct liste_variables_partagees *precedent; + struct liste_variables_partagees *reference; + struct_arbre_variables_partagees *feuille; + struct_variable_partagee *variable; + pthread_t tid; + pid_t pid; +} struct_liste_variables_partagees; #endif /* @@ -1881,6 +1917,8 @@ typedef struct processus logical1 presence_fusible; pthread_t thread_fusible; pthread_t thread_surveille_par_fusible; + pthread_t thread_signaux; + int pipe_signaux[2]; volatile int pointeur_signal_ecriture; volatile int pointeur_signal_lecture; @@ -1909,14 +1947,18 @@ typedef struct processus struct_liste_variables *l_liste_variables_par_niveau; struct_liste_variables_statiques *l_liste_variables_statiques; - struct_table_variables_partagees - *s_liste_variables_partagees; + + struct_arbre_variables_partagees + **s_arbre_variables_partagees; + struct_liste_variables_partagees + **l_liste_variables_partagees; logical1 niveau_supprime; struct_variable *pointeur_variable_courante; struct_liste_variables *pointeur_feuille_courante; struct_variable_statique *pointeur_variable_statique_courante; + struct_variable_partagee *pointeur_variable_partagee_courante; int *pointeurs_caracteres_variables; int nombre_caracteres_variables; @@ -2291,6 +2333,10 @@ typedef struct processus struct_arbre_variables *variables_noeud[TAILLE_CACHE]; int pointeur_variables_noeud; + struct_arbre_variables_partagees + *variables_partagees_noeud[TAILLE_CACHE]; + int pointeur_variables_partagees_noeud; + struct_liste_variables *variables_feuille[TAILLE_CACHE]; int pointeur_variables_feuille; @@ -2299,6 +2345,11 @@ typedef struct processus struct_arbre_variables **variables_tableau_noeuds[TAILLE_CACHE]; int pointeur_variables_tableau_noeuds; + + struct_arbre_variables_partagees + **variables_tableau_noeuds_partages + [TAILLE_CACHE]; + int pointeur_variables_tableau_noeuds_partages; } struct_processus; #endif @@ -2978,8 +3029,12 @@ void liberation_arbre_instructions(struc struct_instruction *arbre); void liberation_arbre_variables(struct_processus *s_etat_processus, struct_arbre_variables *arbre, logical1 definitions); +void liberation_arbre_variables_partagees(struct_processus *s_etat_processus, + struct_arbre_variables_partagees *arbre); void liberation_contexte_cas(struct_processus *s_etat_processus); void liberation_generateur_aleatoire(struct_processus *s_etat_processus); +void liberation_mutexes_arbre_variables_partagees(struct_processus + *s_etat_processus, struct_arbre_variables_partagees *l_element_courant); void liberation_threads(struct_processus *s_etat_processus); void liberation_profil(struct_processus *s_etat_processus); void localisation_courante(struct_processus *s_etat_processus); @@ -3004,6 +3059,7 @@ void scrutation_interruptions(struct_pro 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 *thread_signaux(void *argument); 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, @@ -3172,8 +3228,8 @@ unsigned char *transliteration(struct_pr */ #ifndef RPLARGS -logical1 ajout_bouchon_variable_statique(struct_processus *s_etat_processus); logical1 analyse_syntaxique(struct_processus *s_etat_processus); +logical1 arret_thread_signaux(struct_processus *s_etat_processus); logical1 caracteristiques_fichier(struct_processus *s_etat_processus, unsigned char *nom, logical1 *existence, logical1 *ouverture, unsigned long *unite); @@ -3204,15 +3260,19 @@ logical1 initialisation_fichier_acces_di sqlite3 *sqlite, logical1 binaire); logical1 initialisation_fichier_acces_indexe(struct_processus *s_etat_processus, sqlite3 *sqlite, integer8 position_clef, logical1 binaire); +logical1 lancement_thread_signaux(struct_processus *s_etat_processus); logical1 recherche_instruction_suivante(struct_processus *s_etat_processus); logical1 retrait_variable(struct_processus *s_etat_processus, unsigned char *nom_variable, unsigned char type); logical1 retrait_variables_par_niveau(struct_processus *s_etat_processus); logical1 retrait_variable_partagee(struct_processus *s_etat_processus, unsigned char *nom_variable, union_position_variable position); -logical1 retrait_variables_statiques(struct_processus *s_etat_processus); +logical1 retrait_variables_partagees_locales( + struct_processus *s_etat_processus); logical1 retrait_variable_statique(struct_processus *s_etat_processus, unsigned char *nom_variable, union_position_variable position); +logical1 retrait_variables_statiques_locales( + struct_processus *s_etat_processus); logical1 sequenceur(struct_processus *s_etat_processus); logical1 sequenceur_optimise(struct_processus *s_etat_processus); #endif @@ -3235,9 +3295,6 @@ logical1 recherche_variable(struct_proce unsigned char *nom_variable); logical1 recherche_variable_globale(struct_processus *s_etat_processus, unsigned char *nom_variable); -logical1 recherche_variable_partagee(struct_processus *s_etat_processus, - unsigned char *nom_variable, union_position_variable position, - unsigned char origine); logical1 test_cfsf(struct_processus *s_etat_processus, unsigned char indice_drapeau); logical1 test_expression_rpn(unsigned char *chaine); @@ -3268,10 +3325,8 @@ int alsprintf(unsigned char **strp, cons int interruption_violation_access(void *adresse_fautive, int gravite); #ifndef RPLARGS int liste_variables(struct_processus *s_etat_processus, - struct_tableau_variables *tableau, int position, - struct_arbre_variables *l_element_courant); -int nombre_variables(struct_processus *s_etat_processus, - struct_arbre_variables *l_element_courant); + struct_tableau_variables *tableau); +int nombre_variables(struct_processus *s_etat_processus); int readline_analyse_syntaxique(int count, int key); int readline_effacement(int count, int key); #endif @@ -3369,16 +3424,23 @@ struct_objet *parametres_sql(struct_proc struct_objet *simplification(struct_processus *s_etat_processus, struct_objet *s_objet); +struct_arbre_variables *allocation_noeud(struct_processus *s_etat_processus); +struct_arbre_variables **allocation_tableau_noeuds( + struct_processus *s_etat_processus); + /* -------------------------------------------------------------------------------- Fonctions renvoyant un pointeur sur une *struct_liste_variables_statiques + ou *struct_liste_variables_partagees -------------------------------------------------------------------------------- */ struct_liste_variables_statiques *recherche_variable_statique(struct_processus *s_etat_processus, unsigned char *nom_variable, - union_position_variable position, - unsigned char origine); + union_position_variable position, unsigned char origine); +struct_liste_variables_partagees *recherche_variable_partagee(struct_processus + *s_etat_processus, unsigned char *nom_variable, + union_position_variable position, unsigned char origine); #endif /*