--- rpl/src/rpl.h 2013/03/23 16:14:39 1.215 +++ rpl/src/rpl.h 2014/06/16 18:48:22 1.245 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.13 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.18 + Copyright (C) 1989-2014 Dr. BERTRAND Joël This file is part of RPL/2. @@ -56,6 +56,10 @@ # define sched_yield(arg) #endif +#ifdef CYGWIN +# define SA_ONSTACK 0 +#endif + /* ================================================================================ @@ -73,6 +77,7 @@ #include #include #include +#include #ifndef RPLARGS # include @@ -154,7 +159,6 @@ # endif # include -# include # include # include # include @@ -314,34 +318,32 @@ enum signaux_rpl #ifndef RPLARGS typedef struct queue_signaux { -# ifndef IPCS_SYSV -# ifndef SEMAPHORES_NOMMES - sem_t semaphore; - sem_t signalisation; -# endif -# else - sem_t semaphore; - sem_t signalisation; -# endif - volatile int pointeur_lecture; volatile int pointeur_ecriture; - pthread_t thread_signaux; volatile logical1 requete_arret; + pthread_t thread_signaux; + volatile struct { pid_t pid; enum signaux_rpl signal; } queue[LONGUEUR_QUEUE_SIGNAUX]; + +# ifdef OS2 + sem_t semaphore; + sem_t signalisation; + sem_t arret_signalisation; +# endif } struct_queue_signaux; -__EXTERN__ struct_queue_signaux *s_queue_signaux; -__EXTERN__ int f_queue_signaux; +__EXTERN__ struct_queue_signaux *s_queue_signaux; +__EXTERN__ int f_queue_signaux; -# ifdef SEMAPHORES_NOMMES - __EXTERN__ sem_t *semaphore_queue_signaux; - __EXTERN__ sem_t *semaphore_signalisation; +# ifndef OS2 + __EXTERN__ sem_t *semaphore_queue_signaux; + __EXTERN__ sem_t *semaphore_signalisation; + __EXTERN__ sem_t *semaphore_arret_signalisation; # endif #endif @@ -455,9 +457,6 @@ union semun #ifndef RPLARGS # ifdef SEMAPHORES_NOMMES # define LONGUEUR_NOM_SEMAPHORE 64 -# endif - -# ifdef SEMAPHORES_NOMMES # define __PTR__ * # else # define __PTR__ @@ -473,40 +472,37 @@ union semun __EXTERN__ pid_t pid_processus_pere; -# ifdef SEMAPHORES_NOMMES - __EXTERN__ pthread_mutex_t mutex_sem __STATIC_MUTEX_INITIALIZATION__; -# endif - __EXTERN__ pthread_mutex_t mutex_liste_threads __STATIC_MUTEX_INITIALIZATION__; - __EXTERN__ pthread_mutex_t mutex_gestionnaires_signaux_atomique - __STATIC_MUTEX_INITIALIZATION__; __EXTERN__ pthread_mutex_t mutex_creation_variable_partagee __STATIC_MUTEX_INITIALIZATION__; __EXTERN__ pthread_mutex_t mutex_sections_critiques; __EXTERN__ pthread_mutex_t mutex_liste_variables_partagees; + __EXTERN__ pthread_mutex_t mutex_sem __STATIC_MUTEX_INITIALIZATION__; __EXTERN__ sem_t __PTR__ semaphore_gestionnaires_signaux; __EXTERN__ volatile int routine_recursive; -#endif -#ifdef SEMAPHORES_NOMMES -#define SEM_FORK 0 -#define SEM_QUEUE 1 -#define SEM_SIGNAUX 2 -#define SEM_SIGNALISATION 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); -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); +# define SEM_FORK 0 +# define SEM_QUEUE 1 +# define SEM_SIGNAUX 2 +# define SEM_SIGNALISATION 3 +# define SEM_ARRET_SIGNALISATION 4 + + 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); +#endif // 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. +#ifdef Darwin #define sem_getvalue(semaphore, value) sem_getvalue2(semaphore, value) #define sem_post(semaphore) \ ({ int r; pthread_mutex_lock(&mutex_sem); \ @@ -1460,8 +1456,10 @@ typedef struct descripteur_thread int pipe_injections[2]; int pipe_nombre_injections[2]; int pipe_interruptions[2]; - int pipe_nombre_objets_attente[2]; - int pipe_nombre_interruptions_attente[2]; + // pipe_nombre_elements_attente == 0 => initialisation ou terminaison + // pipe_nombre_elements_attente == 1 => objet en attente + // pipe_nombre_elements_attente == 2 => interruption en attente + int pipe_nombre_elements_attente[2]; int pipe_acquittement[2]; volatile integer8 nombre_objets_dans_pipe; @@ -1945,8 +1943,7 @@ typedef struct processus int pipe_injections; int pipe_nombre_injections; int pipe_interruptions; - int pipe_nombre_objets_attente; - int pipe_nombre_interruptions_attente; + int pipe_nombre_elements_attente; int nombre_objets_envoyes_non_lus; int nombre_objets_injectes; @@ -2182,8 +2179,8 @@ typedef struct processus /* Traitement des erreurs */ int erreur_compilation; - int erreur_execution; - int erreur_systeme; + volatile int erreur_execution; + volatile int erreur_systeme; struct_objet *s_objet_errone; struct_objet *s_objet_erreur; @@ -2304,9 +2301,10 @@ typedef struct processus struct_liste_profilage2 *pile_profilage_fonctions; struct timeval horodatage_profilage; - // Mutex spécifique au processus et donnant accès à la pile des processus - pthread_mutex_t mutex; pthread_mutex_t mutex_allocation; + pthread_mutex_t mutex_interruptions; + pthread_mutex_t mutex_pile_processus; + pthread_mutex_t mutex_signaux; // Mutex autorisant les fork() sem_t __PTR__ semaphore_fork; @@ -2317,7 +2315,11 @@ typedef struct processus pthread_mutex_t protection_liste_mutexes; unsigned int sections_critiques; -/* Drapeau nécessaire à RESTART */ +/* Variable d'initialisation pour SCHED */ + + logical1 initialisation_scheduler; + +/* Drapeau nécessaire à RESTART */ volatile logical1 requete_redemarrage; @@ -2792,6 +2794,8 @@ void instruction_return(struct_processus void instruction_revlist(struct_processus *s_etat_processus); void instruction_rewind(struct_processus *s_etat_processus); void instruction_rfuse(struct_processus *s_etat_processus); +void instruction_rgdl(struct_processus *s_etat_processus); +void instruction_rgdr(struct_processus *s_etat_processus); void instruction_rl(struct_processus *s_etat_processus); void instruction_rlb(struct_processus *s_etat_processus); void instruction_rnd(struct_processus *s_etat_processus);