--- rpl/src/interruptions.c 2011/09/15 19:23:54 1.70 +++ rpl/src/interruptions.c 2011/09/15 19:30:38 1.71 @@ -2347,6 +2347,18 @@ nom_segment(unsigned char *chemin, pid_t } +/* +================================================================================ + Fonctions d'envoi d'un signal à un thread ou à un processus. +================================================================================ + Entrée : processus et signal +-------------------------------------------------------------------------------- + Sortie : erreur +-------------------------------------------------------------------------------- + Effet de bord : Néant +================================================================================ +*/ + int envoi_signal_processus(pid_t pid, enum signaux_rpl signal) { @@ -2541,146 +2553,142 @@ creation_queue_signaux(struct_processus racine_segment = (*s_etat_processus).chemin_fichiers_temporaires; # ifndef IPCS_SYSV // POSIX + if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires, + getpid())) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } - if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires, - getpid())) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_EXCL, - S_IRUSR | S_IWUSR)) == -1) - { - free(nom); - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - if (ftruncate(f_queue_signaux, sizeof(struct_queue_signaux)) == -1) - { - free(nom); - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - s_queue_signaux = mmap(NULL, sizeof(struct_queue_signaux), - PROT_READ | PROT_WRITE, MAP_SHARED, f_queue_signaux, 0); - - if (((void *) s_queue_signaux) == ((void *) -1)) - { - if (shm_unlink(nom) == -1) + if ((f_queue_signaux = shm_open(nom, O_RDWR | O_CREAT | O_EXCL, + S_IRUSR | S_IWUSR)) == -1) { free(nom); (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } - free(nom); - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - free(nom); - -# 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; - - if (msync(s_queue_signaux, sizeof(struct_queue_signaux), 0)) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } - -# else // SystemV -# ifndef OS2 - - file *desc; - - key_t clef; - - // Création d'un segment de données associé au PID du processus courant - - chemin = (*s_etat_processus).chemin_fichiers_temporaires; - - if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires, - getpid())) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - if ((desc = fopen(nom, "w")) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; - return; - } + if (ftruncate(f_queue_signaux, sizeof(struct_queue_signaux)) == -1) + { + free(nom); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } - fclose(desc); + s_queue_signaux = mmap(NULL, sizeof(struct_queue_signaux), + PROT_READ | PROT_WRITE, MAP_SHARED, f_queue_signaux, 0); - if ((clef = ftok(nom, 1)) == -1) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } + if (((void *) s_queue_signaux) == ((void *) -1)) + { + if (shm_unlink(nom) == -1) + { + free(nom); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } - free(nom); + free(nom); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } - if ((segment = shmget(clef, - nombre_queues * ((2 * longueur_queue) + 4) * sizeof(int), - IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) == -1) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } + free(nom); +# 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 - fifos = shmat(segment, NULL, 0); + (*s_queue_signaux).pointeur_lecture = 0; + (*s_queue_signaux).pointeur_ecriture = 0; - if (((void *) fifos) == ((void *) -1)) - { - if (shmctl(segment, IPC_RMID, 0) == -1) + if (msync(s_queue_signaux, sizeof(struct_queue_signaux), 0)) { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + (*s_etat_processus).erreur_systeme = d_es_processus; return; } +# else // SystemV +# ifndef OS2 + file *desc; - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } + key_t clef; -# else + // Création d'un segment de données associé au PID du processus + // courant - if ((nom = nom_segment(NULL, getpid())) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } + chemin = (*s_etat_processus).chemin_fichiers_temporaires; - if (DosAllocSharedMem(&ptr_os2, nom, nombre_queues * - ((2 * longueur_queue) + 4) * sizeof(int), - PAG_WRITE | PAG_READ | PAG_COMMIT) != 0) - { - free(nom); - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } + if ((nom = nom_segment((*s_etat_processus) + .chemin_fichiers_temporaires, getpid())) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if ((desc = fopen(nom, "w")) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + fclose(desc); + + if ((clef = ftok(nom, 1)) == -1) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } - free(nom); - fifos = ptr_os2; + free(nom); -# endif + if ((segment = shmget(clef, + nombre_queues * ((2 * longueur_queue) + 4) * sizeof(int), + IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR)) == -1) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + fifos = shmat(segment, NULL, 0); + + if (((void *) fifos) == ((void *) -1)) + { + if (shmctl(segment, IPC_RMID, 0) == -1) + { + (*s_etat_processus).erreur_systeme = + d_es_allocation_memoire; + return; + } + + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } +# else // OS/2 + if ((nom = nom_segment(NULL, getpid())) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if (DosAllocSharedMem(&ptr_os2, nom, nombre_queues * + ((2 * longueur_queue) + 4) * sizeof(int), + PAG_WRITE | PAG_READ | PAG_COMMIT) != 0) + { + free(nom); + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + free(nom); + fifos = ptr_os2; +# endif # endif return; @@ -2708,7 +2716,6 @@ 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) @@ -2743,43 +2750,40 @@ destruction_queue_signaux(struct_process unsigned char *nom; # ifdef IPCS_SYSV // SystemV -# ifndef OS2 - - if (shmdt(fifos) == -1) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - if (shmctl(segment, IPC_RMID, 0) == -1) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - if ((nom = nom_segment((*s_etat_processus).chemin_fichiers_temporaires, - getpid())) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - // FERMER LE FICHIER - - unlink(nom); - free(nom); +# ifndef OS2 + if (shmdt(fifos) == -1) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if (shmctl(segment, IPC_RMID, 0) == -1) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + if ((nom = nom_segment((*s_etat_processus) + .chemin_fichiers_temporaires, getpid())) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } -# else + // FERMER LE FICHIER - if (DosFreeMem(fifos) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } + unlink(nom); + free(nom); +# else + if (DosFreeMem(fifos) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } - // FERMER LE FICHIER + // FERMER LE FICHIER -# endif +# endif # else // POSIX sem_close(&((*s_queue_signaux).semaphore)); sem_destroy(&((*s_queue_signaux).semaphore));