--- rpl/src/sequenceur.c 2011/08/09 11:31:37 1.42 +++ rpl/src/sequenceur.c 2012/09/15 12:57:09 1.55 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.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. @@ -63,11 +63,12 @@ sequenceur(struct_processus *s_etat_proc unsigned char tampon_retour; unsigned char *t_ligne; - unsigned long i; - unsigned long j; unsigned long niveau; unsigned long position_courante; + Keymap ancien_keymap; + Keymap nouveau_keymap; + (*s_etat_processus).retour_routine_evaluation = 'N'; if ((*s_etat_processus).debug == d_vrai) @@ -109,9 +110,6 @@ sequenceur(struct_processus *s_etat_proc -------------------------------------------------------------------------------- */ - i = 0; - j = 0; - do { drapeau_appel_definition = d_faux; @@ -182,8 +180,20 @@ sequenceur(struct_processus *s_etat_proc flockfile(stdin); flockfile(stdout); + ancien_keymap = rl_get_keymap(); + nouveau_keymap = rl_copy_keymap(ancien_keymap); + rl_set_keymap(nouveau_keymap); + + rl_bind_key(NEWLINE, readline_analyse_syntaxique); + rl_bind_key(RETURN, readline_analyse_syntaxique); + rl_bind_key(CTRL('g'), readline_effacement); + rl_done = 0; + ligne = readline("RPL/2> "); + rl_set_keymap(ancien_keymap); + rl_free(nouveau_keymap); + funlockfile(stdin); funlockfile(stdout); @@ -1221,6 +1231,8 @@ sequenceur(struct_processus *s_etat_proc (strcmp(instruction_majuscule, "FOR") == 0) || (strcmp(instruction_majuscule, "START") == 0) || (strcmp(instruction_majuscule, "SELECT") == 0) + || + (strcmp(instruction_majuscule, "CRITICAL") == 0) || (strcmp(instruction_majuscule, "CASE") == 0) || (strcmp(instruction_majuscule, "<<") == 0)) { @@ -1262,6 +1274,31 @@ sequenceur(struct_processus *s_etat_proc } else { + // Traitement spécifique pour la fin + // d'une section critique + + if ((*s_etat_processus).l_base_pile_systeme + == NULL) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return(d_erreur); + } + + if ((*(*s_etat_processus).l_base_pile_systeme) + .type_cloture == 'Q') + { + if (pthread_mutex_unlock( + &mutex_sections_critiques) != 0) + { + (*s_etat_processus).erreur_systeme = + d_es_processus; + return(d_erreur); + } + + (*s_etat_processus).sections_critiques--; + } + depilement_pile_systeme(s_etat_processus); if ((*s_etat_processus).erreur_systeme != d_es) @@ -1304,6 +1341,7 @@ sequenceur(struct_processus *s_etat_proc (strcmp(instruction_majuscule, "FOR") == 0) || (strcmp(instruction_majuscule, "START") == 0) || (strcmp(instruction_majuscule, "SELECT") == 0) + || (strcmp(instruction_majuscule, "CRITICAL") == 0) || (strcmp(instruction_majuscule, "CASE") == 0) || (strcmp(instruction_majuscule, "<<") == 0)) { @@ -1398,7 +1436,8 @@ sequenceur(struct_processus *s_etat_proc if ((*s_etat_processus).var_volatile_processus_pere == 0) { - kill((*s_etat_processus).pid_processus_pere, SIGALRM); + envoi_signal_processus((*s_etat_processus).pid_processus_pere, + rpl_sigalrm); } else {