--- rpl/src/rpl.h 2013/09/26 14:46:15 1.231 +++ rpl/src/rpl.h 2014/10/05 19:53:16 1.251 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.16 - Copyright (C) 1989-2013 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.19 + Copyright (C) 1989-2014 Dr. BERTRAND Joël This file is part of RPL/2. @@ -18,7 +18,7 @@ along with RPL/2. If not, write to info@cecill.info. ================================================================================ */ -#define DEBUG_ERREURS + #ifndef INCLUSION_RPL #define INCLUSION_RPL @@ -56,6 +56,10 @@ # define sched_yield(arg) #endif +#ifdef CYGWIN +# define SA_ONSTACK 0 +#endif + /* ================================================================================ @@ -314,37 +318,32 @@ enum signaux_rpl #ifndef RPLARGS typedef struct queue_signaux { -# ifndef IPCS_SYSV -# ifndef SEMAPHORES_NOMMES - sem_t semaphore; - sem_t signalisation; - sem_t arret_signalisation; -# endif -# else - sem_t semaphore; - sem_t signalisation; - sem_t arret_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; - __EXTERN__ sem_t *semaphore_arret_signalisation; +# ifndef OS2 + __EXTERN__ sem_t *semaphore_queue_signaux; + __EXTERN__ sem_t *semaphore_signalisation; + __EXTERN__ sem_t *semaphore_arret_signalisation; # endif #endif @@ -378,16 +377,59 @@ union semun */ #ifdef IPCS_SYSV +# ifdef DEBUG_SEMAPHORES +# define sem_wait(a) ({ int value; sem_getvalue(a, &value); \ + uprintf("[%d-%llu] Semaphore %s (%p) "\ + "waiting at %s() " \ + "line #%d\n", (int) getpid(), (unsigned long long) i\ + pthread_self(), \ + #a, a, __FUNCTION__, __LINE__), fflush(stdout); \ + if (value > 1) BUG(1, uprintf("Value %d\n", value)); \ + sem_wait_SysV(a); }) +# define sem_post(a) ({ int value; sem_getvalue(a, &value); \ + uprintf("[%d-%llu] Semaphore %s (%p) "\ + "posting at %s() " \ + "line #%d\n", (int) getpid(), (unsigned long long) \ + pthread_self(), \ + #a, a, __FUNCTION__, __LINE__), fflush(stdout); \ + if (value > 0) BUG(1, uprintf("Value %d\n", value)); \ + sem_post_SysV(a); }) +# define sem_destroy(a) ({ int value; sem_getvalue(a, &value); \ + if (value == 0) BUG(1, uprintf("Value %d\n", value)); \ + sem_destroy_SysV(a); }) +# else +# define sem_destroy(a) sem_destroy_SysV(a) +# define sem_wait(a) sem_wait_SysV(a) +# define sem_post(a) sem_post_SysV(a) +# endif + # define sem_init(a, b, c) sem_init_SysV(a, b, c) -# define sem_destroy(a) sem_destroy_SysV(a) -# define sem_wait(a) sem_wait_SysV(a) # define sem_trywait(a) sem_trywait_SysV(a) # define sem_timedwait(a, b) sem_timedwait_SysV(a, b) -# define sem_post(a) sem_post_SysV(a) # define sem_getvalue(a, b) sem_getvalue_SysV(a, b) # define sem_open(...) sem_open_SysV(__VA_ARGS__) # define sem_close(a) sem_close_SysV(a) # define sem_unlink(a) sem_unlink_SysV(a) +#else +# ifdef DEBUG_SEMAPHORES +# define sem_wait(a) ({ int value; sem_getvalue(a, &value); \ + uprintf("[%d-%llu] Semaphore %s (%p) "\ + "waiting at %s() " \ + "line #%d\n", (int) getpid(), (unsigned long long) \ + pthread_self(), \ + #a, a, __FUNCTION__, __LINE__), fflush(stdout); \ + if (value > 1) BUG(1, uprintf("Value %d\n", value)); sem_wait(a); }) +# define sem_post(a) ({ int value; sem_getvalue(a, &value); \ + uprintf("[%d-%llu] Semaphore %s (%p) "\ + "posting at %s() " \ + "line #%d\n", (int) getpid(), (unsigned long long) \ + pthread_self(), \ + #a, a, __FUNCTION__, __LINE__), fflush(stdout); \ + if (value > 0) BUG(1, uprintf("Value %d\n", value)); sem_post(a); }) +# define sem_destroy(a) ({ int value; sem_getvalue(a, &value); \ + if (value == 0) BUG(1, uprintf("Value %d\n", value)); \ + sem_destroy(a); }) +# endif #endif @@ -458,9 +500,6 @@ union semun #ifndef RPLARGS # ifdef SEMAPHORES_NOMMES # define LONGUEUR_NOM_SEMAPHORE 64 -# endif - -# ifdef SEMAPHORES_NOMMES # define __PTR__ * # else # define __PTR__ @@ -476,39 +515,34 @@ 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_creation_variable_partagee __STATIC_MUTEX_INITIALIZATION__; __EXTERN__ pthread_mutex_t mutex_sections_critiques; __EXTERN__ pthread_mutex_t mutex_liste_variables_partagees; - - __EXTERN__ sem_t __PTR__ semaphore_gestionnaires_signaux; + __EXTERN__ pthread_mutex_t mutex_sem __STATIC_MUTEX_INITIALIZATION__; __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 -#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); +# define SEM_FORK 0 +# define SEM_QUEUE 1 +# define SEM_SIGNALISATION 2 +# define SEM_ARRET_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); +#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); \ @@ -693,23 +727,6 @@ pid_t debug_fork(); pthread_mutex_unlock(mutex) #endif -#ifdef DEBUG_SEMAPHORES -#define sem_wait(a) ({ int value; sem_getvalue(a, &value); \ - uprintf("[%d-%llu] Semaphore %s (%p) "\ - "waiting at %s() " \ - "line #%d\n", (int) getpid(), (unsigned long long) pthread_self(), \ - #a, a, __FUNCTION__, __LINE__), fflush(stdout); \ - if (value > 1) BUG(1, uprintf("Value %d\n", value)); sem_wait(a); }) -#define sem_post(a) ({ int value; sem_getvalue(a, &value); \ - uprintf("[%d-%llu] Semaphore %s (%p) "\ - "posting at %s() " \ - "line #%d\n", (int) getpid(), (unsigned long long) pthread_self(), \ - #a, a, __FUNCTION__, __LINE__), fflush(stdout); \ - if (value > 0) BUG(1, uprintf("Value %d\n", value)); sem_post(a); }) -#define sem_destroy(a) ({ int value; sem_getvalue(a, &value); \ - if (value == 0) BUG(1, uprintf("Value %d\n", value)); sem_destroy(a); }) -#endif - /* ================================================================================ @@ -2299,6 +2316,8 @@ typedef struct processus logical1 processus_detache; + enum t_type type_en_cours; + /* Profilage */ logical1 profilage; @@ -2560,6 +2579,7 @@ void instruction_elseif(struct_processus void instruction_end(struct_processus *s_etat_processus); void instruction_eng(struct_processus *s_etat_processus); void instruction_epsilon(struct_processus *s_etat_processus); +void instruction_eqv(struct_processus *s_etat_processus); void instruction_erase(struct_processus *s_etat_processus); void instruction_errm(struct_processus *s_etat_processus); void instruction_errn(struct_processus *s_etat_processus); @@ -3319,6 +3339,8 @@ logical1 initialisation_fichier_acces_in sqlite3 *sqlite, integer8 position_clef, logical1 binaire); logical1 lancement_thread_signaux(struct_processus *s_etat_processus); logical1 recherche_instruction_suivante(struct_processus *s_etat_processus); +logical1 recherche_instruction_suivante_recursive( + struct_processus *s_etat_processus, integer8 recursivite); logical1 retrait_variable(struct_processus *s_etat_processus, unsigned char *nom_variable, unsigned char type); logical1 retrait_variables_par_niveau(struct_processus *s_etat_processus);