--- rpl/src/instructions_s10.c 2010/04/21 13:45:49 1.9 +++ rpl/src/instructions_s10.c 2011/01/03 12:08:07 1.28 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.15 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.0.20 + 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" /* @@ -265,6 +265,12 @@ instruction_spawn(struct_processus *s_et 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; @@ -342,6 +348,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(); @@ -391,6 +403,7 @@ instruction_spawn(struct_processus *s_et return; } +# ifndef OS2 if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -408,6 +421,7 @@ instruction_spawn(struct_processus *s_et (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# endif /* * Création de l'objet à retourner @@ -453,6 +467,7 @@ instruction_spawn(struct_processus *s_et (*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) @@ -461,6 +476,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; @@ -480,6 +504,7 @@ instruction_spawn(struct_processus *s_et return; } +# ifndef OS2 if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -498,6 +523,7 @@ instruction_spawn(struct_processus *s_et (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# endif // Attente de l'affectation de la grandeur processus.tid par le thread fils. @@ -882,6 +908,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)) @@ -893,6 +920,7 @@ instruction_sqldisconnect(struct_process { drapeau = d_faux; } + # else if ((*s_etat_processus).langue == 'F') @@ -914,6 +942,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))