--- rpl/src/rpl.h 2011/06/23 13:03:39 1.99 +++ rpl/src/rpl.h 2012/09/10 15:54:13 1.174 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.3 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.10 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -23,21 +23,27 @@ #ifndef INCLUSION_RPL #define INCLUSION_RPL -#define _GNU_SOURCE -#define _POSIX_C_SOURCE 200112L +#ifndef __RPLCAS +# define _GNU_SOURCE +# define _XOPEN_SOURCE 700 +#endif + #define _REENTRANT -#ifdef Darwin -# define _DARWIN_C_SOURCE -#endif +#ifndef __RPLCAS +# ifdef Darwin +# define _DARWIN_C_SOURCE +# endif -#ifdef OpenBSD -# define _BSD_SOURCE +# ifdef OpenBSD +# define _BSD_SOURCE +# endif #endif #ifdef OS2 -# define _BSD_SOURCE -# define _XOPEN_SOURCE 600 +# ifndef __RPLCAS +# define _BSD_SOURCE +# endif # include enum { SHUT_RD = 0, SHUT_WR, SHUT_RDWR }; @@ -65,6 +71,7 @@ #include #include #include +#include #ifndef RPLARGS # include @@ -85,6 +92,7 @@ # include # include # include +# include # ifdef OS2 # undef pthread_mutexattr_settype @@ -92,9 +100,7 @@ # endif # include - -# ifdef _BROKEN_SIGINFO -# include +# ifdef SHARED_MEMORY # include # endif @@ -119,25 +125,30 @@ ULONG *nopened; ULONG allocated; } sem_t; -# else +# else // IPCS_SYSV typedef struct { int sem; + int alloue; unsigned char *path; pid_t pid; + pthread_t tid; } 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, ...); 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(const char *nom); + int sem_unlink_SysV(char *nom); int sem_destroy_SysV(sem_t *sem); # endif @@ -155,6 +166,11 @@ # include "openssl/evp.h" # include "sqlite3.h" +# include "sigsegv.h" +# ifdef OS2 + // Bug de libsigsegv +# undef HAVE_STACK_OVERFLOW_RECOVERY +# endif # define HAVE_INLINE # define GSL_RANGE_CHECK_OFF @@ -200,43 +216,97 @@ # 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 ================================================================================ */ -#ifdef _BROKEN_SIGINFO -# define SIGHANDLER_ARGS int signal -# ifdef SA_SIGINFO -# undef SA_SIGINFO -# endif -# define SA_SIGINFO 0 - -# ifndef __BROKEN_SIGINFO_ROUTINES__ +// Néant -// pthread_kill() est une macro sous OS/2. -# ifdef pthread_kill -# undef pthread_kill -# endif +/* +================================================================================ + TYPES +================================================================================ +*/ -# define kill(a, b) kill_broken_siginfo(a, b) -# define pthread_kill(a, b) pthread_kill_broken_siginfo(a, b) -# endif +typedef FILE file; +typedef unsigned char t_8_bits; - int kill_broken_siginfo(pid_t pid, int signal); - int pthread_kill_broken_siginfo(pthread_t tid, int signal); - pid_t origine_signal(int signal); - int queue_in(pid_t pid, int signal); +#ifndef RPLARGS +# include "rpltypes-conv.h" #else -# define SIGHANDLER_ARGS int signal, siginfo_t *siginfo, void *context +# include "rpltypes.h" #endif -#ifdef OpenBSD -# ifdef PTHREAD_SCOPE_SYSTEM -# undef PTHREAD_SCOPE_SYSTEM +enum signaux_rpl +{ + rpl_signull = 0, + rpl_sigint, + rpl_sigterm, + rpl_sigstart, // Signal envoyé par un père pour lancer son fils. + rpl_sigcont, // Signal de redémarrage d'un processus arrêté par + // SUSPEND + rpl_sigstop, // Signal d'arrêt envoyé par l'instruction STOP ou + // FUSE. (FSTOP) + rpl_sigabort, // Signal envoyé par l'instruction ABORT (à regrouper + // avec FABORT) + rpl_sigurg, // Signal d'arrêt urgent + rpl_siginject, // Signal indiquant la présence d'une donnée à lire + // envoyée depuis le père + rpl_sigalrm, // Signal d'alarme (erreur système) depuis un fils + rpl_sighup, + rpl_sigtstp, + rpl_sigexcept, + rpl_sigmax +}; + +#define LONGUEUR_QUEUE_SIGNAUX 1024 + +// Une structure s_queue_signaux est créée par processus (et non par thread). +// Elle est projetée dans un segment de mémoire partagée pour qu'elle soit +// accessible à la fois du père et des fils. + +#ifndef RPLARGS +typedef struct queue_signaux +{ +# ifndef IPCS_SYSV +# ifndef SEMAPHORES_NOMMES + sem_t semaphore; + sem_t signalisation; +# endif +# else + sem_t semaphore; + sem_t signalisation; +# endif + + volatile int pointeur_lecture; + volatile int pointeur_ecriture; + pthread_t thread_signaux; + volatile logical1 requete_arret; + + volatile struct + { + pid_t pid; + enum signaux_rpl signal; + } queue[LONGUEUR_QUEUE_SIGNAUX]; +} struct_queue_signaux; + +__EXTERN__ struct_queue_signaux *s_queue_signaux; +__EXTERN__ int f_queue_signaux; + +# ifdef SEMAPHORES_NOMMES + __EXTERN__ sem_t *semaphore_queue_signaux; + __EXTERN__ sem_t *semaphore_signalisation; # endif -# define PTHREAD_SCOPE_SYSTEM 0 #endif #ifdef OS2 @@ -254,6 +324,13 @@ union semun }; #endif +#ifndef RTLD_LOCAL +# define RTLD_LOCAL 0 +#endif + +#ifndef SIGSTKSZ +# define SIGSTKSZ 65536 +#endif /* ================================================================================ @@ -266,6 +343,7 @@ union semun # 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__) @@ -286,29 +364,12 @@ union semun // SIGINT // SIGTSTP // SIGCONT -// SIGURG // SIGPIPE +// SIGUSR1 et SIGUSR2 sont utilisé par libsigsegv. +// SIGHUP // SIGALRM -// Arrêt par STOP -# define SIGFSTOP SIGUSR1 -// Démarrage d'un processus fils -# define SIGSTART SIGUSR2 -// Injection de données -# define SIGINJECT SIGQUIT -// Arrêt général -# ifndef OpenBSD -// La libpthread d'OpenBSD utilise SIGPROF -# define SIGABORT SIGPROF -# else -# define SIGABORT SIGTHR -# endif -// Arrêt d'un processus fils depuis autre chose que STOP -# if defined(Darwin) || defined(OpenBSD) -# define SIGFABORT SIGINFO -# else -# define SIGFABORT SIGPOLL -# endif +# define SIGTEST 255 // Nombre d'interruptions disponibles # define d_NOMBRE_INTERRUPTIONS 64 @@ -351,21 +412,6 @@ 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 ================================================================================ */ @@ -375,94 +421,51 @@ typedef unsigned char t_8_bits; # define LONGUEUR_NOM_SEMAPHORE 64 # endif -# ifndef MAIN_RPL -# ifdef _BROKEN_SIGINFO - extern int *fifos_signaux; -# endif - - extern jmp_buf contexte; - extern jmp_buf contexte_initial; - -# ifdef SEMAPHORES_NOMMES - extern pthread_mutex_t mutex_sem; -# endif - - extern pthread_key_t semaphore_fork_processus_courant; - - extern sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_liste_threads; - - extern sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - 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 +# ifdef SEMAPHORES_NOMMES +# define __PTR__ * # else -# ifdef _BROKEN_SIGINFO - int *fifos_signaux; -# endif +# define __PTR__ +# endif - jmp_buf contexte; - jmp_buf contexte_initial; + __EXTERN__ jmp_buf contexte_ecriture; + __EXTERN__ jmp_buf contexte_impression; + __EXTERN__ jmp_buf contexte_initial; + __EXTERN__ jmp_buf contexte_processus; + __EXTERN__ jmp_buf contexte_thread; -# ifdef SEMAPHORES_NOMMES - pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; -# endif + __EXTERN__ volatile int signal_test; - pthread_key_t semaphore_fork_processus_courant; + __EXTERN__ pid_t pid_processus_pere; - sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_liste_threads; +# ifdef SEMAPHORES_NOMMES + __EXTERN__ pthread_mutex_t mutex_sem __STATIC_MUTEX_INITIALIZATION__; +# endif - sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_gestionnaires_signaux; + __EXTERN__ pthread_mutex_t mutex_liste_threads + __STATIC_MUTEX_INITIALIZATION__; + __EXTERN__ pthread_mutex_t mutex_gestionnaires_signaux_atomique + __STATIC_MUTEX_INITIALIZATION__; - sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_gestionnaires_signaux_atomique; + __EXTERN__ sem_t __PTR__ semaphore_gestionnaires_signaux; -# ifdef SEMAPHORES_NOMMES - unsigned char noms_semaphores[4][LONGUEUR_NOM_SEMAPHORE]; - sem_t *semaphores_nommes[4]; -# endif -# endif + __EXTERN__ volatile int routine_recursive; #endif #ifdef SEMAPHORES_NOMMES -enum t_semaphore { sem_liste_threads = 0, - sem_gestionnaires_signaux = 1, - 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); +#define SEM_FORK 0 +#define SEM_QUEUE 1 +#define SEM_SIGNAUX 2 +#define SEM_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); + +// 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_post(semaphore) \ @@ -494,10 +497,6 @@ int sem_getvalue2(sem_t *semaphore, int #define ufprintf(flux, ...) transliterated_fprintf(NULL, \ 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 # define fopen(...) ({ FILE *desc; \ while((desc = fopen(__VA_ARGS__)) == NULL) \ @@ -508,9 +507,6 @@ int sem_getvalue2(sem_t *semaphore, int # define fclose(...) ({ int ios; \ while((ios = fclose(__VA_ARGS__)) != 0) \ { 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; \ while((ios = fflush((flux == stdout) ? stderr : flux)) != 0) \ { if ((errno != EINTR) && (errno != 0)) break; } ios; }) @@ -786,6 +782,7 @@ pid_t debug_fork(); # define d_es_contexte __erreur(2013) # define d_es_somme_controle __erreur(2014) # define d_es_semaphore __erreur(2015) +# define d_es_mutex_acquis_autre_thread __erreur(2016) #endif /* @@ -923,6 +920,11 @@ pid_t debug_fork(); # define d_ex_nom_implicite __erreur(81) # define d_ex_version_bibliotheque __erreur(82) # define d_ex_creation_variable_globale __erreur(83) +# define d_ex_erreur_interne_rplcas __erreur(84) +# define d_ex_fichier_corrompu __erreur(85) +# define d_ex_mutex_acquis_autre_thread __erreur(86) +# define d_ex_expression_reguliere __erreur(87) +# define d_ex_instruction_indisponible __erreur(88) #endif @@ -973,6 +975,7 @@ pid_t debug_fork(); #define VIN __RPL_VIN #define VRL __RPL_VRL +enum t_rplcas_commandes { RPLCAS_INTEGRATION = 0, RPLCAS_LIMITE }; enum t_type { ADR = 0, ALG, BIN, CHN, CPL, FCH, FCT, INT, LST, MCX, MIN, MRL, MTX, NOM, NON, PRC, REL, RPN, SCK, @@ -1109,6 +1112,7 @@ typedef struct fichier typedef struct rpl_mutex { pthread_mutex_t mutex; + pthread_t tid; } struct_mutex; #endif @@ -1182,8 +1186,11 @@ typedef struct descripteur_fichier pid_t pid; pthread_t tid; - file *descripteur_c; - sqlite3 *descripteur_sqlite; + union + { + file *descripteur_c; + sqlite3 *descripteur_sqlite; + }; } struct_descripteur_fichier; #endif @@ -1278,6 +1285,41 @@ 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 -------------------------------------------------------------------------------- */ @@ -1379,9 +1421,6 @@ typedef struct descripteur_thread logical1 processus_detache; logical1 destruction_objet; - sigset_t oldset; - sigset_t set; - volatile signed long nombre_references; } struct_descripteur_thread; @@ -1822,19 +1861,11 @@ typedef struct processus pthread_t thread_fusible; pthread_t thread_surveille_par_fusible; -# if !defined(Cygwin) -# if !(OpenBSD) - stack_t pile_signal; -# else -# ifdef SA_ONSTACK -# undef SA_ONSTACK -# endif -# define SA_ONSTACK 0 -# endif -# else -# define SA_ONSTACK 0 -# define RTLD_LOCAL 0 -# endif + volatile int pointeur_signal_ecriture; + volatile int pointeur_signal_lecture; + volatile enum signaux_rpl signaux_en_queue[LONGUEUR_QUEUE_SIGNAUX]; + volatile logical1 demarrage_fils; + volatile logical1 redemarrage_processus; /* Contextes */ @@ -2137,6 +2168,8 @@ typedef struct processus gsl_rng *generateur_aleatoire; const gsl_rng_type *type_generateur_aleatoire; + void *contexte_cas; + integer8 nombre_arguments; /* @@ -2159,6 +2192,7 @@ typedef struct processus pid_t pid_processus_pere; pthread_t tid_processus_pere; + pthread_t tid; logical1 processus_detache; @@ -2174,18 +2208,18 @@ typedef struct processus pthread_mutex_t mutex; pthread_mutex_t mutex_allocation; - // Sémaphore autorisant les fork() - sem_t -# ifdef SEMAPHORES_NOMMES - * -# endif - semaphore_fork; + // Mutex autorisant les fork() + sem_t __PTR__ semaphore_fork; /* Mutexes */ struct_liste_chainee *liste_mutexes; pthread_mutex_t protection_liste_mutexes; +/* Drapeau nécessaire à RESTART */ + + volatile logical1 requete_redemarrage; + /* Gestion optimisée de la mémoire */ double estimation_taille_pile_tampon; @@ -2283,6 +2317,7 @@ typedef struct fonction // BEGIN C PROTOTYPES void instruction_sensible_e(struct_processus *s_etat_processus); void instruction_sensible_i(struct_processus *s_etat_processus); +void instruction_sensible_infinity(struct_processus *s_etat_processus); void instruction_abort(struct_processus *s_etat_processus); void instruction_abs(struct_processus *s_etat_processus); @@ -2479,6 +2514,7 @@ void instruction_in(struct_processus *s_ void instruction_incr(struct_processus *s_etat_processus); void instruction_indep(struct_processus *s_etat_processus); void instruction_input(struct_processus *s_etat_processus); +void instruction_infinity(struct_processus *s_etat_processus); void instruction_inquire(struct_processus *s_etat_processus); void instruction_int(struct_processus *s_etat_processus); void instruction_interrupt(struct_processus *s_etat_processus); @@ -2502,6 +2538,7 @@ void instruction_lcd_fleche(struct_proce void instruction_lchol(struct_processus *s_etat_processus); void instruction_le(struct_processus *s_etat_processus); void instruction_legv(struct_processus *s_etat_processus); +void instruction_limit(struct_processus *s_etat_processus); void instruction_line(struct_processus *s_etat_processus); void instruction_list_fleche(struct_processus *s_etat_processus); void instruction_ln(struct_processus *s_etat_processus); @@ -2570,6 +2607,7 @@ void instruction_pmax(struct_processus * void instruction_pmin(struct_processus *s_etat_processus); void instruction_poke(struct_processus *s_etat_processus); void instruction_polar(struct_processus *s_etat_processus); +void instruction_poll(struct_processus *s_etat_processus); void instruction_pos(struct_processus *s_etat_processus); void instruction_pourcent(struct_processus *s_etat_processus); void instruction_pourcent_ch(struct_processus *s_etat_processus); @@ -2626,9 +2664,11 @@ void instruction_read(struct_processus * void instruction_recode(struct_processus *s_etat_processus); void instruction_recv(struct_processus *s_etat_processus); void instruction_redraw(struct_processus *s_etat_processus); +void instruction_regex(struct_processus *s_etat_processus); void instruction_relax(struct_processus *s_etat_processus); void instruction_remove(struct_processus *s_etat_processus); void instruction_res(struct_processus *s_etat_processus); +void instruction_restart(struct_processus *s_etat_processus); void instruction_recall(struct_processus *s_etat_processus); void instruction_regv(struct_processus *s_etat_processus); void instruction_repeat(struct_processus *s_etat_processus); @@ -2694,6 +2734,7 @@ void instruction_sqlquery(struct_process void instruction_sqrt(struct_processus *s_etat_processus); void instruction_sr(struct_processus *s_etat_processus); void instruction_srb(struct_processus *s_etat_processus); +void instruction_srev(struct_processus *s_etat_processus); void instruction_sst(struct_processus *s_etat_processus); void instruction_star_d(struct_processus *s_etat_processus); void instruction_star_h(struct_processus *s_etat_processus); @@ -2755,7 +2796,6 @@ void instruction_t_vers_l(struct_process void instruction_ucase(struct_processus *s_etat_processus); void instruction_uchol(struct_processus *s_etat_processus); -void instruction_undo(struct_processus *s_etat_processus); void instruction_unlock(struct_processus *s_etat_processus); void instruction_unprotect(struct_processus *s_etat_processus); void instruction_until(struct_processus *s_etat_processus); @@ -2810,7 +2850,6 @@ void affichage_pile(struct_processus *s_ niveau_courant); #endif -void *allocation(struct_processus *s_etat_processus, enum t_type type); void *allocation_maillon(struct_processus *s_etat_processus); #ifndef RPLARGS @@ -2822,6 +2861,8 @@ void appel_gnuplot(struct_processus *s_e void cf(struct_processus *s_etat_processus, unsigned char indice_drapeau); void cond(struct_processus *s_etat_processus, struct_matrice *s_matrice, real8 *condition); +void conversion_chaine(struct_processus *s_etat_processus, + unsigned char *chaine, unsigned char type); void conversion_decimal_vers_hms(real8 *angle); void conversion_degres_vers_radians(real8 *angle); void conversion_element_tex(unsigned char **element, unsigned char *fonction); @@ -2872,6 +2913,7 @@ void impression_tex(struct_processus *s_ void informations(struct_processus *s_etat_processus); void initialisation_allocateur(struct_processus *s_etat_processus); void initialisation_completion(void); +void initialisation_contexte_cas(struct_processus *s_etat_processus); void initialisation_drapeaux(struct_processus *s_etat_processus); void initialisation_generateur_aleatoire(struct_processus *s_etat_processus, logical1 initialisation_automatique, unsigned long int racine); @@ -2889,17 +2931,15 @@ void insertion_thread_surveillance(struc void integrale_romberg(struct_processus *s_etat_processus, struct_objet *s_expression, unsigned char *variable, real8 a, real8 b, real8 precision); -void interruption1(SIGHANDLER_ARGS); -void interruption2(SIGHANDLER_ARGS); -void interruption3(SIGHANDLER_ARGS); -void interruption4(SIGHANDLER_ARGS); -void interruption5(SIGHANDLER_ARGS); -void interruption6(SIGHANDLER_ARGS); -void interruption7(SIGHANDLER_ARGS); -void interruption8(SIGHANDLER_ARGS); -void interruption9(SIGHANDLER_ARGS); -void interruption10(SIGHANDLER_ARGS); -void interruption11(SIGHANDLER_ARGS); +void interface_cas(struct_processus *s_etat_processus, + enum t_rplcas_commandes commande); +void interruption1(int signal); +void interruption2(int signal); +void interruption3(int signal); +void interruption4(int signal); +void interruption5(int signal); +void interruption6(int signal); +void interruption_depassement_pile(int urgence, stackoverflow_context_t scp); void inversion_matrice(struct_processus *s_etat_processus, struct_matrice *s_matrice); void lancement_daemon(struct_processus *s_etat_processus); @@ -2916,6 +2956,7 @@ void liberation_arbre_instructions(struc struct_instruction *arbre); void liberation_arbre_variables(struct_processus *s_etat_processus, struct_arbre_variables *arbre, logical1 definitions); +void liberation_contexte_cas(struct_processus *s_etat_processus); void liberation_generateur_aleatoire(struct_processus *s_etat_processus); void liberation_threads(struct_processus *s_etat_processus); void liberation_profil(struct_processus *s_etat_processus); @@ -2932,7 +2973,12 @@ void retrait_thread(struct_processus *s_ void retrait_thread_surveillance(struct_processus *s_etat_processus, struct_descripteur_thread *s_argument_thread); void rplcore(struct_processus *s_etat_processus); +#endif + void scrutation_injection(struct_processus *s_etat_processus); + +#ifndef RPLARGS +void scrutation_interruptions(struct_processus *s_etat_processus); void sf(struct_processus *s_etat_processus, unsigned char indice_drapeau); void *surveillance_processus(void *argument); void swap(void *variable_1, void *variable_2, unsigned long taille_octets); @@ -2960,12 +3006,20 @@ void valeurs_singulieres(struct_processu void verrouillage_threads_concurrents(struct_processus *s_etat_processus); #endif +/* +-------------------------------------------------------------------------------- + Fonctions de gestion des signaux +-------------------------------------------------------------------------------- +*/ + #ifndef RPLARGS -#ifdef _BROKEN_SIGINFO -void creation_fifos_signaux(struct_processus *s_etat_processus); -void destruction_fifos_signaux(struct_processus *s_etat_processus); -void liberation_fifos_signaux(struct_processus *s_etat_processus); -#endif +void creation_queue_signaux(struct_processus *s_etat_processus); +void liberation_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, + enum signaux_rpl signal); +int envoi_signal_processus(pid_t pid, enum signaux_rpl signal); +int envoi_signal_thread(pthread_t tid, enum signaux_rpl signal); #endif /* @@ -2986,7 +3040,8 @@ complex16 sommation_vecteur_complexe(com */ #ifndef RPLARGS -int rplinit(int argc, char *argv[], unsigned char ***resultats, char *rpl_home); +int rplinit(int argc, char *argv[], char *envp[], + unsigned char ***resultats, char *rpl_home); #endif /* @@ -3044,12 +3099,15 @@ struct_liste_chainee *sauvegarde_argumen #ifndef RPLARGS unsigned char *analyse_algebrique(struct_processus *s_etat_processus, 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 *s_etat_processus); unsigned char *compactage(unsigned char *chaine); unsigned char *conversion_majuscule(unsigned char *chaine); unsigned char *creation_nom_fichier(struct_processus *s_etat_processus, unsigned char *chemin); +unsigned char *date_compilation(); unsigned char *extraction_chaine(unsigned char *chaine, unsigned long i, unsigned long j); unsigned char *formateur(struct_processus *s_etat_processus, long offset, @@ -3063,6 +3121,9 @@ unsigned char *formateur_flux(struct_pro unsigned char *formateur_fichier_nombre(struct_processus *s_etat_processus, void *valeur_numerique, unsigned char type, long longueur, long longueur_champ, unsigned char format); +unsigned char *formateur_fichier_binaire_nombre(struct_processus + *s_etat_processus, void *valeur_numerique, unsigned char type, + long longueur, long *longueur_conversion); unsigned char *formateur_fichier_reel(struct_processus *s_etat_processus, void *valeur_numerique, unsigned char type, long longueur, long longueur_champ, unsigned char format); @@ -3070,9 +3131,9 @@ unsigned char *formateur_nombre(struct_p void *valeur_numerique, unsigned char type); unsigned char *formateur_reel(struct_processus *s_etat_processus, void *valeur_numerique, unsigned char type); -unsigned char *interface_cas(struct_processus *s_etat_processus, - unsigned char *commande, unsigned char *argument); unsigned char *messages(struct_processus *s_etat_processus); +unsigned char *pointeur_ieme_caractere(struct_processus *s_etat_processus, + unsigned char *chaine, integer8 position); unsigned char *purification_chaine(unsigned char *chaine); unsigned char *reencodage(struct_processus *s_etat_processus, unsigned char *chaine_entree, unsigned char *codage_entree, @@ -3095,6 +3156,8 @@ logical1 caracteristiques_fichier(struct unsigned long *unite); logical1 controle(struct_processus *s_etat_processus, unsigned char *fichier, unsigned char *type, unsigned char *somme_candidate); +logical1 controle_integrite(struct_processus *s_etat_processus, + unsigned char *executable_candidat, unsigned char *executable); logical1 creation_variable(struct_processus *s_etat_processus, struct_variable *s_variable, unsigned char autorisation_creation_variable_statique, @@ -3158,6 +3221,7 @@ logical1 test_cfsf(struct_processus *s_e unsigned char indice_drapeau); logical1 test_expression_rpn(unsigned char *chaine); logical1 test_fonction(unsigned char *chaine); +logical1 validation_chaine(unsigned char *chaine); #endif /* @@ -3180,11 +3244,16 @@ ssize_t write_atomic(struct_processus *s */ int alsprintf(unsigned char **strp, const char *fmt, ...); +int interruption_violation_access(void *adresse_fautive, int gravite); +#ifndef RPLARGS int liste_variables(struct_processus *s_etat_processus, struct_tableau_variables *tableau, int position, struct_arbre_variables *l_element_courant); int nombre_variables(struct_processus *s_etat_processus, struct_arbre_variables *l_element_courant); +int readline_analyse_syntaxique(int count, int key); +int readline_effacement(int count, int key); +#endif int tex_fprintf(struct_processus *s_etat_processus, file *flux, const char *format, ...); int transliterated_fprintf(struct_processus *s_etat_processus, file *flux, @@ -3201,7 +3270,6 @@ int wrapper_instruction_intrinseque(void #ifndef RPLARGS unsigned char longueur_entiers_binaires(struct_processus *s_etat_processus); -unsigned char recherche_longueur_optimale(integer8 parametre); #endif /* @@ -3222,6 +3290,10 @@ logical8 masque_entiers_binaires(struct_ #ifndef RPLARGS integer8 occupation_memoire(struct_objet *s_objet); +integer8 longueur_chaine(struct_processus *s_etat_processus, + unsigned char *chaine); +integer8 position_caractere_de_chaine(struct_processus *s_etat_processus, + unsigned char *chaine, unsigned char *position); #endif /* @@ -3266,6 +3338,7 @@ struct_descripteur_fichier *descripteur_ struct_objet *copie_objet(struct_processus *s_etat_processus, struct_objet *s_objet, unsigned char type); +struct_objet *allocation(struct_processus *s_etat_processus, enum t_type type); #ifndef RPLARGS struct_objet *formateur_date(struct_processus *s_etat_processus, struct timeval *temps);