--- rpl/src/instructions_s10.c 2010/06/19 15:54:51 1.15 +++ rpl/src/instructions_s10.c 2011/09/20 09:51:43 1.47 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.16 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.3 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -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; @@ -132,9 +129,7 @@ instruction_spawn(struct_processus *s_et if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet).objet)).nom) == d_vrai) { - if ((*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet - == NULL) + if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) @@ -144,13 +139,10 @@ instruction_spawn(struct_processus *s_et } if (recherche_variable_partagee(s_etat_processus, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].nom, - (*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante] - .variable_partagee, (*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].origine) == d_faux) + (*(*s_etat_processus).pointeur_variable_courante).nom, + (*(*s_etat_processus).pointeur_variable_courante) + .variable_partagee, (*(*s_etat_processus) + .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) @@ -219,11 +211,9 @@ instruction_spawn(struct_processus *s_et } else { - if (((*(*s_etat_processus).s_liste_variables - [(*s_etat_processus).position_variable_courante].objet) - .type != RPN) && ((*(*s_etat_processus) - .s_liste_variables[(*s_etat_processus) - .position_variable_courante].objet).type != ADR)) + if (((*(*(*s_etat_processus).pointeur_variable_courante).objet) + .type != RPN) && ((*(*(*s_etat_processus) + .pointeur_variable_courante).objet).type != ADR)) { liberation(s_etat_processus, s_objet); @@ -243,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; @@ -348,6 +298,12 @@ instruction_spawn(struct_processus *s_et pthread_mutex_init(&((*s_argument_thread).mutex), &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); + pthread_mutex_init(&((*s_argument_thread).mutex_nombre_references), + &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + (*s_argument_thread).processus_detache = d_faux; (*s_argument_thread).thread_actif = d_faux; (*s_argument_thread).thread_pere = pthread_self(); @@ -397,6 +353,8 @@ instruction_spawn(struct_processus *s_et return; } +# ifndef OS2 +# ifndef Cygwin if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -414,6 +372,8 @@ instruction_spawn(struct_processus *s_et (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# endif +# endif /* * Création de l'objet à retourner @@ -437,12 +397,6 @@ instruction_spawn(struct_processus *s_et // Lancement du thread fils - if (pthread_mutex_lock(&((*s_nouvel_etat_processus).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - (*s_argument_thread).s_nouvel_etat_processus = s_nouvel_etat_processus; (*s_argument_thread).s_etat_processus = s_etat_processus; @@ -457,8 +411,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, @@ -473,6 +425,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); } @@ -496,6 +449,8 @@ instruction_spawn(struct_processus *s_et return; } +# ifndef OS2 +# ifndef Cygwin if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -514,14 +469,8 @@ instruction_spawn(struct_processus *s_et (*s_etat_processus).erreur_systeme = d_es_processus; return; } - - // Attente de l'affectation de la grandeur processus.tid par le thread fils. - - if (pthread_mutex_lock(&((*s_nouvel_etat_processus).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } +# endif +# endif /* * On copie l'objet plutôt que le pointeur car cet objet peut être @@ -538,6 +487,7 @@ instruction_spawn(struct_processus *s_et if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0) { + pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex)); (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -599,6 +549,7 @@ instruction_spawn(struct_processus *s_et } } + scrutation_interruptions(s_etat_processus); l_element_courant = (*l_element_courant).suivant; } } while(drapeau == d_vrai); @@ -608,7 +559,6 @@ instruction_spawn(struct_processus *s_et .l_base_pile_processus), s_objet_systeme) == d_erreur) { pthread_mutex_unlock(&((*s_etat_processus).mutex)); - pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex)); return; } @@ -621,13 +571,11 @@ instruction_spawn(struct_processus *s_et if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) { - pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex)); return; } if (pthread_mutex_lock(&(*s_argument_thread).mutex) != 0) { - pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex)); (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -637,7 +585,6 @@ instruction_spawn(struct_processus *s_et // Le thread n'existe plus. pthread_join((*s_argument_thread).tid, NULL); - pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex)); pthread_mutex_unlock(&(*s_argument_thread).mutex); (*s_etat_processus).erreur_systeme = d_es_processus; return; @@ -645,13 +592,6 @@ instruction_spawn(struct_processus *s_et if (pthread_mutex_unlock(&(*s_argument_thread).mutex) != 0) { - pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex)); - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - - if (pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex)) != 0) - { (*s_etat_processus).erreur_systeme = d_es_processus; return; } @@ -673,20 +613,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; } @@ -898,6 +830,7 @@ instruction_sqldisconnect(struct_process "MYSQL") == 0) { # ifdef MYSQL_SUPPORT + if ((*((struct_connecteur_sql *) (*(*l_element_courant) .donnee).objet)).descripteur.mysql == (*((struct_connecteur_sql *) (*s_objet).objet)) @@ -909,6 +842,7 @@ instruction_sqldisconnect(struct_process { drapeau = d_faux; } + # else if ((*s_etat_processus).langue == 'F') @@ -930,6 +864,7 @@ instruction_sqldisconnect(struct_process .type, "POSTGRESQL") == 0) { # ifdef POSTGRESQL_SUPPORT + if ((*((struct_connecteur_sql *) (*(*l_element_courant) .donnee).objet)).descripteur.postgresql == (*((struct_connecteur_sql *) (*s_objet).objet)) @@ -1170,25 +1105,18 @@ instruction_smphrdecr(struct_processus * } } -# 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) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } -# endif while(sem_wait((*((struct_semaphore *) (*s_objet_argument).objet)) .semaphore) == -1) { if (errno != EINTR) { + sem_post(&((*s_etat_processus).semaphore_fork)); (*s_etat_processus).erreur_execution = d_ex_semaphore; if ((*s_etat_processus).profilage == d_vrai) @@ -1201,11 +1129,7 @@ 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 + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { if (errno != EINTR) { @@ -1324,19 +1248,16 @@ instruction_smphrtrydecr(struct_processu } } -# ifndef SEMAPHORES_NOMMES if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0) { + if ((*s_etat_processus).profilage == d_vrai) + { + profilage(s_etat_processus, NULL); + } + (*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 (*((integer8 *) (*s_objet_resultat).objet)) = 0; @@ -1376,11 +1297,7 @@ 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 + while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0) { if (errno != EINTR) {