--- rpl/src/rpl.h 2010/08/15 14:46:25 1.56 +++ rpl/src/rpl.h 2010/08/18 12:56:55 1.59 @@ -48,8 +48,6 @@ # include "getaddrinfo-conv.h" # define sched_yield(arg) -#else -# undef _BROKEN_SIGINFO #endif @@ -95,6 +93,11 @@ # include +# ifdef _BROKEN_SIGINFO +# include +# include +# endif + # ifndef SEMAPHORES_SYSV # include # else @@ -114,7 +117,14 @@ ULONG allocated; } sem_t; # else - typedef int sem_t; +# include +# include + typedef struct + { + int sem; + unsigned char *path; + pid_t pid; + } sem_t; # endif # define SEM_FAILED NULL @@ -187,6 +197,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 +251,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 +267,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 +344,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 +386,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; @@ -655,13 +716,21 @@ pid_t debug_fork(); #ifdef DEBUG_ERREURS # ifdef MESSAGES # define __erreur(i) i +# define __erreur_(i) i # else +# undef _ERREURS_VARIABLES +# ifdef _ERREURS_VARIABLES +# define __erreur_(i) __erreur(i) +# else +# define __erreur_(i) i +# endif # 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 # define __erreur(i) i +# define __erreur_(i) i #endif @@ -669,7 +738,7 @@ pid_t debug_fork(); #ifndef RPLARGS # define d_es 2000 # define d_es_allocation_memoire __erreur(2001) -# define d_es_variable_introuvable __erreur(2002) +# define d_es_variable_introuvable __erreur_(2002) # define d_es_pile_vide __erreur(2003) # define d_es_end_incoherent __erreur(2004) # define d_es_peripherique_stdin __erreur(2005) @@ -747,7 +816,7 @@ pid_t debug_fork(); # define d_ex_absence_graphique_courant __erreur(9) # define d_ex_erreur_traitement_condition __erreur(10) # define d_ex_erreur_traitement_boucle __erreur(11) -# define d_ex_variable_non_definie __erreur(12) +# define d_ex_variable_non_definie __erreur_(12) # define d_ex_drapeau_inexistant __erreur(13) # define d_ex_nom_invalide __erreur(14) # define d_ex_element_inexistant __erreur(15) @@ -2706,17 +2775,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 +2844,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