--- rpl/src/rpl.h 2011/09/16 14:42:03 1.124 +++ rpl/src/rpl.h 2011/10/21 11:38:38 1.137 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.3 + RPL/2 (R) version 4.1.4 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -43,7 +43,6 @@ #ifdef OS2 # ifndef __RPLCAS # define _BSD_SOURCE -# define _XOPEN_SOURCE 600 # endif # include @@ -99,7 +98,9 @@ # endif # include -# include +# ifdef SHARED_MEMORY +# include +# endif # ifndef IPCS_SYSV # include @@ -122,16 +123,20 @@ ULONG *nopened; ULONG allocated; } sem_t; -# else +# else // IPCS_SYSV typedef struct { int sem; + int alloue; unsigned char *path; pid_t pid; + pthread_t tid; } sem_t; # endif -# define SEM_FAILED NULL +# ifndef SEM_FAILED +# define SEM_FAILED NULL +# endif sem_t *sem_open_SysV(const char *nom, int oflag, ...); int sem_init_SysV(sem_t *sem, int shared, unsigned int value); @@ -158,6 +163,11 @@ # include "openssl/evp.h" # include "sqlite3.h" +# include "sigsegv.h" +# ifdef OS2 + // Bug de libsigsegv +# undef HAVE_STACK_OVERFLOW_RECOVERY +# endif # define HAVE_INLINE # define GSL_RANGE_CHECK_OFF @@ -237,13 +247,16 @@ enum signaux_rpl // 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 { - sem_t -# ifdef SEMAPHORES_NOMMES - * +# ifndef IPCS_SYSV +# ifndef SEMAPHORES_NOMMES + sem_t semaphore; +# endif +# else + sem_t semaphore; # endif - semaphore; volatile int pointeur_lecture; volatile int pointeur_ecriture; @@ -255,23 +268,21 @@ typedef struct queue_signaux } queue[LONGUEUR_QUEUE_SIGNAUX]; } struct_queue_signaux; -#ifndef RPLARGS # 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 # endif #endif -#ifdef OpenBSD -# ifdef PTHREAD_SCOPE_SYSTEM -# undef PTHREAD_SCOPE_SYSTEM -# endif -# define PTHREAD_SCOPE_SYSTEM 0 -#endif - #ifdef OS2 # define readline(s) readline_wrapper(s) unsigned char *readline_wrapper(unsigned char *s); @@ -287,6 +298,13 @@ union semun }; #endif +#ifndef RTLD_LOCAL +# define RTLD_LOCAL 0 +#endif + +#ifndef SIGSTKSZ +# define SIGSTKSZ 65536 +#endif /* ================================================================================ @@ -391,7 +409,8 @@ typedef unsigned char t_8_bits; # endif # ifndef MAIN_RPL - extern jmp_buf contexte; + 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; @@ -412,8 +431,11 @@ typedef unsigned char t_8_bits; * # endif semaphore_gestionnaires_signaux; + + extern volatile int routine_recursive; # else - jmp_buf contexte; + jmp_buf contexte_ecriture; + jmp_buf contexte_impression; jmp_buf contexte_initial; jmp_buf contexte_processus; jmp_buf contexte_thread; @@ -428,7 +450,7 @@ typedef unsigned char t_8_bits; pthread_mutex_t mutex_liste_threads = PTHREAD_MUTEX_INITIALIZER; - pthread_mutex_t mutex_gestiionnaires_signaux = + pthread_mutex_t mutex_gestionnaires_signaux = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mutex_gestionnaires_signaux_atomique = PTHREAD_MUTEX_INITIALIZER; @@ -437,18 +459,25 @@ typedef unsigned char t_8_bits; * # endif semaphore_gestionnaires_signaux; + + volatile int routine_recursive; # 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); +#define SEM_FORK 0 +#define SEM_QUEUE 1 +#define SEM_SIGNAUX 2 +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); +int sem_destroy3(sem_t *semaphore_p, pid_t pid, pthread_t tid, int ordre); 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 +// cette fonction. #define sem_getvalue(semaphore, value) sem_getvalue2(semaphore, value) #define sem_post(semaphore) \ @@ -1803,20 +1832,6 @@ typedef struct processus pthread_t thread_fusible; pthread_t thread_surveille_par_fusible; -# if !defined(Cygwin) -# if !(OpenBSD) - stack_t pile_signal; -# else -# ifdef SA_ONSTACK -# undef SA_ONSTACK -# endif -# define SA_ONSTACK 0 -# endif -# else -# 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]; @@ -2037,7 +2052,6 @@ typedef struct processus /* Traitement des erreurs */ - unsigned int compteur_violation_d_acces; unsigned int erreur_compilation; unsigned int erreur_execution; unsigned int erreur_systeme; @@ -2165,7 +2179,11 @@ typedef struct processus pthread_mutex_t mutex_allocation; // Mutex autorisant les fork() - pthread_mutex_t mutex_fork; + sem_t +# ifdef SEMAPHORES_NOMMES + * +# endif + semaphore_fork; /* Mutexes */ @@ -2885,6 +2903,7 @@ void interruption2(int signal); void interruption3(int signal); void interruption4(int signal); void interruption5(int signal); +void interruption_depassement_pile(int urgence, stackoverflow_context_t scp); void inversion_matrice(struct_processus *s_etat_processus, struct_matrice *s_matrice); void lancement_daemon(struct_processus *s_etat_processus); @@ -2918,7 +2937,11 @@ void retrait_thread(struct_processus *s_ void retrait_thread_surveillance(struct_processus *s_etat_processus, struct_descripteur_thread *s_argument_thread); void rplcore(struct_processus *s_etat_processus); +#endif + void scrutation_injection(struct_processus *s_etat_processus); + +#ifndef RPLARGS void scrutation_interruptions(struct_processus *s_etat_processus); void sf(struct_processus *s_etat_processus, unsigned char indice_drapeau); void *surveillance_processus(void *argument); @@ -3045,6 +3068,7 @@ unsigned char *compactage(unsigned char unsigned char *conversion_majuscule(unsigned char *chaine); unsigned char *creation_nom_fichier(struct_processus *s_etat_processus, unsigned char *chemin); +unsigned char *date_compilation(); unsigned char *extraction_chaine(unsigned char *chaine, unsigned long i, unsigned long j); unsigned char *formateur(struct_processus *s_etat_processus, long offset, @@ -3173,11 +3197,14 @@ ssize_t write_atomic(struct_processus *s */ int alsprintf(unsigned char **strp, const char *fmt, ...); +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); +#endif int tex_fprintf(struct_processus *s_etat_processus, file *flux, const char *format, ...); int transliterated_fprintf(struct_processus *s_etat_processus, file *flux, @@ -3259,8 +3286,8 @@ struct_descripteur_fichier *descripteur_ struct_objet *copie_objet(struct_processus *s_etat_processus, struct_objet *s_objet, unsigned char type); -#ifndef RPLARGS struct_objet *allocation(struct_processus *s_etat_processus, enum t_type type); +#ifndef RPLARGS struct_objet *formateur_date(struct_processus *s_etat_processus, struct timeval *temps); struct_objet *lecture_pipe(struct_processus *s_etat_processus, int pipe);