--- rpl/src/instructions_s10.c 2011/07/22 07:38:39 1.40 +++ rpl/src/instructions_s10.c 2011/09/15 17:51:43 1.45 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.1 + RPL/2 (R) version 4.1.3 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -48,9 +48,6 @@ instruction_spawn(struct_processus *s_et pthread_t thread_id; pthread_t thread_surveillance; - sigset_t oldset; - sigset_t set; - struct_descripteur_thread *s_argument_thread; struct_liste_chainee *l_element_courant; @@ -236,46 +233,6 @@ instruction_spawn(struct_processus *s_et } } - if (sigemptyset(&set) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - if (sigaddset(&set, SIGSTART) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - /* - * Le signal SIGFSTOP doit être traité ! - */ - - if (sigaddset(&set, SIGFSTOP) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - if (sigaddset(&set, SIGFABORT) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - if (sigaddset(&set, SIGURG) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - if (pthread_sigmask(SIG_BLOCK, &set, &oldset) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - if ((s_argument_thread = malloc(sizeof(struct_descripteur_thread))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -460,8 +417,6 @@ instruction_spawn(struct_processus *s_et (*s_argument_thread).destruction_objet = d_faux; } - (*s_argument_thread).set = set; - (*s_argument_thread).oldset = oldset; (*s_argument_thread).thread_actif = d_faux; if (pthread_create(&thread_id, &attributs, lancement_thread, @@ -476,6 +431,7 @@ instruction_spawn(struct_processus *s_et while((*s_argument_thread).thread_actif == d_faux) { + scrutation_interruptions(s_etat_processus); nanosleep(&attente, NULL); INCR_GRANULARITE(attente.tv_nsec); } @@ -606,6 +562,7 @@ instruction_spawn(struct_processus *s_et } } + scrutation_interruptions(s_etat_processus); l_element_courant = (*l_element_courant).suivant; } } while(drapeau == d_vrai); @@ -680,20 +637,12 @@ instruction_spawn(struct_processus *s_et // Le fils peut être présent sans être en attente du signal de départ. - if (pthread_kill((*s_argument_thread).tid, SIGSTART) != 0) + if (envoi_signal_thread((*s_argument_thread).tid, rpl_sigstart) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } - if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - sigpending(&set); - return; } @@ -1180,25 +1129,18 @@ instruction_smphrdecr(struct_processus * } } -# ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } -# else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } -# endif while(sem_wait((*((struct_semaphore *) (*s_objet_argument).objet)) .semaphore) == -1) { if (errno != EINTR) { + pthread_mutex_lock(&((*s_etat_processus).mutex_fork)); (*s_etat_processus).erreur_execution = d_ex_semaphore; if ((*s_etat_processus).profilage == d_vrai) @@ -1211,22 +1153,15 @@ instruction_smphrdecr(struct_processus * } } -# ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) -# else - while(sem_wait((*s_etat_processus).semaphore_fork) == -1) -# endif + if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) { - if (errno != EINTR) + if ((*s_etat_processus).profilage == d_vrai) { - if ((*s_etat_processus).profilage == d_vrai) - { - profilage(s_etat_processus, NULL); - } - - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + profilage(s_etat_processus, NULL); } + + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } if ((*s_etat_processus).profilage == d_vrai) @@ -1334,19 +1269,16 @@ instruction_smphrtrydecr(struct_processu } } -# ifndef SEMAPHORES_NOMMES - if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } -# else - if (sem_post((*s_etat_processus).semaphore_fork) != 0) + if (pthread_mutex_unlock(&((*s_etat_processus).mutex_fork)) != 0) { + if ((*s_etat_processus).profilage == d_vrai) + { + profilage(s_etat_processus, NULL); + } + (*s_etat_processus).erreur_systeme = d_es_processus; return; } -# endif (*((integer8 *) (*s_objet_resultat).objet)) = 0; @@ -1386,22 +1318,15 @@ instruction_smphrtrydecr(struct_processu } } -# ifndef SEMAPHORES_NOMMES - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) -# else - while(sem_wait((*s_etat_processus).semaphore_fork) == -1) -# endif + if (pthread_mutex_lock(&((*s_etat_processus).mutex_fork)) != 0) { - if (errno != EINTR) + if ((*s_etat_processus).profilage == d_vrai) { - if ((*s_etat_processus).profilage == d_vrai) - { - profilage(s_etat_processus, NULL); - } - - (*s_etat_processus).erreur_systeme = d_es_processus; - return; + profilage(s_etat_processus, NULL); } + + (*s_etat_processus).erreur_systeme = d_es_processus; + return; } if ((*s_etat_processus).profilage == d_vrai)