--- rpl/src/interruptions.c 2011/09/26 15:57:16 1.82 +++ rpl/src/interruptions.c 2011/12/16 13:46:56 1.89 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.4 + RPL/2 (R) version 4.1.5 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -1772,7 +1772,6 @@ interruption3(int signal) kill(pid_processus_pere, SIGUSR1); } - if (signal != SIGUSR2) { write(STDERR_FILENO, message_1, strlen(message_1)); @@ -1828,7 +1827,7 @@ interruption_violation_access(void *adre unsigned char message[] = "+++System : Trying to catch access " "violation\n"; - static int compteur_erreur = 0; + static int compteur_erreur = 0; if ((gravite == 0) && (routine_recursive != 0)) { @@ -1935,13 +1934,6 @@ signal_stop(struct_processus *s_etat_pro if (pid == getpid()) { - if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) - == NULL) - { - deverrouillage_gestionnaire_signaux(s_etat_processus); - return; - } - if (((*s_etat_processus).type_debug & d_debug_signaux) != 0) { printf("[%d] RPL/SIGSTOP (thread %llu)\n", (int) getpid(), @@ -2033,13 +2025,6 @@ signal_urg(struct_processus *s_etat_proc if (pid == getpid()) { - if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) - == NULL) - { - deverrouillage_gestionnaire_signaux(s_etat_processus); - return; - } - if (((*s_etat_processus).type_debug & d_debug_signaux) != 0) { printf("[%d] RPL/SIGURG (thread %llu)\n", (int) getpid(), @@ -2089,13 +2074,6 @@ signal_abort(struct_processus *s_etat_pr if (pid == getpid()) { - if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) - == NULL) - { - deverrouillage_gestionnaire_signaux(s_etat_processus); - return; - } - (*s_etat_processus).arret_depuis_abort = -1; /* @@ -2409,15 +2387,19 @@ nom_segment(unsigned char *chemin, pid_t int envoi_signal_processus(pid_t pid, enum signaux_rpl signal) { - int segment; +# ifndef OS2 + int segment; +# endif # ifndef IPCS_SYSV # ifdef SEMAPHORES_NOMMES sem_t *semaphore; # endif # else - int desc; - key_t clef; +# ifndef OS2 + int desc; + key_t clef; +# endif # endif struct_queue_signaux *queue; @@ -2476,28 +2458,40 @@ envoi_signal_processus(pid_t pid, enum s return(1); } - if ((desc = open(nom, O_RDWR)) == -1) - { - free(nom); - return(1); - } +# ifndef OS2 // SysV + if ((desc = open(nom, O_RDWR)) == -1) + { + free(nom); + return(1); + } - close(desc); + close(desc); + + if ((clef = ftok(nom, 1)) == -1) + { + free(nom); + return(1); + } - if ((clef = ftok(nom, 1)) == -1) - { free(nom); - return(1); - } - free(nom); + if ((segment = shmget(clef, sizeof(struct_queue_signaux), 0)) + == -1) + { + return(1); + } - if ((segment = shmget(clef, sizeof(struct_queue_signaux), 0)) == -1) - { - return(1); - } + queue = shmat(segment, NULL, 0); +# else // OS/2 + if (DosGetNamedSharedMem((PVOID) &queue, nom, + PAG_WRITE | PAG_READ) != 0) + { + free(nom); + return(1); + } - queue = shmat(segment, NULL, 0); + free(nom); +# endif # else // POSIX if ((nom = nom_segment(racine_segment, pid)) == NULL) { @@ -2594,13 +2588,19 @@ envoi_signal_processus(pid_t pid, enum s return(1); } - if (shmdt(queue) != 0) - { - return(1); - } +# ifndef OS2 // SysV + if (shmdt(queue) != 0) + { + return(1); + } +# else // OS/2 + // Pendant de DosGetNamedSHaredMem() +# endif # endif } + kill(pid, SIGALRM); + return(0); } @@ -2664,6 +2664,8 @@ envoi_signal_thread(pthread_t tid, enum return(1); } + pthread_kill(tid, SIGALRM); + return(0); } @@ -2680,6 +2682,8 @@ envoi_signal_contexte(struct_processus * % LONGUEUR_QUEUE_SIGNAUX; pthread_mutex_unlock(&mutex_interruptions); + pthread_kill((*s_etat_processus_a_signaler).tid, SIGALRM); + return(0); } @@ -2831,8 +2835,8 @@ creation_queue_signaux(struct_processus return; } - if (DosAllocSharedMem(&ptr_os2, nom, nombre_queues * - ((2 * longueur_queue) + 4) * sizeof(int), + if (DosAllocSharedMem((PVOID) &s_queue_signaux, nom, + sizeof(struct_queue_signaux), PAG_WRITE | PAG_READ | PAG_COMMIT) != 0) { free(nom); @@ -2841,7 +2845,10 @@ creation_queue_signaux(struct_processus } free(nom); - fifos = ptr_os2; + + sem_init(&((*s_queue_signaux).semaphore), 1, 1); + (*s_queue_signaux).pointeur_lecture = 0; + (*s_queue_signaux).pointeur_ecriture = 0; # endif # endif @@ -2910,7 +2917,9 @@ liberation_queue_signaux(struct_processu void destruction_queue_signaux(struct_processus *s_etat_processus) { - unsigned char *nom; +# ifndef OS2 + unsigned char *nom; +# endif # ifdef IPCS_SYSV // SystemV # ifndef OS2 @@ -2946,14 +2955,14 @@ destruction_queue_signaux(struct_process unlink(nom); free(nom); # else - if (DosFreeMem(fifos) != 0) + sem_close(&((*s_queue_signaux).semaphore)); + sem_destroy(&((*s_queue_signaux).semaphore)); + + if (DosFreeMem(s_queue_signaux) != 0) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } - - // FERMER LE FICHIER - # endif # else // POSIX # ifndef SEMAPHORES_NOMMES