--- rpl/src/instructions_d5.c 2011/09/10 20:45:06 1.66 +++ rpl/src/instructions_d5.c 2011/09/14 14:34:28 1.67 @@ -829,9 +829,7 @@ instruction_detach(struct_processus *s_e sig_atomic_t registre_stop; sigset_t oldset; - sigset_t oldset2; sigset_t set; - sigset_t set2; ssize_t longueur_ecriture; @@ -1033,46 +1031,6 @@ instruction_detach(struct_processus *s_e } } - 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, SIGFABORT) != 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; @@ -1146,15 +1104,13 @@ instruction_detach(struct_processus *s_e * de mémoire, ni libération, ni copie d'objet concurrent au fork(). */ - sigfillset(&set2); - pthread_sigmask(SIG_BLOCK, &set2, &oldset2); - + sigfillset(&set); + pthread_sigmask(SIG_BLOCK, &set, &oldset); verrouillage_threads_concurrents(s_etat_processus); (*s_argument_thread).pid = fork(); deverrouillage_threads_concurrents(s_etat_processus); - - pthread_sigmask(SIG_SETMASK, &oldset2, NULL); - sigpending(&set2); + pthread_sigmask(SIG_SETMASK, &oldset, NULL); + sigpending(&set); (*s_argument_thread).thread_pere = pthread_self(); (*s_argument_thread).processus_detache = d_vrai; @@ -1317,12 +1273,12 @@ instruction_detach(struct_processus *s_e * Processus fils */ -# ifdef _BROKEN_SIGINFO - liberation_fifos_signaux(s_etat_processus); - creation_fifos_signaux(s_etat_processus); -# endif + liberation_queue_signaux(s_etat_processus); + creation_queue_signaux(s_etat_processus); - (*s_etat_processus).signal_a_traiter = d_faux; + (*s_etat_processus).pointeur_signal_lecture = 0; + (*s_etat_processus).pointeur_signal_ecriture = 0; + (*s_etat_processus).tid_courant = pthread_self(); if ((*s_etat_processus).debug == d_vrai) if (((*s_etat_processus).type_debug & @@ -1513,10 +1469,7 @@ instruction_detach(struct_processus *s_e } } -# ifdef _BROKEN_SIGINFO - destruction_fifos_signaux(s_etat_processus); -# endif - + destruction_queue_signaux(s_etat_processus); BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1547,10 +1500,7 @@ instruction_detach(struct_processus *s_e } } -# ifdef _BROKEN_SIGINFO - destruction_fifos_signaux(s_etat_processus); -# endif - + destruction_queue_signaux(s_etat_processus); BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1584,10 +1534,7 @@ instruction_detach(struct_processus *s_e } } -# ifdef _BROKEN_SIGINFO - destruction_fifos_signaux(s_etat_processus); -# endif - + destruction_queue_signaux(s_etat_processus); BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1646,21 +1593,18 @@ instruction_detach(struct_processus *s_e * renseignée. */ - if (sigpending(&set) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - } - else if (sigismember(&set, SIGSTART) == 0) + // Attente de la réception du signal rpl_sigstart. + + for((*s_etat_processus).demarrage_fils = d_faux;;) { - while(sigismember(&set, SIGSTART) == 0) - { - if (sigpending(&set) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - } + scrutation_interruptions(s_etat_processus); - nanosleep(&attente, NULL); + if ((*s_etat_processus).demarrage_fils == d_vrai) + { + break; } + + nanosleep(&attente, NULL); } (*s_etat_processus).niveau_initial = (*s_etat_processus).niveau_courant; @@ -1737,10 +1681,7 @@ instruction_detach(struct_processus *s_e } } -# ifdef _BROKEN_SIGINFO - destruction_fifos_signaux(s_etat_processus); -# endif - + destruction_queue_signaux(s_etat_processus); BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1757,9 +1698,7 @@ 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 + destruction_queue_signaux(s_etat_processus), printf("(*s_argument_thread2).nombre_references = %d\n", (int) (*s_argument_thread2).nombre_references)); @@ -1823,10 +1762,7 @@ instruction_detach(struct_processus *s_e } } -# ifdef _BROKEN_SIGINFO - destruction_fifos_signaux(s_etat_processus); -# endif - + destruction_queue_signaux(s_etat_processus); BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1891,10 +1827,7 @@ instruction_detach(struct_processus *s_e } } -# ifdef _BROKEN_SIGINFO - destruction_fifos_signaux(s_etat_processus); -# endif - + destruction_queue_signaux(s_etat_processus); BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -1947,10 +1880,7 @@ instruction_detach(struct_processus *s_e } } -# ifdef _BROKEN_SIGINFO - destruction_fifos_signaux(s_etat_processus); -# endif - + destruction_queue_signaux(s_etat_processus); BUG(1, uprintf("Process management error line %d\n", __LINE__)); exit(EXIT_FAILURE); } @@ -2051,13 +1981,6 @@ instruction_detach(struct_processus *s_e (*s_etat_processus).s_fichiers = NULL; - if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - } - - sigpending(&set); - if ((*s_etat_processus).debug == d_vrai) { if (((*s_etat_processus).type_debug & d_debug_processus) @@ -2362,23 +2285,23 @@ instruction_detach(struct_processus *s_e if ((*s_etat_processus).var_volatile_alarme != 0) { - kill((*(*((struct_processus_fils *) + envoi_signal_processus((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread).pid, - SIGURG); + rpl_sigurg); } else { if ((*s_etat_processus).arret_depuis_abort == -1) { - kill((*(*((struct_processus_fils *) + envoi_signal_processus((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) - .pid, SIGFABORT); + .pid, rpl_sigabort); } else { - kill((*(*((struct_processus_fils *) + envoi_signal_processus((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) - .pid, SIGFSTOP); + .pid, rpl_sigstop); } } } @@ -2420,23 +2343,23 @@ instruction_detach(struct_processus *s_e { if ((*s_etat_processus).var_volatile_alarme != 0) { - pthread_kill((*(*((struct_processus_fils *) + envoi_signal_thread((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)).thread) - .tid, SIGURG); + .tid, rpl_sigurg); } else { if ((*s_etat_processus).arret_depuis_abort == -1) { - pthread_kill((*(*((struct_processus_fils *) + envoi_signal_thread((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)) - .thread).tid, SIGFABORT); + .thread).tid, rpl_sigabort); } else { - pthread_kill((*(*((struct_processus_fils *) + envoi_signal_thread((*(*((struct_processus_fils *) (*(*l_element_courant).donnee).objet)) - .thread).tid, SIGFSTOP); + .thread).tid, rpl_sigstop); } } } @@ -2502,10 +2425,7 @@ instruction_detach(struct_processus *s_e registre_stop; } -# ifdef _BROKEN_SIGINFO - destruction_fifos_signaux(s_etat_processus); -# endif - + destruction_queue_signaux(s_etat_processus); (*s_etat_processus).erreur_systeme = d_es_signal; exit(EXIT_FAILURE); } @@ -2540,12 +2460,9 @@ instruction_detach(struct_processus *s_e if (sigaction(SIGPIPE, ®istre, NULL) != 0) { -# ifdef _BROKEN_SIGINFO - destruction_fifos_signaux(s_etat_processus); -# endif + destruction_queue_signaux(s_etat_processus); pthread_mutex_unlock(&((*s_etat_processus).mutex)); - (*s_etat_processus).erreur_systeme = d_es_signal; exit(EXIT_FAILURE); } @@ -2926,10 +2843,7 @@ instruction_detach(struct_processus *s_e clear_history(); -# ifdef _BROKEN_SIGINFO - destruction_fifos_signaux(s_etat_processus); -# endif - + destruction_queue_signaux(s_etat_processus); liberation_contexte_cas(s_etat_processus); free(s_etat_processus); @@ -3029,22 +2943,13 @@ instruction_detach(struct_processus *s_e // Le fils peut être présent sans être en attente du signal de départ. - if (kill((*s_argument_thread).pid, SIGSTART) != 0) + if (envoi_signal_processus((*s_argument_thread).pid, rpl_sigstart) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; pthread_mutex_unlock(&((*s_etat_processus).mutex)); return; } - if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - pthread_mutex_unlock(&((*s_etat_processus).mutex)); - return; - } - - sigpending(&set); - if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus;