--- rpl/src/instructions_d5.c 2016/03/16 12:54:22 1.145 +++ rpl/src/instructions_d5.c 2017/08/02 14:41:35 1.158 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.25 - Copyright (C) 1989-2016 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.27 + Copyright (C) 1989-2017 Dr. BERTRAND Joël This file is part of RPL/2. @@ -815,6 +815,10 @@ instruction_der(struct_processus *s_etat void instruction_detach(struct_processus *s_etat_processus) { +#ifndef EXPERIMENTAL_CODE + printf("DETACH currently broken is replaced by SPAWN...\n"); + instruction_spawn(s_etat_processus); +#else int pipe_initialisation_segment_signaux[2]; logical1 drapeau; @@ -1088,14 +1092,14 @@ instruction_detach(struct_processus *s_e return; } + verrouillage_threads_concurrents(s_etat_processus); + if (pthread_mutex_lock(&mutex_liste_variables_partagees) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } - verrouillage_threads_concurrents(s_etat_processus); - if (pthread_mutex_lock(&((*s_etat_processus).mutex_allocation_buffer)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1288,8 +1292,13 @@ instruction_detach(struct_processus *s_e * Processus fils */ + // EPERM +#if 0 pthread_mutex_destroy(&mutex_liste_variables_partagees); pthread_mutex_destroy(&mutex_liste_threads); + pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus); + pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); +#endif pthread_mutexattr_init(&attributs_mutex); pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); @@ -1301,15 +1310,23 @@ instruction_detach(struct_processus *s_e pthread_mutex_init(&mutex_liste_threads, &attributs_mutex); pthread_mutexattr_destroy(&attributs_mutex); + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); + pthread_mutex_init(&((*s_etat_processus).mutex_pile_processus), + &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + + pthread_mutexattr_init(&attributs_mutex); + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); + pthread_mutex_init(&((*s_etat_processus).mutex_allocation), + &attributs_mutex); + pthread_mutexattr_destroy(&attributs_mutex); + liberation_queue_signaux(s_etat_processus); creation_queue_signaux(s_etat_processus); - if (lancement_thread_signaux(s_etat_processus) != d_absence_erreur) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - } - routine_recursive = 0; + nombre_thread_surveillance_processus = 0; (*s_etat_processus).pointeur_signal_lecture = 0; (*s_etat_processus).pointeur_signal_ecriture = 0; @@ -1604,16 +1621,11 @@ instruction_detach(struct_processus *s_e // Attente de la réception du signal rpl_sigstart. - for((*s_etat_processus).demarrage_fils = d_faux;;) + for((*s_etat_processus).demarrage_fils = d_faux; + (*s_etat_processus).demarrage_fils != d_vrai; + nanosleep(&attente, NULL)) { scrutation_interruptions(s_etat_processus); - - if ((*s_etat_processus).demarrage_fils == d_vrai) - { - break; - } - - nanosleep(&attente, NULL); } (*s_etat_processus).niveau_initial = (*s_etat_processus).niveau_courant; @@ -1919,6 +1931,8 @@ instruction_detach(struct_processus *s_e l_element_courant = l_element_suivant; } + (*s_etat_processus).s_fichiers = NULL; + /* * Destruction des piles de connecteurs SQL */ @@ -1941,14 +1955,12 @@ instruction_detach(struct_processus *s_e l_element_courant = l_element_suivant; } - (*s_etat_processus).s_connecteurs_sql = NULL; - /* * On ne détruit pas les sockets car il faut utiliser DETACH * pour traiter plusieurs connexions simultanées sur les sockets */ - (*s_etat_processus).s_fichiers = NULL; + (*s_etat_processus).s_connecteurs_sql = NULL; if ((*s_etat_processus).debug == d_vrai) { @@ -2809,17 +2821,20 @@ instruction_detach(struct_processus *s_e liberation_profil(s_etat_processus); } - closelog(); + attente.tv_sec = 0; + attente.tv_nsec = GRANULARITE_us * 1000; - close((*s_argument_thread).pipe_erreurs[1]); - close((*s_argument_thread).pipe_interruptions[1]); - close((*s_argument_thread).pipe_nombre_elements_attente[1]); - close((*s_argument_thread).pipe_objets[1]); - close((*s_argument_thread).pipe_injections[0]); - close((*s_argument_thread).pipe_nombre_injections[0]); - close((*s_argument_thread).pipe_acquittement[0]); + while(nombre_thread_surveillance_processus != 0) + { + nanosleep(&attente, NULL); + INCR_GRANULARITE(attente.tv_nsec); + } + + closelog(); retrait_thread(s_etat_processus); + liberation_contexte_cas(s_etat_processus); + destruction_queue_signaux(s_etat_processus); # ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); @@ -2832,8 +2847,13 @@ instruction_detach(struct_processus *s_e clear_history(); - liberation_contexte_cas(s_etat_processus); - destruction_queue_signaux(s_etat_processus); + close((*s_argument_thread).pipe_erreurs[1]); + close((*s_argument_thread).pipe_interruptions[1]); + close((*s_argument_thread).pipe_nombre_elements_attente[1]); + close((*s_argument_thread).pipe_objets[1]); + close((*s_argument_thread).pipe_injections[0]); + close((*s_argument_thread).pipe_nombre_injections[0]); + close((*s_argument_thread).pipe_acquittement[0]); free((*s_etat_processus).localisation); free((*s_etat_processus).chemin_fichiers_temporaires); @@ -2849,6 +2869,8 @@ instruction_detach(struct_processus *s_e pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer)); pthread_mutex_destroy(&mutex_sections_critiques); + pthread_mutex_destroy(&mutex_liste_variables_partagees); + pthread_mutex_destroy(&mutex_liste_threads); sys_free(s_etat_processus); @@ -2965,6 +2987,7 @@ instruction_detach(struct_processus *s_e } return; +#endif } // vim: ts=4