--- rpl/src/rpl.h 2014/04/25 07:37:34 1.240 +++ rpl/src/rpl.h 2014/07/17 08:07:26 1.248 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.18 + RPL/2 (R) version 4.1.19 Copyright (C) 1989-2014 Dr. BERTRAND Joël This file is part of RPL/2. @@ -110,54 +110,52 @@ # include # endif -# ifndef __RPLCAS -# ifndef IPCS_SYSV -# include -# else -# include -# include - -# ifdef OS2 -# define INCL_DOSSEMAPHORES -# define INCL_DOSMEMMGR -# define INCL_DOSERRORS -# include - - typedef struct _OS2SEM - { - HMTX hmtx; - HEV hev; - ULONG shared; - ULONG *cnt; - ULONG *nopened; - ULONG allocated; - } sem_t; -# else // IPCS_SYSV - typedef struct - { - int sem; - int alloue; - unsigned char *path; - pid_t pid; - pthread_t tid; - } sem_t; -# endif - -# ifndef SEM_FAILED -# define SEM_FAILED NULL -# endif - - sem_t *sem_open_SysV(const char *nom, int oflag, ...); - int sem_init_SysV(sem_t *sem, int shared, unsigned int value); - int sem_close_SysV(sem_t *sem); - int sem_wait_SysV(sem_t *sem); - int sem_trywait_SysV(sem_t *sem); - int sem_timedwait_SysV(sem_t *sem, struct timespec *ts); - int sem_post_SysV(sem_t *sem); - int sem_getvalue_SysV(sem_t *sem, int *value); - int sem_unlink_SysV(char *nom); - int sem_destroy_SysV(sem_t *sem); +# ifndef IPCS_SYSV +# include +# else +# include +# include + +# ifdef OS2 +# define INCL_DOSSEMAPHORES +# define INCL_DOSMEMMGR +# define INCL_DOSERRORS +# include + + typedef struct _OS2SEM + { + HMTX hmtx; + HEV hev; + ULONG shared; + ULONG *cnt; + ULONG *nopened; + ULONG allocated; + } sem_t; +# else // IPCS_SYSV + typedef struct + { + int sem; + int alloue; + unsigned char *path; + pid_t pid; + pthread_t tid; + } sem_t; # endif + +# ifndef SEM_FAILED +# define SEM_FAILED NULL +# endif + + sem_t *sem_open_SysV(const char *nom, int oflag, ...); + int sem_init_SysV(sem_t *sem, int shared, unsigned int value); + int sem_close_SysV(sem_t *sem); + int sem_wait_SysV(sem_t *sem); + int sem_trywait_SysV(sem_t *sem); + int sem_timedwait_SysV(sem_t *sem, struct timespec *ts); + int sem_post_SysV(sem_t *sem); + int sem_getvalue_SysV(sem_t *sem, int *value); + int sem_unlink_SysV(char *nom); + int sem_destroy_SysV(sem_t *sem); # endif # include @@ -379,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 @@ -459,9 +500,6 @@ union semun #ifndef RPLARGS # ifdef SEMAPHORES_NOMMES # define LONGUEUR_NOM_SEMAPHORE 64 -# endif - -# ifdef SEMAPHORES_NOMMES # define __PTR__ * # else # define __PTR__ @@ -485,22 +523,20 @@ union semun __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 -#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 @@ -691,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 - /* ================================================================================