--- rpl/src/instructions_d5.c 2010/04/07 13:45:05 1.9 +++ rpl/src/instructions_d5.c 2010/04/17 18:57:35 1.10 @@ -1290,21 +1290,61 @@ instruction_detach(struct_processus *s_e * Processus fils */ +# ifndef SEMAPHORES_NOMMES sem_post(&semaphore_gestionnaires_signaux); sem_destroy(&semaphore_gestionnaires_signaux); sem_init(&semaphore_gestionnaires_signaux, 0, 0); +# else + sem_post(semaphore_gestionnaires_signaux); + sem_destroy2(semaphore_gestionnaires_signaux, + sem_gestionnaires_signaux); + if ((semaphore_gestionnaires_signaux = sem_init2(0, + sem_gestionnaires_signaux)) == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + } +# endif + +# ifndef SEMAPHORES_NOMMES sem_post(&semaphore_liste_threads); sem_destroy(&semaphore_liste_threads); sem_init(&semaphore_liste_threads, 0, 1); +# else + sem_post(semaphore_liste_threads); + sem_destroy2(semaphore_liste_threads, sem_liste_threads); + if ((semaphore_liste_threads = sem_init2(1, + sem_liste_threads)) == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + } +# endif + +# ifndef SEMAPHORES_NOMMES sem_destroy(&semaphore_gestionnaires_signaux_atomique); sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); - sem_trywait(&((*s_etat_processus).semaphore_fork)); +# else + sem_destroy2(semaphore_gestionnaires_signaux_atomique, + sem_gestionnaires_signaux_atomique); + if ((semaphore_gestionnaires_signaux_atomique = sem_init2(1, + sem_gestionnaires_signaux_atomique)) == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + } + + sem_trywait((*s_etat_processus).semaphore_fork); +# endif + +# ifndef SEMAPHORES_NOMMES if (pthread_setspecific(semaphore_fork_processus_courant, &((*s_etat_processus).semaphore_fork)) != 0) +# else + if (pthread_setspecific(semaphore_fork_processus_courant, + (*s_etat_processus).semaphore_fork) != 0) +# endif { (*s_etat_processus).erreur_systeme = d_es_processus; } @@ -2576,17 +2616,31 @@ instruction_detach(struct_processus *s_e pthread_key_delete(semaphore_fork_processus_courant); +# ifndef SEMAPHORES_NOMMES sem_post(&((*s_etat_processus).semaphore_fork)); sem_destroy(&((*s_etat_processus).semaphore_fork)); +# else + sem_post((*s_etat_processus).semaphore_fork); + sem_destroy2((*s_etat_processus).semaphore_fork, sem_fork); +# endif free((*s_etat_processus).localisation); free(s_etat_processus); free(s_argument_thread); +# ifndef SEMAPHORES_NOMMES sem_destroy(&semaphore_liste_threads); sem_post(&semaphore_gestionnaires_signaux); sem_destroy(&semaphore_gestionnaires_signaux); sem_destroy(&semaphore_gestionnaires_signaux_atomique); +# else + sem_destroy2(semaphore_liste_threads, sem_liste_threads); + sem_post(semaphore_gestionnaires_signaux); + sem_destroy2(semaphore_gestionnaires_signaux, + sem_gestionnaires_signaux); + sem_destroy2(semaphore_gestionnaires_signaux_atomique, + sem_gestionnaires_signaux_atomique); +# endif clear_history();