--- rpl/src/rpl.h 2010/08/15 14:46:25 1.56 +++ rpl/src/rpl.h 2010/08/17 11:59:28 1.57 @@ -23,6 +23,9 @@ #ifndef INCLUSION_RPL #define INCLUSION_RPL +#warning rpl.h defines _BROKEN_SIGINFO +#define _BROKEN_SIGINFO + #define _GNU_SOURCE #define _POSIX_C_SOURCE 200112L #define _REENTRANT @@ -48,8 +51,6 @@ # include "getaddrinfo-conv.h" # define sched_yield(arg) -#else -# undef _BROKEN_SIGINFO #endif @@ -95,6 +96,11 @@ # include +# ifdef _BROKEN_SIGINFO +# include +# include +# endif + # ifndef SEMAPHORES_SYSV # include # else @@ -114,6 +120,8 @@ ULONG allocated; } sem_t; # else +# include +# include typedef int sem_t; # endif @@ -187,6 +195,33 @@ # define UNIX_PATH_MAX sizeof(sizecheck.sun_path) #endif +#ifdef _BROKEN_SIGINFO +# define SIGHANDLER_ARGS int signal +# ifdef SA_SIGINFO +# undef SA_SIGINFO +# endif +# define SA_SIGINFO 0 + +# define kill(pid, signal) rpl_kill(pid, signal) +# define pthread_kill(tid, signal) rpl_pthread_kill(tid, signal) + int rpl_kill(pid_t pid, int signal); + int rpl_pthread_kill(pthread_t tid, int signal); +#else +# define SIGHANDLER_ARGS int signal, siginfo_t *siginfo, void *context +#endif + +#define ftok(path, proj) \ + ({ \ + key_t key; \ + struct stat s; \ + while(stat(path, &s) != 0); \ + errno = 0; \ + key = ftok(path, proj); \ + if (key != -1) \ + key |= ((((key_t) s.st_dev) & 0xFF) << 8) | \ + ((((key_t) s.st_ino) & 0xFFFF) << 16); \ + key; \ + }) /* ================================================================================ @@ -214,9 +249,14 @@ */ #ifndef RPLARGS -# if defined(Darwin) || defined(OpenBSD) -# define SIGPOLL SIGINFO -# endif + +// Signaux utilisés par défaut : +// SIGINT +// SIGTSTP +// SIGCONT +// SIGURG +// SIGPIPE +// SIGALRM // Arrêt par STOP # define SIGFSTOP SIGUSR1 @@ -225,9 +265,19 @@ // Injection de données # define SIGINJECT SIGQUIT // Arrêt général -# define SIGABORT SIGPROF +# 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 -# define SIGFABORT SIGPOLL +# if defined(Darwin) || defined(OpenBSD) +# define SIGFABORT SIGINFO +# else +# define SIGFABORT SIGPOLL +# endif + // Nombre d'interruptions disponibles # define d_NOMBRE_INTERRUPTIONS 64 #endif @@ -292,7 +342,12 @@ typedef unsigned char t_8_bits; # ifdef SEMAPHORES_NOMMES # define LONGUEUR_NOM_SEMAPHORE 64 # endif + # ifndef MAIN_RPL +# ifdef _BROKEN_SIGINFO + extern int *fifos_signaux; +# endif + extern jmp_buf contexte; extern jmp_buf contexte_initial; @@ -329,6 +384,10 @@ typedef unsigned char t_8_bits; extern sem_t *semaphores_nommes[4]; # endif # else +# ifdef _BROKEN_SIGINFO + int *fifos_signaux; +# endif + jmp_buf contexte; jmp_buf contexte_initial; @@ -657,7 +716,7 @@ pid_t debug_fork(); # define __erreur(i) i # else # define __erreur(i) ({ if (strstr(__FUNCTION__, "recherche_variable") \ - == NULL) fprintf(stderr, "ERROR %d AT %s() LINE %d\n", \ + == NULL) ufprintf(stderr, "ERROR %d AT %s() LINE %d\n", \ i, __FUNCTION__, __LINE__); i; }) # endif #else @@ -2706,17 +2765,17 @@ 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(int signal, siginfo_t *siginfo, void *context); -void interruption2(int signal, siginfo_t *siginfo, void *context); -void interruption3(int signal, siginfo_t *siginfo, void *context); -void interruption4(int signal, siginfo_t *siginfo, void *context); -void interruption5(int signal, siginfo_t *siginfo, void *context); -void interruption6(int signal, siginfo_t *siginfo, void *context); -void interruption7(int signal, siginfo_t *siginfo, void *context); -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 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 inversion_matrice(struct_processus *s_etat_processus, struct_matrice *s_matrice); void lancement_daemon(struct_processus *s_etat_processus); @@ -2775,6 +2834,14 @@ void valeurs_singulieres(struct_processu void verrouillage_threads_concurrents(struct_processus *s_etat_processus); #endif +#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 +#endif + /* -------------------------------------------------------------------------------- Fonctions de sommation de vecteur dans perte de précision