version 1.158, 2012/03/01 10:14:08
|
version 1.177, 2012/10/01 11:05:09
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.1.7 |
RPL/2 (R) version 4.1.11 |
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 145
|
Line 145
|
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_timedwait_SysV(sem_t *sem, struct timespec *ts); |
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(char *nom); |
int sem_destroy_SysV(sem_t *sem); |
int sem_destroy_SysV(sem_t *sem); |
# endif |
# endif |
|
|
Line 215
|
Line 216
|
# 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 281 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 300 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 319 union semun
|
Line 343 union semun
|
# define sem_destroy(a) sem_destroy_SysV(a) |
# define sem_destroy(a) sem_destroy_SysV(a) |
# define sem_wait(a) sem_wait_SysV(a) |
# define sem_wait(a) sem_wait_SysV(a) |
# define sem_trywait(a) sem_trywait_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_post(a) sem_post_SysV(a) |
# define sem_getvalue(a, b) sem_getvalue_SysV(a, b) |
# define sem_getvalue(a, b) sem_getvalue_SysV(a, b) |
# define sem_open(...) sem_open_SysV(__VA_ARGS__) |
# define sem_open(...) sem_open_SysV(__VA_ARGS__) |
Line 344 union semun
|
Line 369 union semun
|
// SIGHUP |
// SIGHUP |
// SIGALRM |
// SIGALRM |
|
|
# define SIGTEST SIGUSR1 |
# define SIGTEST 255 |
|
|
// Nombre d'interruptions disponibles |
// Nombre d'interruptions disponibles |
# define d_NOMBRE_INTERRUPTIONS 64 |
# define d_NOMBRE_INTERRUPTIONS 64 |
Line 387 union semun
|
Line 412 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 421 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 pthread_mutex_t mutex_gestionnaires_signaux_atomique; |
|
|
|
extern sem_t |
__EXTERN__ jmp_buf contexte_ecriture; |
# ifdef SEMAPHORES_NOMMES |
__EXTERN__ jmp_buf contexte_impression; |
* |
__EXTERN__ jmp_buf contexte_initial; |
# endif |
__EXTERN__ jmp_buf contexte_processus; |
semaphore_gestionnaires_signaux; |
__EXTERN__ jmp_buf contexte_thread; |
|
|
extern volatile int routine_recursive; |
__EXTERN__ volatile int signal_test; |
# else |
|
jmp_buf contexte_ecriture; |
|
jmp_buf contexte_impression; |
|
jmp_buf contexte_initial; |
|
jmp_buf contexte_processus; |
|
jmp_buf contexte_thread; |
|
|
|
int signal_test; |
__EXTERN__ pid_t pid_processus_pere; |
|
|
pid_t pid_processus_pere; |
# ifdef SEMAPHORES_NOMMES |
|
__EXTERN__ pthread_mutex_t mutex_sem __STATIC_MUTEX_INITIALIZATION__; |
|
# endif |
|
|
# ifdef SEMAPHORES_NOMMES |
__EXTERN__ pthread_mutex_t mutex_liste_threads |
pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; |
__STATIC_MUTEX_INITIALIZATION__; |
# endif |
__EXTERN__ pthread_mutex_t mutex_gestionnaires_signaux_atomique |
|
__STATIC_MUTEX_INITIALIZATION__; |
|
__EXTERN__ pthread_mutex_t mutex_sections_critiques; |
|
|
pthread_mutex_t mutex_liste_threads = |
__EXTERN__ sem_t __PTR__ semaphore_gestionnaires_signaux; |
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 508 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 942 pid_t debug_fork();
|
Line 925 pid_t debug_fork();
|
# define d_ex_fichier_corrompu __erreur(85) |
# define d_ex_fichier_corrompu __erreur(85) |
# define d_ex_mutex_acquis_autre_thread __erreur(86) |
# define d_ex_mutex_acquis_autre_thread __erreur(86) |
# define d_ex_expression_reguliere __erreur(87) |
# define d_ex_expression_reguliere __erreur(87) |
|
# define d_ex_instruction_indisponible __erreur(88) |
#endif |
#endif |
|
|
|
|
Line 1203 typedef struct descripteur_fichier
|
Line 1187 typedef struct descripteur_fichier
|
pid_t pid; |
pid_t pid; |
pthread_t tid; |
pthread_t tid; |
|
|
file *descripteur_c; |
union |
sqlite3 *descripteur_sqlite; |
{ |
|
file *descripteur_c; |
|
sqlite3 *descripteur_sqlite; |
|
}; |
} struct_descripteur_fichier; |
} struct_descripteur_fichier; |
#endif |
#endif |
|
|
Line 1299 typedef struct liste_chainee
|
Line 1286 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 1460 typedef struct liste_pile_systeme
|
Line 1482 typedef struct liste_pile_systeme
|
|
|
/* |
/* |
type clôture : |
type clôture : |
C SELECT : END termine un test SELECT/DEFAULT/END. |
C SELECT : END termine un test SELECT/DEFAULT/END. |
D DO : END termine une boucle DO/UNTIL/END. |
D DO : END termine une boucle DO/UNTIL/END. |
I IF : END termine un test IF/THEN (ELSE)/END. |
I IF : END termine un test IF/THEN (ELSE)/END. |
J IFERR : END termine un test IFERR/THEN (ELSE)/END. |
J IFERR : END termine un test IFERR/THEN (ELSE)/END. |
K CASE : END termine un test CASE/THEN/END |
K CASE : END termine un test CASE/THEN/END |
W WHILE : END termine une boucle WHILE/REPEAT/END. |
W WHILE : END termine une boucle WHILE/REPEAT/END. |
|
Q CRITICAL : END termine une section critique CRITICAL/END |
|
|
F FOR : NEXT ou STEP termine une boucle avec compteur. |
F FOR : NEXT ou STEP termine une boucle avec compteur. |
S START : NEXT ou STEP termine une boucle sans compteur. |
S START : NEXT ou STEP termine une boucle sans compteur. |
L LOOP : boucle utilisé dans le traitement de l'instruction RETURN. |
L LOOP : boucle utilisé dans le traitement de l'instruction RETURN. |
Elle correspond à une boucle FOR ou START mais sans son |
Elle correspond à une boucle FOR ou START mais sans son |
initialisation. |
initialisation. |
|
A FORALL : NEXT termine une boucle sur un objet. |
*/ |
*/ |
|
|
unsigned long adresse_retour; |
unsigned long adresse_retour; |
Line 2188 typedef struct processus
|
Line 2212 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 */ |
|
|
struct_liste_chainee *liste_mutexes; |
struct_liste_chainee *liste_mutexes; |
pthread_mutex_t protection_liste_mutexes; |
pthread_mutex_t protection_liste_mutexes; |
|
unsigned int sections_critiques; |
|
|
/* Drapeau nécessaire à RESTART */ |
/* Drapeau nécessaire à RESTART */ |
|
|
Line 2370 void instruction_cosh(struct_processus *
|
Line 2391 void instruction_cosh(struct_processus *
|
void instruction_cov(struct_processus *s_etat_processus); |
void instruction_cov(struct_processus *s_etat_processus); |
void instruction_cr(struct_processus *s_etat_processus); |
void instruction_cr(struct_processus *s_etat_processus); |
void instruction_create(struct_processus *s_etat_processus); |
void instruction_create(struct_processus *s_etat_processus); |
|
void instruction_critical(struct_processus *s_etat_processus); |
void instruction_crmtx(struct_processus *s_etat_processus); |
void instruction_crmtx(struct_processus *s_etat_processus); |
void instruction_cross(struct_processus *s_etat_processus); |
void instruction_cross(struct_processus *s_etat_processus); |
void instruction_crsmphr(struct_processus *s_etat_processus); |
void instruction_crsmphr(struct_processus *s_etat_processus); |
Line 2454 void instruction_fleche_str(struct_proce
|
Line 2476 void instruction_fleche_str(struct_proce
|
void instruction_fleche_table(struct_processus *s_etat_processus); |
void instruction_fleche_table(struct_processus *s_etat_processus); |
void instruction_floor(struct_processus *s_etat_processus); |
void instruction_floor(struct_processus *s_etat_processus); |
void instruction_for(struct_processus *s_etat_processus); |
void instruction_for(struct_processus *s_etat_processus); |
|
void instruction_forall(struct_processus *s_etat_processus); |
void instruction_format(struct_processus *s_etat_processus); |
void instruction_format(struct_processus *s_etat_processus); |
void instruction_fp(struct_processus *s_etat_processus); |
void instruction_fp(struct_processus *s_etat_processus); |
void instruction_fs_test(struct_processus *s_etat_processus); |
void instruction_fs_test(struct_processus *s_etat_processus); |
Line 3082 struct_liste_chainee *sauvegarde_argumen
|
Line 3105 struct_liste_chainee *sauvegarde_argumen
|
#ifndef RPLARGS |
#ifndef RPLARGS |
unsigned char *analyse_algebrique(struct_processus *s_etat_processus, |
unsigned char *analyse_algebrique(struct_processus *s_etat_processus, |
unsigned char *chaine_algebrique, struct_liste_chainee **l_base_liste); |
unsigned char *chaine_algebrique, struct_liste_chainee **l_base_liste); |
|
unsigned char *analyse_flux(struct_processus *s_etat_processus, |
|
unsigned char *flux, long longueur); |
unsigned char *recherche_chemin_fichiers_temporaires(struct_processus |
unsigned char *recherche_chemin_fichiers_temporaires(struct_processus |
*s_etat_processus); |
*s_etat_processus); |
unsigned char *compactage(unsigned char *chaine); |
unsigned char *compactage(unsigned char *chaine); |