--- rpl/src/instructions_s10.c 2010/03/04 10:17:53 1.4 +++ rpl/src/instructions_s10.c 2011/09/14 17:55:59 1.44 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.12 - 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; @@ -111,8 +108,7 @@ instruction_spawn(struct_processus *s_et * d'une fonction ou d'une expression RPN. */ - if (((*s_objet).type != NOM) && - ((*s_objet).type != RPN)) + if (((*s_objet).type != NOM) && ((*s_objet).type != RPN)) { liberation(s_etat_processus, s_objet); @@ -133,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) @@ -145,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) @@ -220,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); @@ -244,40 +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, 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; @@ -343,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(); @@ -392,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; @@ -409,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 @@ -452,8 +417,7 @@ 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, s_argument_thread) != 0) @@ -462,6 +426,15 @@ instruction_spawn(struct_processus *s_et return; } + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; + + while((*s_argument_thread).thread_actif == d_faux) + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + } + if (pthread_attr_destroy(&attributs) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -481,6 +454,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; @@ -499,6 +474,8 @@ instruction_spawn(struct_processus *s_et (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# endif +# endif // Attente de l'affectation de la grandeur processus.tid par le thread fils. @@ -658,20 +635,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; } @@ -795,7 +764,7 @@ instruction_sqlconnect(struct_processus /* ================================================================================ - Fonction 'sqlconnect' + Fonction 'sqldisconnect' ================================================================================ Entrées : -------------------------------------------------------------------------------- @@ -883,6 +852,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)) @@ -894,6 +864,7 @@ instruction_sqldisconnect(struct_process { drapeau = d_faux; } + # else if ((*s_etat_processus).langue == 'F') @@ -915,6 +886,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)) @@ -1155,7 +1127,7 @@ instruction_smphrdecr(struct_processus * } } - 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; @@ -1166,6 +1138,7 @@ instruction_smphrdecr(struct_processus * { 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) @@ -1178,18 +1151,15 @@ instruction_smphrdecr(struct_processus * } } - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + 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) @@ -1297,8 +1267,13 @@ instruction_smphrtrydecr(struct_processu } } - 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; } @@ -1341,18 +1316,15 @@ instruction_smphrtrydecr(struct_processu } } - while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1) + 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)