--- rpl/src/rpl.h 2010/08/13 21:00:37 1.55 +++ rpl/src/rpl.h 2010/08/18 12:56:55 1.59 @@ -31,10 +31,13 @@ # define _DARWIN_C_SOURCE #endif +#ifdef OpenBSD +# define _BSD_SOURCE +#endif + #ifdef OS2 # define _BSD_SOURCE # define _XOPEN_SOURCE 600 -# define _BROKEN_SIGINFO # include enum { SHUT_RD = 0, SHUT_WR, SHUT_RDWR }; @@ -45,8 +48,6 @@ # include "getaddrinfo-conv.h" # define sched_yield(arg) -#else -# undef _BROKEN_SIGINFO #endif @@ -67,11 +68,11 @@ #ifndef RPLARGS # include +# include # include # include # include # include -# include # include # include # include @@ -92,6 +93,11 @@ # include +# ifdef _BROKEN_SIGINFO +# include +# include +# endif + # ifndef SEMAPHORES_SYSV # include # else @@ -111,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 @@ -179,6 +192,38 @@ #include "librplprototypes.h" +#ifndef UNIX_PATH_MAX + struct sockaddr_un sizecheck; +# 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; \ + }) /* ================================================================================ @@ -206,9 +251,14 @@ */ #ifndef RPLARGS -# if defined(Darwin) -# define SIGPOLL SIGINFO -# endif + +// Signaux utilisés par défaut : +// SIGINT +// SIGTSTP +// SIGCONT +// SIGURG +// SIGPIPE +// SIGALRM // Arrêt par STOP # define SIGFSTOP SIGUSR1 @@ -217,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 @@ -284,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; @@ -321,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; @@ -647,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 @@ -661,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) @@ -739,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) @@ -1646,7 +1723,14 @@ typedef struct processus 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 @@ -2691,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); @@ -2760,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