version 1.115, 2011/09/03 10:31:51
|
version 1.132, 2011/09/21 09:09:22
|
Line 25
|
Line 25
|
|
|
#ifndef __RPLCAS |
#ifndef __RPLCAS |
# define _GNU_SOURCE |
# define _GNU_SOURCE |
# define _POSIX_C_SOURCE 200112L |
# define _XOPEN_SOURCE 700 |
#endif |
#endif |
|
|
#define _REENTRANT |
#define _REENTRANT |
Line 99
|
Line 99
|
# endif |
# endif |
|
|
# include <pwd.h> |
# include <pwd.h> |
|
# include <sys/shm.h> |
# ifdef _BROKEN_SIGINFO |
|
# include <sys/ipc.h> |
|
# include <sys/shm.h> |
|
# endif |
|
|
|
# ifndef IPCS_SYSV |
# ifndef IPCS_SYSV |
# include <semaphore.h> |
# include <semaphore.h> |
Line 126
|
Line 122
|
ULONG *nopened; |
ULONG *nopened; |
ULONG allocated; |
ULONG allocated; |
} sem_t; |
} sem_t; |
# else |
# else // IPCS_SYSV |
typedef struct |
typedef struct |
{ |
{ |
int sem; |
int sem; |
|
int alloue; |
unsigned char *path; |
unsigned char *path; |
pid_t pid; |
pid_t pid; |
|
pthread_t tid; |
} sem_t; |
} sem_t; |
# endif |
# endif |
|
|
# define SEM_FAILED NULL |
# ifndef SEM_FAILED |
|
# define SEM_FAILED NULL |
|
# endif |
|
|
sem_t *sem_open_SysV(const char *nom, int oflag, ...); |
sem_t *sem_open_SysV(const char *nom, int oflag, ...); |
int sem_init_SysV(sem_t *sem, int shared, unsigned int value); |
int sem_init_SysV(sem_t *sem, int shared, unsigned int value); |
Line 162
|
Line 162
|
|
|
# include "openssl/evp.h" |
# include "openssl/evp.h" |
# include "sqlite3.h" |
# include "sqlite3.h" |
|
# include "sigsegv.h" |
|
|
# define HAVE_INLINE |
# define HAVE_INLINE |
# define GSL_RANGE_CHECK_OFF |
# define GSL_RANGE_CHECK_OFF |
Line 213
|
Line 214
|
================================================================================ |
================================================================================ |
*/ |
*/ |
|
|
#ifdef _BROKEN_SIGINFO |
enum signaux_rpl |
# define SIGHANDLER_ARGS int signal |
{ |
# ifdef SA_SIGINFO |
rpl_signull = 0, |
# undef SA_SIGINFO |
rpl_sigint, |
# endif |
rpl_sigterm, |
# define SA_SIGINFO 0 |
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 |
|
}; |
|
|
# ifndef __BROKEN_SIGINFO_ROUTINES__ |
#define LONGUEUR_QUEUE_SIGNAUX 1024 |
|
|
// pthread_kill() est une macro sous OS/2. |
// Une structure s_queue_signaux est créée par processus (et non par thread). |
# ifdef pthread_kill |
// Elle est projetée dans un segment de mémoire partagée pour qu'elle soit |
# undef pthread_kill |
// accessible à la fois du père et des fils. |
# endif |
|
|
|
# define kill(a, b) kill_broken_siginfo(a, b) |
typedef struct queue_signaux |
# define pthread_kill(a, b) pthread_kill_broken_siginfo(a, b) |
{ |
|
# ifndef IPCS_SYSV |
|
# ifndef SEMAPHORES_NOMMES |
|
sem_t semaphore; |
|
# endif |
|
# else |
|
sem_t semaphore; |
# endif |
# endif |
|
|
int kill_broken_siginfo(pid_t pid, int signal); |
volatile int pointeur_lecture; |
int pthread_kill_broken_siginfo(pthread_t tid, int signal); |
volatile int pointeur_ecriture; |
pid_t origine_signal(int signal); |
|
int queue_in(pid_t pid, int signal); |
volatile struct |
#else |
{ |
# define SIGHANDLER_ARGS int signal, siginfo_t *siginfo, void *context |
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; |
|
# 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 |
#endif |
|
|
#ifdef OpenBSD |
#ifdef OpenBSD |
Line 261 union semun
|
Line 300 union semun
|
}; |
}; |
#endif |
#endif |
|
|
|
#ifndef RTLD_LOCAL |
|
# define RTLD_LOCAL 0 |
|
#endif |
|
|
|
#ifndef SIGSTKSZ |
|
# define SIGSTKSZ 65536 |
|
#endif |
|
|
/* |
/* |
================================================================================ |
================================================================================ |
Line 297 union semun
|
Line 343 union semun
|
// SIGPIPE |
// SIGPIPE |
// SIGALRM |
// SIGALRM |
|
|
// Arrêt par STOP |
# define SIGTEST SIGUSR1 |
# 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 |
|
|
|
// Nombre d'interruptions disponibles |
// Nombre d'interruptions disponibles |
# define d_NOMBRE_INTERRUPTIONS 64 |
# define d_NOMBRE_INTERRUPTIONS 64 |
Line 383 typedef unsigned char t_8_bits;
|
Line 411 typedef unsigned char t_8_bits;
|
# endif |
# endif |
|
|
# ifndef MAIN_RPL |
# ifndef MAIN_RPL |
# ifdef _BROKEN_SIGINFO |
extern jmp_buf contexte_ecriture; |
extern int *fifos_signaux; |
extern jmp_buf contexte_impression; |
# endif |
|
|
|
extern jmp_buf contexte; |
|
extern jmp_buf contexte_initial; |
extern jmp_buf contexte_initial; |
extern jmp_buf contexte_processus; |
extern jmp_buf contexte_processus; |
extern jmp_buf contexte_thread; |
extern jmp_buf contexte_thread; |
|
|
# ifdef SEMAPHORES_NOMMES |
extern int signal_test; |
extern pthread_mutex_t mutex_sem; |
|
# endif |
|
|
|
extern pthread_key_t semaphore_fork_processus_courant; |
extern pid_t pid_processus_pere; |
|
|
extern sem_t |
|
# ifdef SEMAPHORES_NOMMES |
# ifdef SEMAPHORES_NOMMES |
* |
extern pthread_mutex_t mutex_sem; |
# endif |
# endif |
semaphore_liste_threads; |
|
|
|
extern sem_t |
extern pthread_mutex_t mutex_liste_threads; |
# ifdef SEMAPHORES_NOMMES |
extern pthread_mutex_t mutex_gestionnaires_signaux_atomique; |
* |
|
# endif |
|
semaphore_gestionnaires_signaux; |
|
|
|
extern sem_t |
extern sem_t |
# ifdef SEMAPHORES_NOMMES |
# ifdef SEMAPHORES_NOMMES |
* |
* |
# endif |
# endif |
semaphore_gestionnaires_signaux_atomique; |
semaphore_gestionnaires_signaux; |
|
|
# ifdef SEMAPHORES_NOMMES |
extern volatile int routine_recursive; |
// 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 |
|
# else |
# else |
# ifdef _BROKEN_SIGINFO |
jmp_buf contexte_ecriture; |
int *fifos_signaux; |
jmp_buf contexte_impression; |
# endif |
|
|
|
jmp_buf contexte; |
|
jmp_buf contexte_initial; |
jmp_buf contexte_initial; |
jmp_buf contexte_processus; |
jmp_buf contexte_processus; |
jmp_buf contexte_thread; |
jmp_buf contexte_thread; |
|
|
# ifdef SEMAPHORES_NOMMES |
int signal_test; |
pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; |
|
# endif |
|
|
|
pthread_key_t semaphore_fork_processus_courant; |
pid_t pid_processus_pere; |
|
|
sem_t |
|
# ifdef SEMAPHORES_NOMMES |
# ifdef SEMAPHORES_NOMMES |
* |
pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; |
# endif |
# endif |
semaphore_liste_threads; |
|
|
|
|
pthread_mutex_t mutex_liste_threads = |
|
PTHREAD_MUTEX_INITIALIZER; |
|
pthread_mutex_t mutex_gestionnaires_signaux = |
|
PTHREAD_MUTEX_INITIALIZER; |
|
pthread_mutex_t mutex_gestionnaires_signaux_atomique = |
|
PTHREAD_MUTEX_INITIALIZER; |
sem_t |
sem_t |
# ifdef SEMAPHORES_NOMMES |
# ifdef SEMAPHORES_NOMMES |
* |
* |
# endif |
# endif |
semaphore_gestionnaires_signaux; |
semaphore_gestionnaires_signaux; |
|
|
sem_t |
volatile int routine_recursive; |
# 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 |
#ifdef SEMAPHORES_NOMMES |
enum t_semaphore { sem_liste_threads = 0, |
#define SEM_FORK 0 |
sem_gestionnaires_signaux = 1, |
#define SEM_QUEUE 1 |
sem_gestionnaires_signaux_atomique = 2, |
#define SEM_SIGNAUX 2 |
sem_fork = 3 }; |
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); |
sem_t *sem_init2(unsigned int valeur, enum t_semaphore semaphore); |
int sem_destroy2(sem_t *semaphore_p, pid_t pid, int ordre); |
int sem_destroy2(sem_t *semaphore_p, enum t_semaphore semaphore); |
int sem_destroy3(sem_t *semaphore_p, pid_t pid, pthread_t tid, int ordre); |
int sem_getvalue2(sem_t *semaphore, int *valeur); |
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_getvalue(semaphore, value) sem_getvalue2(semaphore, value) |
#define sem_post(semaphore) \ |
#define sem_post(semaphore) \ |
Line 505 int sem_getvalue2(sem_t *semaphore, int
|
Line 511 int sem_getvalue2(sem_t *semaphore, int
|
#define ufprintf(flux, ...) transliterated_fprintf(NULL, \ |
#define ufprintf(flux, ...) transliterated_fprintf(NULL, \ |
flux, __VA_ARGS__) |
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 |
#ifdef SunOS |
# define fopen(...) ({ FILE *desc; \ |
# define fopen(...) ({ FILE *desc; \ |
while((desc = fopen(__VA_ARGS__)) == NULL) \ |
while((desc = fopen(__VA_ARGS__)) == NULL) \ |
Line 1392 typedef struct descripteur_thread
|
Line 1394 typedef struct descripteur_thread
|
logical1 processus_detache; |
logical1 processus_detache; |
logical1 destruction_objet; |
logical1 destruction_objet; |
|
|
sigset_t oldset; |
|
sigset_t set; |
|
|
|
volatile signed long nombre_references; |
volatile signed long nombre_references; |
} struct_descripteur_thread; |
} struct_descripteur_thread; |
|
|
Line 1835 typedef struct processus
|
Line 1834 typedef struct processus
|
pthread_t thread_fusible; |
pthread_t thread_fusible; |
pthread_t thread_surveille_par_fusible; |
pthread_t thread_surveille_par_fusible; |
|
|
# if !defined(Cygwin) |
volatile int pointeur_signal_ecriture; |
# if !(OpenBSD) |
volatile int pointeur_signal_lecture; |
stack_t pile_signal; |
volatile enum signaux_rpl signaux_en_queue[LONGUEUR_QUEUE_SIGNAUX]; |
# else |
volatile logical1 demarrage_fils; |
# ifdef SA_ONSTACK |
volatile logical1 redemarrage_processus; |
# undef SA_ONSTACK |
|
# endif |
|
# define SA_ONSTACK 0 |
|
# endif |
|
# else |
|
# define SA_ONSTACK 0 |
|
# define RTLD_LOCAL 0 |
|
# endif |
|
|
|
/* Contextes */ |
/* Contextes */ |
|
|
Line 2063 typedef struct processus
|
Line 2054 typedef struct processus
|
|
|
/* Traitement des erreurs */ |
/* Traitement des erreurs */ |
|
|
unsigned int compteur_violation_d_acces; |
|
unsigned int erreur_compilation; |
unsigned int erreur_compilation; |
unsigned int erreur_execution; |
unsigned int erreur_execution; |
unsigned int erreur_systeme; |
unsigned int erreur_systeme; |
Line 2190 typedef struct processus
|
Line 2180 typedef struct processus
|
pthread_mutex_t mutex; |
pthread_mutex_t mutex; |
pthread_mutex_t mutex_allocation; |
pthread_mutex_t mutex_allocation; |
|
|
// Sémaphore autorisant les fork() |
// Mutex autorisant les fork() |
sem_t |
sem_t |
# ifdef SEMAPHORES_NOMMES |
# ifdef SEMAPHORES_NOMMES |
* |
* |
# endif |
# endif |
semaphore_fork; |
semaphore_fork; |
|
|
/* Mutexes */ |
/* Mutexes */ |
|
|
Line 2910 void integrale_romberg(struct_processus
|
Line 2900 void integrale_romberg(struct_processus
|
real8 a, real8 b, real8 precision); |
real8 a, real8 b, real8 precision); |
void interface_cas(struct_processus *s_etat_processus, |
void interface_cas(struct_processus *s_etat_processus, |
enum t_rplcas_commandes commande); |
enum t_rplcas_commandes commande); |
void interruption1(SIGHANDLER_ARGS); |
void interruption1(int signal); |
void interruption2(SIGHANDLER_ARGS); |
void interruption2(int signal); |
void interruption3(SIGHANDLER_ARGS); |
void interruption3(int signal); |
void interruption4(SIGHANDLER_ARGS); |
void interruption4(int signal); |
void interruption5(SIGHANDLER_ARGS); |
void interruption5(int signal); |
void interruption6(SIGHANDLER_ARGS); |
void interruption_depassement_pile(int urgence, stackoverflow_context_t scp); |
void interruption7(SIGHANDLER_ARGS); |
|
void interruption8(SIGHANDLER_ARGS); |
|
void interruption9(SIGHANDLER_ARGS); |
|
void interruption10(SIGHANDLER_ARGS); |
|
void interruption11(SIGHANDLER_ARGS); |
|
void inversion_matrice(struct_processus *s_etat_processus, |
void inversion_matrice(struct_processus *s_etat_processus, |
struct_matrice *s_matrice); |
struct_matrice *s_matrice); |
void lancement_daemon(struct_processus *s_etat_processus); |
void lancement_daemon(struct_processus *s_etat_processus); |
Line 2955 void retrait_thread_surveillance(struct_
|
Line 2940 void retrait_thread_surveillance(struct_
|
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); |
void scrutation_injection(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 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 2982 void valeurs_singulieres(struct_processu
|
Line 2968 void valeurs_singulieres(struct_processu
|
void verrouillage_threads_concurrents(struct_processus *s_etat_processus); |
void verrouillage_threads_concurrents(struct_processus *s_etat_processus); |
#endif |
#endif |
|
|
|
/* |
|
-------------------------------------------------------------------------------- |
|
Fonctions de gestion des signaux |
|
-------------------------------------------------------------------------------- |
|
*/ |
|
|
#ifndef RPLARGS |
#ifndef RPLARGS |
#ifdef _BROKEN_SIGINFO |
void creation_queue_signaux(struct_processus *s_etat_processus); |
void creation_fifos_signaux(struct_processus *s_etat_processus); |
void liberation_queue_signaux(struct_processus *s_etat_processus); |
void destruction_fifos_signaux(struct_processus *s_etat_processus); |
void destruction_queue_signaux(struct_processus *s_etat_processus); |
void liberation_fifos_signaux(struct_processus *s_etat_processus); |
int envoi_signal_contexte(struct_processus *s_etat_processus, |
#endif |
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 |
#endif |
|
|
/* |
/* |
Line 3200 ssize_t write_atomic(struct_processus *s
|
Line 3194 ssize_t write_atomic(struct_processus *s
|
*/ |
*/ |
|
|
int alsprintf(unsigned char **strp, const char *fmt, ...); |
int alsprintf(unsigned char **strp, const char *fmt, ...); |
|
int interruption_violation_access(void *adresse_fautive, int gravite); |
int liste_variables(struct_processus *s_etat_processus, |
int liste_variables(struct_processus *s_etat_processus, |
struct_tableau_variables *tableau, int position, |
struct_tableau_variables *tableau, int position, |
struct_arbre_variables *l_element_courant); |
struct_arbre_variables *l_element_courant); |