version 1.281, 2015/11/26 11:44:43
|
version 1.300, 2016/09/27 15:29:40
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.1.24 |
RPL/2 (R) version 4.1.26 |
Copyright (C) 1989-2015 Dr. BERTRAND Joël |
Copyright (C) 1989-2016 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
|
|
Line 64
|
Line 64
|
# define SA_ONSTACK 0 |
# define SA_ONSTACK 0 |
#endif |
#endif |
|
|
|
#define DEBUG_TRACE uprintf("[%d/%X] %s(%d)\n", \ |
|
getpid(), pthread_self(), __FILE__, __LINE__); |
|
#define TEST_ABSENCE_FICHIER(nom) \ |
|
{ int ios; struct stat *buf; ios = stat(nom, buf); \ |
|
if (ios == 0) BUG(1, uprintf("File %s found!\n", nom)); } |
|
|
/* |
/* |
================================================================================ |
================================================================================ |
Line 267
|
Line 272
|
# define __STATIC_MUTEX_INITIALIZATION__ |
# define __STATIC_MUTEX_INITIALIZATION__ |
#endif |
#endif |
|
|
|
|
/* |
/* |
================================================================================ |
================================================================================ |
Bugs spécifiques |
Bugs spécifiques |
Line 523 union semun
|
Line 529 union semun
|
__EXTERN__ pthread_mutex_t mutex_sem __STATIC_MUTEX_INITIALIZATION__; |
__EXTERN__ pthread_mutex_t mutex_sem __STATIC_MUTEX_INITIALIZATION__; |
|
|
__EXTERN__ volatile int routine_recursive; |
__EXTERN__ volatile int routine_recursive; |
|
__EXTERN__ volatile int nombre_thread_surveillance_processus; |
|
|
# define SEM_FORK 0 |
# define SEM_FORK 0 |
# define SEM_QUEUE 1 |
# define SEM_QUEUE 1 |
Line 590 union semun
|
Line 597 union semun
|
# define fflush(flux) fflush((flux == stdout) ? stderr : flux) |
# define fflush(flux) fflush((flux == stdout) ? stderr : flux) |
#endif |
#endif |
|
|
// Ajout d'un timeout sur les fonctions pipe() pour éviter une erreur |
|
// système dans le cas où l'on a atteint le nombre maximale de fichiers |
|
// ouverts. |
|
|
|
#define pipe(descripteurs) \ |
|
({ \ |
|
struct timespec temporisation; \ |
|
int erreur, nombre_echecs; \ |
|
nombre_echecs = 0; \ |
|
do \ |
|
{ \ |
|
if ((erreur = pipe(descripteurs)) == 0) break; \ |
|
nombre_echecs++; \ |
|
temporisation.tv_sec = 0; \ |
|
temporisation.tv_nsec = ((long) 1000000000) * rand(); \ |
|
nanosleep(&temporisation, NULL); \ |
|
} while(nombre_echecs < 100); \ |
|
erreur; \ |
|
}) |
|
|
|
// Redéfinition de abs pour un fonctionnement en entier de type long long int |
// Redéfinition de abs pour un fonctionnement en entier de type long long int |
|
|
#ifdef __GNUC__ |
#ifdef __GNUC__ |
Line 810 pid_t debug_fork();
|
Line 797 pid_t debug_fork();
|
# else |
# else |
# define __erreur_(i) i |
# define __erreur_(i) i |
# endif |
# endif |
# define __erreur(i) ({ if (strstr(__FUNCTION__, "recherche_variable") \ |
# define __erreur(i) ({ int ios; ios = errno; \ |
== NULL) ufprintf(stderr, \ |
if (strstr(__FUNCTION__, "recherche_variable") \ |
"ERROR %d AT %s() FROM %s LINE %d\n", \ |
== NULL) { if(ios != 0) \ |
i, __FUNCTION__, __FILE__, __LINE__); i; }) |
ufprintf(stderr, "LAST ERROR: %s\n", strerror(ios)); \ |
|
ufprintf(stderr, "ERROR %d AT %s() FROM %s LINE %d\n", \ |
|
i, __FUNCTION__, __FILE__, __LINE__); BACKTRACE(16); } i; }) |
# endif |
# endif |
#else |
#else |
# define __erreur(i) i |
# define __erreur(i) i |
# define __erreur_(i) i |
# define __erreur_(i) i |
#endif |
#endif |
|
|
|
#ifdef DEBUG_FICHIERS |
|
# define open(a, ...) \ |
|
({ ufprintf(stderr, "[%d] OPEN %s AT %s() FROM %s LINE %d\n", \ |
|
getpid(), a, \ |
|
__FUNCTION__, __FILE__, __LINE__); open(a, __VA_ARGS__); }) |
|
# define pipe(a) \ |
|
({ ufprintf(stderr, "[%d] PIPE %s AT %s() FROM %s LINE %d\n", \ |
|
getpid(), a, \ |
|
__FUNCTION__, __FILE__, __LINE__); pipe(a); }) |
|
# define shm_open(a, ...) \ |
|
({ ufprintf(stderr, "[%d] SHM_OPEN %s AT %s() FROM %s LINE %d\n", \ |
|
getpid(), a, \ |
|
__FUNCTION__, __FILE__, __LINE__); shm_open(a, __VA_ARGS__); }) |
|
# define shm_unlink(a) \ |
|
({ ufprintf(stderr, "[%d] SHM_UNLINK %s AT %s() FROM %s LINE %d\n", \ |
|
getpid(), a, \ |
|
__FUNCTION__, __FILE__, __LINE__); shm_unlink(a); }) |
|
# define sem_open(a, ...) \ |
|
({ ufprintf(stderr, "[%d] SEM_OPEN %s AT %s() FROM %s LINE %d\n", \ |
|
getpid(), a, \ |
|
__FUNCTION__, __FILE__, __LINE__); sem_open(a, __VA_ARGS__); }) |
|
# define sem_unlink(a) \ |
|
({ ufprintf(stderr, "[%d] SEM_UNLINK %s AT %s() FROM %s LINE %d\n", \ |
|
getpid(), a, \ |
|
__FUNCTION__, __FILE__, __LINE__); sem_unlink(a); }) |
|
# define close(a) \ |
|
({ ufprintf(stderr, "[%d] CLOSE %s AT %s() FROM %s LINE %d\n", \ |
|
getpid(), a, \ |
|
__FUNCTION__, __FILE__, __LINE__); close(a); }) |
|
#endif |
|
|
// -1 : erreur provoquée par une bibliothèque externe |
// -1 : erreur provoquée par une bibliothèque externe |
#ifndef RPLARGS |
#ifndef RPLARGS |
Line 1974 typedef struct processus
|
Line 1993 typedef struct processus
|
unsigned char evaluation_forcee; /*Y/N*/ |
unsigned char evaluation_forcee; /*Y/N*/ |
unsigned char instruction_valide; /*Y/N*/ |
unsigned char instruction_valide; /*Y/N*/ |
unsigned char instruction_intrinseque; /*Y/I/N*/ |
unsigned char instruction_intrinseque; /*Y/I/N*/ |
|
unsigned char instruction_sensible; /*Y/N*/ |
unsigned char test_instruction; /*Y/N*/ |
unsigned char test_instruction; /*Y/N*/ |
unsigned char affichage_arguments; /*Y/N*/ |
unsigned char affichage_arguments; /*Y/N*/ |
unsigned char constante_symbolique; /*Y/N*/ |
unsigned char constante_symbolique; /*Y/N*/ |
Line 2469 void *rpl_malloc(struct_processus *s_eta
|
Line 2489 void *rpl_malloc(struct_processus *s_eta
|
void *rpl_realloc(struct_processus *s_etat_processus, void *ptr, size_t s); |
void *rpl_realloc(struct_processus *s_etat_processus, void *ptr, size_t s); |
void rpl_free(struct_processus *s_etat_processus, void *ptr); |
void rpl_free(struct_processus *s_etat_processus, void *ptr); |
void *sys_malloc(size_t s); |
void *sys_malloc(size_t s); |
|
void *sys_realloc(void *ptr, size_t s); |
void sys_free(void *ptr); |
void sys_free(void *ptr); |
|
|
/* |
/* |
Line 3212 void liberation_queue_signaux(struct_pro
|
Line 3233 void liberation_queue_signaux(struct_pro
|
void destruction_queue_signaux(struct_processus *s_etat_processus); |
void destruction_queue_signaux(struct_processus *s_etat_processus); |
int envoi_signal_contexte(struct_processus *s_etat_processus, |
int envoi_signal_contexte(struct_processus *s_etat_processus, |
enum signaux_rpl signal); |
enum signaux_rpl signal); |
int envoi_signal_processus(pid_t pid, enum signaux_rpl signal); |
int envoi_signal_processus(pid_t pid, enum signaux_rpl signal, |
|
logical1 test_ouverture); |
int envoi_signal_thread(pthread_t tid, enum signaux_rpl signal); |
int envoi_signal_thread(pthread_t tid, enum signaux_rpl signal); |
#endif |
#endif |
|
|