version 1.160, 2012/04/12 09:56:40
|
version 1.166, 2012/05/22 13:20:23
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.1.7 |
RPL/2 (R) version 4.1.9 |
Copyright (C) 1989-2012 Dr. BERTRAND Joël |
Copyright (C) 1989-2012 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
Line 215
|
Line 215
|
# endif |
# endif |
#endif |
#endif |
|
|
|
#ifdef MAIN_RPL |
|
# define __EXTERN__ |
|
# define __STATIC_MUTEX_INITIALIZATION__ = PTHREAD_MUTEX_INITIALIZER |
|
#else |
|
# define __EXTERN__ extern |
|
# define __STATIC_MUTEX_INITIALIZATION__ |
|
#endif |
|
|
/* |
/* |
================================================================================ |
================================================================================ |
Bugs spécifiques |
Bugs spécifiques |
================================================================================ |
================================================================================ |
*/ |
*/ |
|
|
|
// Néant |
|
|
|
/* |
|
================================================================================ |
|
TYPES |
|
================================================================================ |
|
*/ |
|
|
|
typedef FILE file; |
|
typedef unsigned char t_8_bits; |
|
|
|
#ifndef RPLARGS |
|
# include "rpltypes-conv.h" |
|
#else |
|
# include "rpltypes.h" |
|
#endif |
|
|
enum signaux_rpl |
enum signaux_rpl |
{ |
{ |
rpl_signull = 0, |
rpl_signull = 0, |
Line 255 typedef struct queue_signaux
|
Line 280 typedef struct queue_signaux
|
# ifndef IPCS_SYSV |
# ifndef IPCS_SYSV |
# ifndef SEMAPHORES_NOMMES |
# ifndef SEMAPHORES_NOMMES |
sem_t semaphore; |
sem_t semaphore; |
|
sem_t signalisation; |
# endif |
# endif |
# else |
# else |
sem_t semaphore; |
sem_t semaphore; |
|
sem_t signalisation; |
# endif |
# endif |
|
|
volatile int pointeur_lecture; |
volatile int pointeur_lecture; |
volatile int pointeur_ecriture; |
volatile int pointeur_ecriture; |
|
pthread_t thread_signaux; |
|
volatile logical1 requete_arret; |
|
|
volatile struct |
volatile struct |
{ |
{ |
Line 270 typedef struct queue_signaux
|
Line 299 typedef struct queue_signaux
|
} queue[LONGUEUR_QUEUE_SIGNAUX]; |
} queue[LONGUEUR_QUEUE_SIGNAUX]; |
} struct_queue_signaux; |
} struct_queue_signaux; |
|
|
# ifndef MAIN_RPL |
__EXTERN__ struct_queue_signaux *s_queue_signaux; |
extern struct_queue_signaux *s_queue_signaux; |
__EXTERN__ int f_queue_signaux; |
extern int f_queue_signaux; |
|
# ifdef SEMAPHORES_NOMMES |
# ifdef SEMAPHORES_NOMMES |
extern sem_t *semaphore_queue_signaux; |
__EXTERN__ sem_t *semaphore_queue_signaux; |
# endif |
__EXTERN__ sem_t *semaphore_signalisation; |
# else |
|
struct_queue_signaux *s_queue_signaux; |
|
int f_queue_signaux; |
|
# ifdef SEMAPHORES_NOMMES |
|
sem_t *semaphore_queue_signaux; |
|
# endif |
|
# endif |
# endif |
#endif |
#endif |
|
|
Line 387 union semun
|
Line 410 union semun
|
|
|
/* |
/* |
================================================================================ |
================================================================================ |
TYPES |
|
================================================================================ |
|
*/ |
|
|
|
typedef FILE file; |
|
typedef unsigned char t_8_bits; |
|
|
|
#ifndef RPLARGS |
|
# include "rpltypes-conv.h" |
|
#else |
|
# include "rpltypes.h" |
|
#endif |
|
|
|
/* |
|
================================================================================ |
|
Variables globales |
Variables globales |
================================================================================ |
================================================================================ |
*/ |
*/ |
Line 411 typedef unsigned char t_8_bits;
|
Line 419 typedef unsigned char t_8_bits;
|
# define LONGUEUR_NOM_SEMAPHORE 64 |
# define LONGUEUR_NOM_SEMAPHORE 64 |
# endif |
# endif |
|
|
# ifndef MAIN_RPL |
# ifdef SEMAPHORES_NOMMES |
extern jmp_buf contexte_ecriture; |
# define __PTR__ * |
extern jmp_buf contexte_impression; |
# else |
extern jmp_buf contexte_initial; |
# define __PTR__ |
extern jmp_buf contexte_processus; |
# endif |
extern jmp_buf contexte_thread; |
|
|
|
extern int signal_test; |
|
|
|
extern pid_t pid_processus_pere; |
|
|
|
# ifdef SEMAPHORES_NOMMES |
|
extern pthread_mutex_t mutex_sem; |
|
# endif |
|
|
|
extern pthread_mutex_t mutex_liste_threads; |
__EXTERN__ jmp_buf contexte_ecriture; |
extern pthread_mutex_t mutex_gestionnaires_signaux_atomique; |
__EXTERN__ jmp_buf contexte_impression; |
|
__EXTERN__ jmp_buf contexte_initial; |
|
__EXTERN__ jmp_buf contexte_processus; |
|
__EXTERN__ jmp_buf contexte_thread; |
|
|
extern sem_t |
__EXTERN__ int signal_test; |
# ifdef SEMAPHORES_NOMMES |
|
* |
|
# endif |
|
semaphore_gestionnaires_signaux; |
|
|
|
extern volatile int routine_recursive; |
__EXTERN__ pid_t pid_processus_pere; |
# else |
|
jmp_buf contexte_ecriture; |
|
jmp_buf contexte_impression; |
|
jmp_buf contexte_initial; |
|
jmp_buf contexte_processus; |
|
jmp_buf contexte_thread; |
|
|
|
int signal_test; |
# ifdef SEMAPHORES_NOMMES |
|
__EXTERN__ pthread_mutex_t mutex_sem __STATIC_MUTEX_INITIALIZATION__; |
|
# endif |
|
|
pid_t pid_processus_pere; |
__EXTERN__ pthread_mutex_t mutex_liste_threads |
|
__STATIC_MUTEX_INITIALIZATION__; |
|
__EXTERN__ pthread_mutex_t mutex_gestionnaires_signaux_atomique |
|
__STATIC_MUTEX_INITIALIZATION__; |
|
|
# ifdef SEMAPHORES_NOMMES |
__EXTERN__ sem_t __PTR__ semaphore_gestionnaires_signaux; |
pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; |
|
# endif |
|
|
|
pthread_mutex_t mutex_liste_threads = |
|
PTHREAD_MUTEX_INITIALIZER; |
|
pthread_mutex_t mutex_gestionnaires_signaux = |
|
PTHREAD_MUTEX_INITIALIZER; |
|
pthread_mutex_t mutex_gestionnaires_signaux_atomique = |
|
PTHREAD_MUTEX_INITIALIZER; |
|
sem_t |
|
# ifdef SEMAPHORES_NOMMES |
|
* |
|
# endif |
|
semaphore_gestionnaires_signaux; |
|
|
|
volatile int routine_recursive; |
__EXTERN__ volatile int routine_recursive; |
# endif |
|
#endif |
#endif |
|
|
#ifdef SEMAPHORES_NOMMES |
#ifdef SEMAPHORES_NOMMES |
#define SEM_FORK 0 |
#define SEM_FORK 0 |
#define SEM_QUEUE 1 |
#define SEM_QUEUE 1 |
#define SEM_SIGNAUX 2 |
#define SEM_SIGNAUX 2 |
|
#define SEM_SIGNALISATION 3 |
sem_t *sem_init2(unsigned int valeur, pid_t pid, int ordre); |
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); |
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_destroy2(sem_t *semaphore_p, pid_t pid, int ordre); |
Line 522 sem_t *sem_open2(pid_t pid, int ordre);
|
Line 505 sem_t *sem_open2(pid_t pid, int ordre);
|
# define fclose(...) ({ int ios; \ |
# define fclose(...) ({ int ios; \ |
while((ios = fclose(__VA_ARGS__)) != 0) \ |
while((ios = fclose(__VA_ARGS__)) != 0) \ |
{ if ((errno != EINTR) && (errno != 0)) break; } ios; }) |
{ if ((errno != EINTR) && (errno != 0)) break; } ios; }) |
# define fread(...) ({ int ios; \ |
|
while((ios = fread(__VA_ARGS__)) < 0) \ |
|
{ if ((errno != EINTR) && (errno != 0)) break; } ios; }) |
|
# define fflush(flux) ({ int ios; \ |
# define fflush(flux) ({ int ios; \ |
while((ios = fflush((flux == stdout) ? stderr : flux)) != 0) \ |
while((ios = fflush((flux == stdout) ? stderr : flux)) != 0) \ |
{ if ((errno != EINTR) && (errno != 0)) break; } ios; }) |
{ if ((errno != EINTR) && (errno != 0)) break; } ios; }) |
Line 1303 typedef struct liste_chainee
|
Line 1283 typedef struct liste_chainee
|
|
|
/* |
/* |
-------------------------------------------------------------------------------- |
-------------------------------------------------------------------------------- |
|
Structure de gestion des signaux en provenance de rplsignal |
|
-------------------------------------------------------------------------------- |
|
*/ |
|
|
|
#define d_NOMBRE_SIGNAUX 64 |
|
|
|
typedef struct gestion_signaux |
|
{ |
|
unsigned char masque_signaux[d_NOMBRE_SIGNAUX]; |
|
|
|
/* |
|
* 'I' : signal ignoré |
|
* 'Q' : signal mis en queue pour un traitement ultérieur |
|
* 'N' : traitement normal du signal |
|
*/ |
|
|
|
integer8 queue_signaux[d_NOMBRE_SIGNAUX]; |
|
integer8 nombre_signaux_en_queue; |
|
struct_objet *corps_signaux[d_NOMBRE_SIGNAUX]; |
|
|
|
pthread_mutex_t mutex; |
|
} struct_gestion_signaux; |
|
|
|
#ifndef MAIN_RPL |
|
# define __STATIC_GESTION_SIGNAUX__ |
|
#else |
|
# define __STATIC_GESTION_SIGNAUX__ = { .mutex = PTHREAD_MUTEX_INITIALIZER } |
|
#endif |
|
|
|
__EXTERN__ volatile struct_gestion_signaux signaux_externes |
|
__STATIC_GESTION_SIGNAUX__; |
|
|
|
|
|
/* |
|
-------------------------------------------------------------------------------- |
Structure liste profilage |
Structure liste profilage |
-------------------------------------------------------------------------------- |
-------------------------------------------------------------------------------- |
*/ |
*/ |
Line 2192 typedef struct processus
|
Line 2207 typedef struct processus
|
pthread_mutex_t mutex_allocation; |
pthread_mutex_t mutex_allocation; |
|
|
// Mutex autorisant les fork() |
// Mutex autorisant les fork() |
sem_t |
sem_t __PTR__ semaphore_fork; |
# ifdef SEMAPHORES_NOMMES |
|
* |
|
# endif |
|
semaphore_fork; |
|
|
|
/* Mutexes */ |
/* Mutexes */ |
|
|