--- rpl/src/interruptions.c 2011/09/15 17:51:43 1.69 +++ rpl/src/interruptions.c 2011/09/15 19:23:54 1.70 @@ -2172,7 +2172,6 @@ static inline void envoi_interruptions(struct_processus *s_etat_processus, enum signaux_rpl signal, pid_t pid_source) { -uprintf("Signal : %d\n", signal); switch(signal) { case rpl_signull: @@ -2252,7 +2251,7 @@ scrutation_interruptions(struct_processu // à lire. Les pointeurs d'écriture pointent sur les prochains éléments à // écrire. - if (pthread_mutex_trylock(&((*s_queue_signaux).mutex)) == 0) + if (sem_trywait(&((*s_queue_signaux).semaphore)) == 0) { if ((*s_queue_signaux).pointeur_lecture != (*s_queue_signaux).pointeur_ecriture) @@ -2267,10 +2266,9 @@ scrutation_interruptions(struct_processu (*s_queue_signaux).pointeur_lecture = ((*s_queue_signaux).pointeur_lecture + 1) % LONGUEUR_QUEUE_SIGNAUX; -uprintf("Traité\n"); } - pthread_mutex_unlock(&((*s_queue_signaux).mutex)); + sem_post(&((*s_queue_signaux).semaphore)); } // Interruptions qui arrivent depuis le groupe courant de threads. @@ -2370,7 +2368,7 @@ envoi_signal_processus(pid_t pid, enum s return(1); } - if (pthread_mutex_lock(&((*s_queue_signaux).mutex)) != 0) + if (sem_wait(&((*s_queue_signaux).semaphore)) != 0) { return(1); } @@ -2384,7 +2382,7 @@ envoi_signal_processus(pid_t pid, enum s ((*s_queue_signaux).pointeur_ecriture + 1) % LONGUEUR_QUEUE_SIGNAUX; - if (pthread_mutex_unlock(&((*s_queue_signaux).mutex)) != 0) + if (sem_post(&((*s_queue_signaux).semaphore)) != 0) { return(1); } @@ -2414,10 +2412,8 @@ envoi_signal_processus(pid_t pid, enum s return(1); } -uprintf("Lock\n"); - if (pthread_mutex_lock(&((*queue).mutex)) != 0) + if (sem_wait(&((*queue).semaphore)) != 0) { -uprintf("Unlock (error)\n"); return(1); } @@ -2427,10 +2423,8 @@ uprintf("Unlock (error)\n"); (*queue).pointeur_ecriture = ((*queue).pointeur_ecriture + 1) % LONGUEUR_QUEUE_SIGNAUX; -uprintf("Unlock\n"); - if (pthread_mutex_unlock(&((*queue).mutex)) != 0) + if (sem_post(&((*queue).semaphore)) != 0) { -uprintf("Unlock failed\n"); return(1); } @@ -2542,8 +2536,6 @@ envoi_signal_contexte(struct_processus * void creation_queue_signaux(struct_processus *s_etat_processus) { - pthread_mutexattr_t attributs_mutex; - unsigned char *nom; racine_segment = (*s_etat_processus).chemin_fichiers_temporaires; @@ -2591,10 +2583,17 @@ creation_queue_signaux(struct_processus free(nom); - pthread_mutexattr_init(&attributs_mutex); - pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); - pthread_mutex_init(&((*s_queue_signaux).mutex), &attributs_mutex); - pthread_mutexattr_destroy(&attributs_mutex); +# ifndef SEMAPHORES_NOMMES + sem_init(&((*s_queue_signaux).semaphore), 1, 1); +# else + (*s_queue_signaux).semaphore = sem_init2(0, sem_gestionnaires_signaux); + + if ((*s_queue_signaux).semaphore == SEM_FAILED) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } +# endif (*s_queue_signaux).pointeur_lecture = 0; (*s_queue_signaux).pointeur_ecriture = 0; @@ -2709,6 +2708,9 @@ liberation_queue_signaux(struct_processu # else // OS/2 # endif # else // POSIX + + sem_close(&((*s_queue_signaux).semaphore)); + if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -2779,30 +2781,31 @@ destruction_queue_signaux(struct_process # endif # else // POSIX + sem_close(&((*s_queue_signaux).semaphore)); + sem_destroy(&((*s_queue_signaux).semaphore)); - if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - if ((nom = nom_segment(NULL, getpid())) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } + if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } - close(f_queue_signaux); + if ((nom = nom_segment(NULL, getpid())) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } - if (shm_unlink(nom) != 0) - { - free(nom); - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } + close(f_queue_signaux); - free(nom); + if (shm_unlink(nom) != 0) + { + free(nom); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + free(nom); # endif return;