version 1.120, 2011/09/14 14:34:28
|
version 1.127, 2011/09/20 07:16:40
|
Line 101
|
Line 101
|
# include <pwd.h> |
# include <pwd.h> |
# include <sys/shm.h> |
# include <sys/shm.h> |
|
|
# ifndef IPCS_SYSV |
# ifndef __RPLCAS |
# include <semaphore.h> |
# ifndef IPCS_SYSV |
# else |
# include <semaphore.h> |
# include <sys/ipc.h> |
|
# include <sys/sem.h> |
|
|
|
# ifdef OS2 |
|
# define INCL_DOSSEMAPHORES |
|
# define INCL_DOSMEMMGR |
|
# define INCL_DOSERRORS |
|
# include <os2.h> |
|
|
|
typedef struct _OS2SEM |
|
{ |
|
HMTX hmtx; |
|
HEV hev; |
|
ULONG shared; |
|
ULONG *cnt; |
|
ULONG *nopened; |
|
ULONG allocated; |
|
} sem_t; |
|
# else |
# else |
typedef struct |
# include <sys/ipc.h> |
{ |
# include <sys/sem.h> |
int sem; |
|
unsigned char *path; |
# ifdef OS2 |
pid_t pid; |
# define INCL_DOSSEMAPHORES |
} sem_t; |
# define INCL_DOSMEMMGR |
# endif |
# define INCL_DOSERRORS |
|
# include <os2.h> |
|
|
|
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; |
|
} sem_t; |
|
# endif |
|
|
# define SEM_FAILED NULL |
# ifndef SEM_FAILED |
|
# define SEM_FAILED NULL |
|
# endif |
|
|
sem_t *sem_open_SysV(const char *nom, int oflag, ...); |
sem_t *sem_open_SysV(const char *nom, int oflag, ...); |
int sem_init_SysV(sem_t *sem, int shared, unsigned int value); |
int sem_init_SysV(sem_t *sem, int shared, unsigned int value); |
int sem_close_SysV(sem_t *sem); |
int sem_close_SysV(sem_t *sem); |
int sem_wait_SysV(sem_t *sem); |
int sem_wait_SysV(sem_t *sem); |
int sem_trywait_SysV(sem_t *sem); |
int sem_trywait_SysV(sem_t *sem); |
int sem_post_SysV(sem_t *sem); |
int sem_post_SysV(sem_t *sem); |
int sem_getvalue_SysV(sem_t *sem, int *value); |
int sem_getvalue_SysV(sem_t *sem, int *value); |
int sem_unlink_SysV(const char *nom); |
int sem_unlink_SysV(const char *nom); |
int sem_destroy_SysV(sem_t *sem); |
int sem_destroy_SysV(sem_t *sem); |
|
# endif |
# endif |
# endif |
|
|
# include <setjmp.h> |
# include <setjmp.h> |
Line 211
|
Line 216
|
|
|
enum signaux_rpl |
enum signaux_rpl |
{ |
{ |
rpl_null = 0, |
rpl_signull = 0, |
rpl_sigint, |
rpl_sigint, |
rpl_sigterm, |
rpl_sigterm, |
rpl_sigstart, // Signal envoyé par un père pour lancer son fils. |
rpl_sigstart, // Signal envoyé par un père pour lancer son fils. |
Line 227 enum signaux_rpl
|
Line 232 enum signaux_rpl
|
rpl_sigalrm, // Signal d'alarme (erreur système) depuis un fils |
rpl_sigalrm, // Signal d'alarme (erreur système) depuis un fils |
rpl_sighup, |
rpl_sighup, |
rpl_sigtstp, |
rpl_sigtstp, |
|
rpl_sigexcept, |
rpl_sigmax |
rpl_sigmax |
}; |
}; |
|
|
Line 238 enum signaux_rpl
|
Line 244 enum signaux_rpl
|
|
|
typedef struct queue_signaux |
typedef struct queue_signaux |
{ |
{ |
pthread_mutex_t mutex; |
# ifndef IPCS_SYSV |
|
# ifndef SEMAPHORES_NOMMES |
|
sem_t semaphore; |
|
# endif |
|
# else |
|
sem_t semaphore; |
|
# endif |
|
|
volatile int pointeur_lecture; |
volatile int pointeur_lecture; |
volatile int pointeur_ecriture; |
volatile int pointeur_ecriture; |
Line 253 typedef struct queue_signaux
|
Line 265 typedef struct queue_signaux
|
#ifndef RPLARGS |
#ifndef RPLARGS |
# ifndef MAIN_RPL |
# ifndef MAIN_RPL |
extern struct_queue_signaux *s_queue_signaux; |
extern struct_queue_signaux *s_queue_signaux; |
|
extern int f_queue_signaux; |
|
# ifdef SEMAPHORES_NOMMES |
|
extern sem_t *semaphore_queue_signaux; |
|
# endif |
# else |
# else |
struct_queue_signaux *s_queue_signaux; |
struct_queue_signaux *s_queue_signaux; |
|
int f_queue_signaux; |
|
# ifdef SEMAPHORES_NOMMES |
|
sem_t *semaphore_queue_signaux; |
|
# endif |
# endif |
# endif |
#endif |
#endif |
|
|
Line 397 typedef unsigned char t_8_bits;
|
Line 417 typedef unsigned char t_8_bits;
|
extern pthread_mutex_t mutex_sem; |
extern pthread_mutex_t mutex_sem; |
# endif |
# endif |
|
|
extern pthread_key_t semaphore_fork_processus_courant; |
extern pthread_mutex_t mutex_liste_threads; |
|
extern pthread_mutex_t mutex_gestionnaires_signaux_atomique; |
|
|
extern sem_t |
extern sem_t |
# ifdef SEMAPHORES_NOMMES |
# ifdef SEMAPHORES_NOMMES |
* |
* |
# endif |
|
semaphore_liste_threads; |
|
|
|
extern sem_t |
|
# ifdef SEMAPHORES_NOMMES |
|
* |
|
# endif |
# endif |
semaphore_gestionnaires_signaux; |
semaphore_gestionnaires_signaux; |
|
|
extern sem_t |
|
# ifdef SEMAPHORES_NOMMES |
|
* |
|
# endif |
|
semaphore_gestionnaires_signaux_atomique; |
|
|
|
# ifdef SEMAPHORES_NOMMES |
|
// 0 -> liste_threads |
|
// 1 -> gestionnaire_signaux |
|
// 2 -> gestionnaire_signaux_atomique |
|
// 3 -> &((*s_etat_processus).semaphore_fork) |
|
extern unsigned char noms_semaphores[4][LONGUEUR_NOM_SEMAPHORE]; |
|
extern sem_t *semaphores_nommes[4]; |
|
# endif |
|
# else |
# else |
jmp_buf contexte; |
jmp_buf contexte; |
jmp_buf contexte_initial; |
jmp_buf contexte_initial; |
Line 439 typedef unsigned char t_8_bits;
|
Line 439 typedef unsigned char t_8_bits;
|
pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; |
pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; |
# endif |
# endif |
|
|
pthread_key_t semaphore_fork_processus_courant; |
pthread_mutex_t mutex_liste_threads = |
|
PTHREAD_MUTEX_INITIALIZER; |
sem_t |
pthread_mutex_t mutex_gestionnaires_signaux = |
# ifdef SEMAPHORES_NOMMES |
PTHREAD_MUTEX_INITIALIZER; |
* |
pthread_mutex_t mutex_gestionnaires_signaux_atomique = |
# endif |
PTHREAD_MUTEX_INITIALIZER; |
semaphore_liste_threads; |
|
|
|
sem_t |
sem_t |
# ifdef SEMAPHORES_NOMMES |
# ifdef SEMAPHORES_NOMMES |
* |
* |
# endif |
# endif |
semaphore_gestionnaires_signaux; |
semaphore_gestionnaires_signaux; |
|
|
sem_t |
|
# ifdef SEMAPHORES_NOMMES |
|
* |
|
# endif |
|
semaphore_gestionnaires_signaux_atomique; |
|
|
|
# ifdef SEMAPHORES_NOMMES |
|
unsigned char noms_semaphores[4][LONGUEUR_NOM_SEMAPHORE]; |
|
sem_t *semaphores_nommes[4]; |
|
# endif |
|
# endif |
# endif |
#endif |
#endif |
|
|
#ifdef SEMAPHORES_NOMMES |
#ifdef SEMAPHORES_NOMMES |
enum t_semaphore { sem_liste_threads = 0, |
sem_t *sem_init2(unsigned int valeur, pid_t pid); |
sem_gestionnaires_signaux = 1, |
int sem_destroy2(sem_t *semaphore_p, pid_t pid); |
sem_gestionnaires_signaux_atomique = 2, |
|
sem_fork = 3 }; |
|
|
|
sem_t *sem_init2(unsigned int valeur, enum t_semaphore semaphore); |
|
int sem_destroy2(sem_t *semaphore_p, enum t_semaphore semaphore); |
|
int sem_getvalue2(sem_t *semaphore, int *valeur); |
int sem_getvalue2(sem_t *semaphore, int *valeur); |
|
sem_t *sem_open2(pid_t pid); |
|
|
|
// 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. |
|
|
#define sem_getvalue(semaphore, value) sem_getvalue2(semaphore, value) |
#define sem_getvalue(semaphore, value) sem_getvalue2(semaphore, value) |
#define sem_post(semaphore) \ |
#define sem_post(semaphore) \ |
Line 506 int sem_getvalue2(sem_t *semaphore, int
|
Line 493 int sem_getvalue2(sem_t *semaphore, int
|
#define ufprintf(flux, ...) transliterated_fprintf(NULL, \ |
#define ufprintf(flux, ...) transliterated_fprintf(NULL, \ |
flux, __VA_ARGS__) |
flux, __VA_ARGS__) |
|
|
// Tous les messages pour DISP, INPUT et les E/S par readline sont sur stderr. |
|
// Cela évite aux messages envoyés par les gestionnaires de signaux d'être |
|
// indéfiniment bloqués. |
|
|
|
#ifdef SunOS |
#ifdef SunOS |
# define fopen(...) ({ FILE *desc; \ |
# define fopen(...) ({ FILE *desc; \ |
while((desc = fopen(__VA_ARGS__)) == NULL) \ |
while((desc = fopen(__VA_ARGS__)) == NULL) \ |
Line 757 pid_t debug_fork();
|
Line 740 pid_t debug_fork();
|
Erreurs système |
Erreurs système |
-------------------------------------------------------------------------------- |
-------------------------------------------------------------------------------- |
*/ |
*/ |
|
#define DEBUG_ERREURS |
#ifdef DEBUG_ERREURS |
#ifdef DEBUG_ERREURS |
# ifdef MESSAGES |
# ifdef MESSAGES |
# define __erreur(i) i |
# define __erreur(i) i |
Line 2179 typedef struct processus
|
Line 2162 typedef struct processus
|
|
|
pid_t pid_processus_pere; |
pid_t pid_processus_pere; |
pthread_t tid_processus_pere; |
pthread_t tid_processus_pere; |
pthread_t tid_courant; |
|
|
|
logical1 processus_detache; |
logical1 processus_detache; |
|
|
Line 2195 typedef struct processus
|
Line 2177 typedef struct processus
|
pthread_mutex_t mutex; |
pthread_mutex_t mutex; |
pthread_mutex_t mutex_allocation; |
pthread_mutex_t mutex_allocation; |
|
|
// Sémaphore autorisant les fork() |
// Mutex autorisant les fork() |
sem_t |
pthread_mutex_t mutex_fork; |
# ifdef SEMAPHORES_NOMMES |
|
* |
|
# endif |
|
semaphore_fork; |
|
|
|
/* Mutexes */ |
/* Mutexes */ |
|
|