--- rpl/src/instructions_d5.c 2010/06/18 08:30:50 1.28 +++ rpl/src/instructions_d5.c 2010/08/17 11:59:27 1.37 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.16 + RPL/2 (R) version 4.0.18 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -1159,6 +1159,17 @@ instruction_detach(struct_processus *s_e verrouillage_threads_concurrents(s_etat_processus); (*s_argument_thread).pid = fork(); + +# ifdef OS2 + if ((*s_argument_thread).pid == 0) + { + sem_init(&semaphore_liste_threads, 0, 1); + sem_init(&semaphore_gestionnaires_signaux, 0, 0); + sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1); + sem_init(&((*s_etat_processus).semaphore_fork), 0, 0); + } +# endif + deverrouillage_threads_concurrents(s_etat_processus); pthread_sigmask(SIG_SETMASK, &oldset2, NULL); @@ -1275,6 +1286,7 @@ instruction_detach(struct_processus *s_e return; } +# ifndef OS2 if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; @@ -1293,6 +1305,7 @@ instruction_detach(struct_processus *s_e (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# endif (*s_argument_thread).s_etat_processus = s_etat_processus; @@ -1315,6 +1328,11 @@ instruction_detach(struct_processus *s_e * Processus fils */ +# ifdef _BROKEN_SIGINFO + liberation_fifos_signaux(s_etat_processus); + creation_fifos_signaux(s_etat_processus); +# endif + if ((*s_etat_processus).debug == d_vrai) if (((*s_etat_processus).type_debug & d_debug_processus) != 0) @@ -1504,6 +1522,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1534,6 +1556,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1567,6 +1593,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1589,6 +1619,9 @@ instruction_detach(struct_processus *s_e liberation(s_etat_processus, (*s_etat_processus).at_exit); (*s_etat_processus).at_exit = NULL; + liberation(s_etat_processus, (*s_etat_processus).at_poke); + (*s_etat_processus).at_poke = NULL; + (*s_etat_processus).traitement_at_poke = 'N'; for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++) { @@ -1712,6 +1745,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1728,6 +1765,9 @@ instruction_detach(struct_processus *s_e (*s_argument_thread2).nombre_references--; BUG((*s_argument_thread2).nombre_references < 0, +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus), +# endif printf("(*s_argument_thread2).nombre_references = %d\n", (int) (*s_argument_thread2).nombre_references)); @@ -1791,6 +1831,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1855,6 +1899,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1907,6 +1955,10 @@ instruction_detach(struct_processus *s_e } } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -2091,6 +2143,7 @@ instruction_detach(struct_processus *s_e } liberation(s_etat_processus, (*s_etat_processus).at_exit); + liberation(s_etat_processus, (*s_etat_processus).at_poke); l_element_courant = (*s_etat_processus).liste_mutexes; while(l_element_courant != NULL) @@ -2454,6 +2507,10 @@ instruction_detach(struct_processus *s_e registre_stop; } +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + (*s_etat_processus).erreur_systeme = d_es_signal; exit(EXIT_FAILURE); } @@ -2488,6 +2545,10 @@ instruction_detach(struct_processus *s_e if (sigaction(SIGPIPE, ®istre, NULL) != 0) { +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + pthread_mutex_unlock(&((*s_etat_processus).mutex)); (*s_etat_processus).erreur_systeme = d_es_signal; @@ -2509,6 +2570,10 @@ instruction_detach(struct_processus *s_e pthread_mutex_unlock(&((*s_etat_processus).mutex)); +# ifdef _BROKEN_SIGINFO + destruction_fifos_signaux(s_etat_processus); +# endif + l_element_courant = (*s_etat_processus).s_sockets; while(l_element_courant != NULL) @@ -2804,7 +2869,7 @@ instruction_detach(struct_processus *s_e liberation(s_etat_processus, s_objet); -# ifndef Cygwin +# if !defined(Cygwin) && !defined(OpenBSD) (*s_etat_processus).pile_signal.ss_flags = SS_DISABLE; sigaltstack(&((*s_etat_processus).pile_signal), NULL); free((*s_etat_processus).pile_signal.ss_sp); @@ -2849,6 +2914,7 @@ instruction_detach(struct_processus *s_e retrait_thread(s_etat_processus); pthread_mutex_destroy(&((*s_etat_processus).mutex)); + pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation)); pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes)); pthread_key_delete(semaphore_fork_processus_courant);