--- rpl/src/rpl.h 2010/08/25 09:43:37 1.61 +++ rpl/src/rpl.h 2011/09/16 14:42:03 1.124 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.18 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.3 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -23,21 +23,28 @@ #ifndef INCLUSION_RPL #define INCLUSION_RPL -#define _GNU_SOURCE -#define _POSIX_C_SOURCE 200112L +#ifndef __RPLCAS +# define _GNU_SOURCE +# define _XOPEN_SOURCE 700 +#endif + #define _REENTRANT -#ifdef Darwin -# define _DARWIN_C_SOURCE -#endif +#ifndef __RPLCAS +# ifdef Darwin +# define _DARWIN_C_SOURCE +# endif -#ifdef OpenBSD -# define _BSD_SOURCE +# ifdef OpenBSD +# define _BSD_SOURCE +# endif #endif #ifdef OS2 -# define _BSD_SOURCE -# define _XOPEN_SOURCE 600 +# ifndef __RPLCAS +# define _BSD_SOURCE +# define _XOPEN_SOURCE 600 +# endif # include enum { SHUT_RD = 0, SHUT_WR, SHUT_RDWR }; @@ -92,13 +99,9 @@ # endif # include +# include -# ifdef _BROKEN_SIGINFO -# include -# include -# endif - -# ifndef SEMAPHORES_SYSV +# ifndef IPCS_SYSV # include # else # include @@ -206,19 +209,60 @@ ================================================================================ */ -#ifdef _BROKEN_SIGINFO -# define SIGHANDLER_ARGS int signal -# ifdef SA_SIGINFO -# undef SA_SIGINFO +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 + // SUSPEND + rpl_sigstop, // Signal d'arrêt envoyé par l'instruction STOP ou + // FUSE. (FSTOP) + 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_sighup, + rpl_sigtstp, + rpl_sigexcept, + rpl_sigmax +}; + +#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. + +typedef struct queue_signaux +{ + sem_t +# ifdef SEMAPHORES_NOMMES + * # endif -# define SA_SIGINFO 0 + semaphore; -# define kill(pid, signal) kill_broken_siginfo(pid, signal) -# define pthread_kill(tid, signal) pthread_kill_broken_siginfo(tid, signal) - int kill_broken_siginfo(pid_t pid, int signal); - int pthread_kill_broken_siginfo(pthread_t tid, int signal); -#else -# define SIGHANDLER_ARGS int signal, siginfo_t *siginfo, void *context + volatile int pointeur_lecture; + volatile int pointeur_ecriture; + + volatile struct + { + pid_t pid; + enum signaux_rpl signal; + } queue[LONGUEUR_QUEUE_SIGNAUX]; +} struct_queue_signaux; + +#ifndef RPLARGS +# ifndef MAIN_RPL + extern struct_queue_signaux *s_queue_signaux; + extern int f_queue_signaux; +# else + struct_queue_signaux *s_queue_signaux; + int f_queue_signaux; +# endif #endif #ifdef OpenBSD @@ -228,7 +272,12 @@ # define PTHREAD_SCOPE_SYSTEM 0 #endif -#if ! defined(UNION_SEMUN) && defined(SEMAPHORES_SYSV) +#ifdef OS2 +# define readline(s) readline_wrapper(s) + unsigned char *readline_wrapper(unsigned char *s); +#endif + +#if ! defined(UNION_SEMUN) && defined(IPCS_SYSV) union semun { int val; @@ -245,7 +294,7 @@ union semun ================================================================================ */ -#ifdef SEMAPHORES_SYSV +#ifdef IPCS_SYSV # define sem_init(a, b, c) sem_init_SysV(a, b, c) # define sem_destroy(a) sem_destroy_SysV(a) # define sem_wait(a) sem_wait_SysV(a) @@ -274,25 +323,7 @@ union semun // SIGPIPE // SIGALRM -// 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 -# ifndef OpenBSD -// La libpthread d'OpenBSD utilise SIGPROF -# define SIGABORT SIGPROF -# else -# define SIGABORT SIGTHR -# endif -// Arrêt d'un processus fils depuis autre chose que STOP -# if defined(Darwin) || defined(OpenBSD) -# define SIGFABORT SIGINFO -# else -# define SIGFABORT SIGPOLL -# endif +# define SIGTEST SIGUSR1 // Nombre d'interruptions disponibles # define d_NOMBRE_INTERRUPTIONS 64 @@ -360,81 +391,52 @@ typedef unsigned char t_8_bits; # endif # ifndef MAIN_RPL -# ifdef _BROKEN_SIGINFO - extern int *fifos_signaux; -# endif - extern jmp_buf contexte; extern jmp_buf contexte_initial; + extern jmp_buf contexte_processus; + extern jmp_buf contexte_thread; -# ifdef SEMAPHORES_NOMMES - extern pthread_mutex_t mutex_sem; -# endif + extern int signal_test; - extern pthread_key_t semaphore_fork_processus_courant; + extern pid_t pid_processus_pere; - extern sem_t # ifdef SEMAPHORES_NOMMES - * + extern pthread_mutex_t mutex_sem; # endif - semaphore_liste_threads; - extern sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_gestionnaires_signaux; + extern pthread_mutex_t mutex_liste_threads; + extern pthread_mutex_t mutex_gestionnaires_signaux_atomique; extern sem_t # ifdef SEMAPHORES_NOMMES - * -# endif - 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 + semaphore_gestionnaires_signaux; # else -# ifdef _BROKEN_SIGINFO - int *fifos_signaux; -# endif - jmp_buf contexte; jmp_buf contexte_initial; + jmp_buf contexte_processus; + jmp_buf contexte_thread; -# ifdef SEMAPHORES_NOMMES - pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; -# endif + int signal_test; - pthread_key_t semaphore_fork_processus_courant; + pid_t pid_processus_pere; - sem_t # ifdef SEMAPHORES_NOMMES - * + pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; # endif - semaphore_liste_threads; + pthread_mutex_t mutex_liste_threads = + PTHREAD_MUTEX_INITIALIZER; + pthread_mutex_t mutex_gestiionnaires_signaux = + PTHREAD_MUTEX_INITIALIZER; + pthread_mutex_t mutex_gestionnaires_signaux_atomique = + PTHREAD_MUTEX_INITIALIZER; 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 @@ -478,14 +480,13 @@ int sem_getvalue2(sem_t *semaphore, int #define ufprintf(flux, ...) transliterated_fprintf(NULL, \ flux, __VA_ARGS__) -// Tous les messages pour DISP, INPUT et les E/S par readline sont sur stderr. -// Cela évite aux messages envoyés par les gestionnaires de signaux d'être -// indéfiniment bloqués. - #ifdef SunOS # define fopen(...) ({ FILE *desc; \ while((desc = fopen(__VA_ARGS__)) == NULL) \ { if ((errno != EINTR) && (errno != 0)) break; } desc; }) +# define freopen(...) ({ FILE *desc; \ + while((desc = freopen(__VA_ARGS__)) == NULL) \ + { if ((errno != EINTR) && (errno != 0)) break; } desc; }) # define fclose(...) ({ int ios; \ while((ios = fclose(__VA_ARGS__)) != 0) \ { if ((errno != EINTR) && (errno != 0)) break; } ios; }) @@ -903,6 +904,8 @@ pid_t debug_fork(); # define d_ex_clef_inexistante __erreur(80) # define d_ex_nom_implicite __erreur(81) # define d_ex_version_bibliotheque __erreur(82) +# define d_ex_creation_variable_globale __erreur(83) +# define d_ex_erreur_interne_rplcas __erreur(84) #endif @@ -926,8 +929,8 @@ pid_t debug_fork(); # undef MAX #endif -#define ADR __RPL_ADR -#define ALG __RPL_ALG +#define ADR __RPL_ADR +#define ALG __RPL_ALG #define BIN __RPL_BIN #define CHN __RPL_CHN #define CPL __RPL_CPL @@ -946,13 +949,14 @@ pid_t debug_fork(); #define RPN __RPL_RPN #define SCK __RPL_SCK #define SLB __RPL_SLB -#define SPH __RPL_SPH +#define SPH __RPL_SPH #define SQL __RPL_SQL -#define TBL __RPL_TBL +#define TBL __RPL_TBL #define VCX __RPL_VCX #define VIN __RPL_VIN #define VRL __RPL_VRL +enum t_rplcas_commandes { RPLCAS_INTEGRATION = 0, RPLCAS_LIMITE }; enum t_type { ADR = 0, ALG, BIN, CHN, CPL, FCH, FCT, INT, LST, MCX, MIN, MRL, MTX, NOM, NON, PRC, REL, RPN, SCK, @@ -1340,6 +1344,7 @@ typedef struct descripteur_thread pthread_t thread_pere; pthread_mutex_t mutex; + pthread_mutex_t mutex_nombre_references; volatile logical1 thread_actif; @@ -1358,9 +1363,6 @@ typedef struct descripteur_thread logical1 processus_detache; logical1 destruction_objet; - sigset_t oldset; - sigset_t set; - volatile signed long nombre_references; } struct_descripteur_thread; @@ -1650,6 +1652,68 @@ typedef struct rpl_arguments void *s_etat_processus; } struct_rpl_arguments; +/* +-------------------------------------------------------------------------------- + Structure d'arbre des instructions intrinsèques +-------------------------------------------------------------------------------- +*/ + +#ifndef RPLARGS +typedef struct instruction +{ + struct instruction **noeuds; + void (*feuille)(struct processus *); +} struct_instruction; +#endif + +/* +-------------------------------------------------------------------------------- + Structure d'arbre des variables variable globales et locales +-------------------------------------------------------------------------------- +*/ + +#ifndef RPLARGS +typedef struct arbre_variables +{ + unsigned int noeuds_utilises; + signed int indice_tableau_pere; + struct arbre_variables *noeud_pere; + struct arbre_variables **noeuds; + struct liste_variables *feuille; +} struct_arbre_variables; + +typedef struct tableau_variables +{ + unsigned char origine; + unsigned char *nom; // pointeur sur la struct_variable + // réelle et non copie de la chaîne + unsigned long niveau; + + struct_objet *objet; // pointeur sur l'objet et non copie + // de l'objet. + + logical1 variable_verrouillee; + union_position_variable variable_statique; + union_position_variable variable_partagee; +} struct_tableau_variables; + +typedef struct liste_variables +{ + union + { + // Utilisation dans la gestion des variables + struct_variable *variable; + // Utilisation dans la pile système (variables par niveau) + struct_liste_chainee *liste; + }; + + struct arbre_variables *noeud_pere; + struct arbre_variables *noeud; + struct liste_variables *suivant; + struct liste_variables *precedent; +} struct_liste_variables; + +#endif /* -------------------------------------------------------------------------------- @@ -1687,6 +1751,7 @@ typedef struct processus unsigned char mode_interactif; /*Y/N*/ unsigned char mode_evaluation_expression; /*Y/N*/ unsigned char traitement_cycle_exit; /*N/E/C*/ + unsigned char recherche_type; /*Y/N*/ unsigned long position_courante; unsigned long longueur_definitions_chainees; @@ -1695,7 +1760,7 @@ typedef struct processus int *pointeurs_caracteres; int nombre_caracteres; - struct instruction *arbre_instructions; + struct_instruction *arbre_instructions; /* Requetes */ @@ -1740,7 +1805,7 @@ typedef struct processus # if !defined(Cygwin) # if !(OpenBSD) - stack_t pile_signal; + stack_t pile_signal; # else # ifdef SA_ONSTACK # undef SA_ONSTACK @@ -1748,10 +1813,16 @@ typedef struct processus # define SA_ONSTACK 0 # endif # else -# define SA_ONSTACK 0 -# define RTLD_LOCAL 0 +# define SA_ONSTACK 0 +# define RTLD_LOCAL 0 # endif + volatile int pointeur_signal_ecriture; + volatile int pointeur_signal_lecture; + volatile enum signaux_rpl signaux_en_queue[LONGUEUR_QUEUE_SIGNAUX]; + volatile logical1 demarrage_fils; + volatile logical1 redemarrage_processus; + /* Contextes */ struct_liste_chainee *l_base_pile_contextes; @@ -1759,9 +1830,25 @@ typedef struct processus /* Variables */ - struct_variable *s_liste_variables; - unsigned long nombre_variables; - unsigned long nombre_variables_allouees; + // 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 + // sur la liste des variables globales. + // + // À l'initialisation : + // l_liste_variables_par_niveau->suivant == l_liste_variables_par_niveau + // l_liste_variables_par_niveau->precedent == l_liste_variables_par_niveau + + struct_arbre_variables *s_arbre_variables; + struct_liste_variables *l_liste_variables_par_niveau; + logical1 niveau_supprime; + + struct_variable *pointeur_variable_courante; + struct_liste_variables *pointeur_feuille_courante; + + int *pointeurs_caracteres_variables; + int nombre_caracteres_variables; struct_variable_statique *s_liste_variables_statiques; unsigned long nombre_variables_statiques; @@ -1772,7 +1859,6 @@ typedef struct processus unsigned long niveau_courant; unsigned long niveau_initial; - unsigned long position_variable_courante; unsigned long position_variable_statique_courante; logical1 creation_variables_statiques; @@ -1951,6 +2037,7 @@ typedef struct processus /* Traitement des erreurs */ + unsigned int compteur_violation_d_acces; unsigned int erreur_compilation; unsigned int erreur_execution; unsigned int erreur_systeme; @@ -2023,6 +2110,7 @@ typedef struct processus volatile sig_atomic_t var_volatile_traitement_retarde_stop; volatile sig_atomic_t var_volatile_traitement_sigint; + volatile sig_atomic_t var_volatile_processus_racine; volatile sig_atomic_t var_volatile_processus_pere; volatile sig_atomic_t var_volatile_recursivite; @@ -2037,6 +2125,8 @@ typedef struct processus gsl_rng *generateur_aleatoire; const gsl_rng_type *type_generateur_aleatoire; + void *contexte_cas; + integer8 nombre_arguments; /* @@ -2074,12 +2164,8 @@ typedef struct processus pthread_mutex_t mutex; pthread_mutex_t mutex_allocation; - // Sémaphore autorisant les fork() - sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_fork; + // Mutex autorisant les fork() + pthread_mutex_t mutex_fork; /* Mutexes */ @@ -2099,11 +2185,7 @@ typedef struct processus unsigned long taille_pile_objets; struct_objet *pile_objets; -# ifndef DEBUG_MALLOC -# define TAILLE_CACHE 16384 -# else -# define TAILLE_CACHE 4 -# endif +# define TAILLE_CACHE 16384 unsigned long *objets_adr[TAILLE_CACHE]; int pointeur_adr; @@ -2137,23 +2219,20 @@ typedef struct processus struct_liste_chainee *maillons[TAILLE_CACHE]; int pointeur_maillons; -} struct_processus; -#endif -/* --------------------------------------------------------------------------------- - Structures instruction intrinsèque --------------------------------------------------------------------------------- -*/ + struct_arbre_variables *variables_noeud[TAILLE_CACHE]; + int pointeur_variables_noeud; -#ifndef RPLARGS -typedef struct instruction -{ - struct instruction **noeud; - void (*feuille)(struct_processus *); -} struct_instruction; -#endif + struct_liste_variables *variables_feuille[TAILLE_CACHE]; + int pointeur_variables_feuille; + struct_variable *variables_variable[TAILLE_CACHE]; + int pointeur_variables_variable; + + struct_arbre_variables **variables_tableau_noeuds[TAILLE_CACHE]; + int pointeur_variables_tableau_noeuds; +} struct_processus; +#endif /* -------------------------------------------------------------------------------- @@ -2190,6 +2269,7 @@ typedef struct fonction // BEGIN C PROTOTYPES void instruction_sensible_e(struct_processus *s_etat_processus); void instruction_sensible_i(struct_processus *s_etat_processus); +void instruction_sensible_infinity(struct_processus *s_etat_processus); void instruction_abort(struct_processus *s_etat_processus); void instruction_abs(struct_processus *s_etat_processus); @@ -2386,6 +2466,7 @@ void instruction_in(struct_processus *s_ void instruction_incr(struct_processus *s_etat_processus); void instruction_indep(struct_processus *s_etat_processus); void instruction_input(struct_processus *s_etat_processus); +void instruction_infinity(struct_processus *s_etat_processus); void instruction_inquire(struct_processus *s_etat_processus); void instruction_int(struct_processus *s_etat_processus); void instruction_interrupt(struct_processus *s_etat_processus); @@ -2409,6 +2490,7 @@ void instruction_lcd_fleche(struct_proce void instruction_lchol(struct_processus *s_etat_processus); void instruction_le(struct_processus *s_etat_processus); void instruction_legv(struct_processus *s_etat_processus); +void instruction_limit(struct_processus *s_etat_processus); void instruction_line(struct_processus *s_etat_processus); void instruction_list_fleche(struct_processus *s_etat_processus); void instruction_ln(struct_processus *s_etat_processus); @@ -2422,6 +2504,7 @@ void instruction_lq(struct_processus *s_ void instruction_lsq(struct_processus *s_etat_processus); void instruction_lt(struct_processus *s_etat_processus); void instruction_lu(struct_processus *s_etat_processus); +void instruction_l_vers_t(struct_processus *s_etat_processus); void instruction_mant(struct_processus *s_etat_processus); void instruction_mark(struct_processus *s_etat_processus); @@ -2600,6 +2683,7 @@ void instruction_sqlquery(struct_process void instruction_sqrt(struct_processus *s_etat_processus); void instruction_sr(struct_processus *s_etat_processus); void instruction_srb(struct_processus *s_etat_processus); +void instruction_srev(struct_processus *s_etat_processus); void instruction_sst(struct_processus *s_etat_processus); void instruction_star_d(struct_processus *s_etat_processus); void instruction_star_h(struct_processus *s_etat_processus); @@ -2657,10 +2741,10 @@ void instruction_trn(struct_processus *s void instruction_trnc(struct_processus *s_etat_processus); void instruction_true(struct_processus *s_etat_processus); void instruction_type(struct_processus *s_etat_processus); +void instruction_t_vers_l(struct_processus *s_etat_processus); void instruction_ucase(struct_processus *s_etat_processus); void instruction_uchol(struct_processus *s_etat_processus); -void instruction_undo(struct_processus *s_etat_processus); void instruction_unlock(struct_processus *s_etat_processus); void instruction_unprotect(struct_processus *s_etat_processus); void instruction_until(struct_processus *s_etat_processus); @@ -2715,7 +2799,6 @@ void affichage_pile(struct_processus *s_ niveau_courant); #endif -void *allocation(struct_processus *s_etat_processus, enum t_type type); void *allocation_maillon(struct_processus *s_etat_processus); #ifndef RPLARGS @@ -2736,6 +2819,8 @@ void conversion_hms_vers_decimal(real8 * void conversion_majuscule_limitee(unsigned char *chaine_entree, unsigned char *chaine_sortie, unsigned long longueur); void conversion_radians_vers_degres(real8 *angle); +void copie_arbre_variables(struct_processus *s_etat_processus, + struct_processus *s_nouvel_etat_processus); void correction_formateur_tex(struct_processus *s_etat_processus, unsigned char **ligne); void depilement_pile_systeme(struct_processus *s_etat_processus); @@ -2775,10 +2860,12 @@ void impression_tex(struct_processus *s_ void informations(struct_processus *s_etat_processus); void initialisation_allocateur(struct_processus *s_etat_processus); void initialisation_completion(void); +void initialisation_contexte_cas(struct_processus *s_etat_processus); void initialisation_drapeaux(struct_processus *s_etat_processus); void initialisation_generateur_aleatoire(struct_processus *s_etat_processus, logical1 initialisation_automatique, unsigned long int racine); void initialisation_instructions(struct_processus *s_etat_processus); +void initialisation_variables(struct_processus *s_etat_processus); #endif void initialisation_objet(struct_objet *s_objet); @@ -2791,17 +2878,13 @@ void insertion_thread_surveillance(struc void integrale_romberg(struct_processus *s_etat_processus, struct_objet *s_expression, unsigned char *variable, real8 a, real8 b, real8 precision); -void interruption1(SIGHANDLER_ARGS); -void interruption2(SIGHANDLER_ARGS); -void interruption3(SIGHANDLER_ARGS); -void interruption4(SIGHANDLER_ARGS); -void interruption5(SIGHANDLER_ARGS); -void interruption6(SIGHANDLER_ARGS); -void interruption7(SIGHANDLER_ARGS); -void interruption8(SIGHANDLER_ARGS); -void interruption9(SIGHANDLER_ARGS); -void interruption10(SIGHANDLER_ARGS); -void interruption11(SIGHANDLER_ARGS); +void interface_cas(struct_processus *s_etat_processus, + enum t_rplcas_commandes commande); +void interruption1(int signal); +void interruption2(int signal); +void interruption3(int signal); +void interruption4(int signal); +void interruption5(int signal); void inversion_matrice(struct_processus *s_etat_processus, struct_matrice *s_matrice); void lancement_daemon(struct_processus *s_etat_processus); @@ -2816,6 +2899,9 @@ void liberation_maillon(struct_processus void liberation_allocateur(struct_processus *s_etat_processus); void liberation_arbre_instructions(struct_processus *s_etat_processus, struct_instruction *arbre); +void liberation_arbre_variables(struct_processus *s_etat_processus, + struct_arbre_variables *arbre, logical1 definitions); +void liberation_contexte_cas(struct_processus *s_etat_processus); void liberation_generateur_aleatoire(struct_processus *s_etat_processus); void liberation_threads(struct_processus *s_etat_processus); void liberation_profil(struct_processus *s_etat_processus); @@ -2833,6 +2919,7 @@ void retrait_thread_surveillance(struct_ struct_descripteur_thread *s_argument_thread); void rplcore(struct_processus *s_etat_processus); void scrutation_injection(struct_processus *s_etat_processus); +void scrutation_interruptions(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); @@ -2860,12 +2947,20 @@ void valeurs_singulieres(struct_processu void verrouillage_threads_concurrents(struct_processus *s_etat_processus); #endif +/* +-------------------------------------------------------------------------------- + Fonctions de gestion des signaux +-------------------------------------------------------------------------------- +*/ + #ifndef RPLARGS -#ifdef _BROKEN_SIGINFO -void creation_fifos_signaux(struct_processus *s_etat_processus); -void destruction_fifos_signaux(struct_processus *s_etat_processus); -void liberation_fifos_signaux(struct_processus *s_etat_processus); -#endif +void creation_queue_signaux(struct_processus *s_etat_processus); +void liberation_queue_signaux(struct_processus *s_etat_processus); +void destruction_queue_signaux(struct_processus *s_etat_processus); +int envoi_signal_contexte(struct_processus *s_etat_processus, + enum signaux_rpl signal); +int envoi_signal_processus(pid_t pid, enum signaux_rpl signal); +int envoi_signal_thread(pthread_t tid, enum signaux_rpl signal); #endif /* @@ -2958,6 +3053,8 @@ unsigned char *formateur_fichier(struct_ struct_objet *s_objet, struct_objet *s_format, long longueur, long longueur_champ, unsigned char format, unsigned char type, long *longueur_effective, long *recursivite); +unsigned char *formateur_flux(struct_processus *s_etat_processus, + unsigned char *donnees, long *longueur); unsigned char *formateur_fichier_nombre(struct_processus *s_etat_processus, void *valeur_numerique, unsigned char type, long longueur, long longueur_champ, unsigned char format); @@ -3042,6 +3139,8 @@ logical1 ecriture_pipe(struct_processus struct_objet *s_objet); logical1 recherche_variable(struct_processus *s_etat_processus, 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); @@ -3074,6 +3173,11 @@ ssize_t write_atomic(struct_processus *s */ int alsprintf(unsigned char **strp, const char *fmt, ...); +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); int tex_fprintf(struct_processus *s_etat_processus, file *flux, const char *format, ...); int transliterated_fprintf(struct_processus *s_etat_processus, file *flux, @@ -3156,6 +3260,7 @@ struct_objet *copie_objet(struct_process struct_objet *s_objet, unsigned char type); #ifndef RPLARGS +struct_objet *allocation(struct_processus *s_etat_processus, enum t_type type); struct_objet *formateur_date(struct_processus *s_etat_processus, struct timeval *temps); struct_objet *lecture_pipe(struct_processus *s_etat_processus, int pipe);