version 1.129, 2013/05/22 13:40:12
|
version 1.133, 2013/05/28 22:09:55
|
Line 60 static volatile int code_erreur_g
|
Line 60 static volatile int code_erreur_g
|
|
|
unsigned char *racine_segment; |
unsigned char *racine_segment; |
|
|
static pthread_mutex_t mutex_interruptions |
|
= PTHREAD_MUTEX_INITIALIZER; |
|
|
|
static void * |
static void * |
thread_surveillance_signaux(void *argument) |
thread_surveillance_signaux(void *argument) |
{ |
{ |
Line 99 thread_surveillance_signaux(void *argume
|
Line 96 thread_surveillance_signaux(void *argume
|
if (sem_wait(semaphore_signalisation) == 0) |
if (sem_wait(semaphore_signalisation) == 0) |
# endif |
# endif |
{ |
{ |
|
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
|
if (sem_wait(&(*s_queue_signaux).arret_signalisation) != 0) |
|
# else |
|
if (sem_wait(semaphore_arret_signalisation) != 0) |
|
# endif |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_processus; |
|
} |
|
|
if ((*s_queue_signaux).requete_arret == d_vrai) |
if ((*s_queue_signaux).requete_arret == d_vrai) |
{ |
{ |
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
|
sem_post(&(*s_queue_signaux).arret_signalisation); |
sem_post(&(*s_queue_signaux).signalisation); |
sem_post(&(*s_queue_signaux).signalisation); |
# else |
# else |
|
sem_post(semaphore_arret_signalisation); |
sem_post(semaphore_signalisation); |
sem_post(semaphore_signalisation); |
# endif |
# endif |
|
|
Line 111 thread_surveillance_signaux(void *argume
|
Line 119 thread_surveillance_signaux(void *argume
|
} |
} |
|
|
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
|
sem_post(&(*s_queue_signaux).arret_signalisation); |
sem_post(&(*s_queue_signaux).signalisation); |
sem_post(&(*s_queue_signaux).signalisation); |
# else |
# else |
|
sem_post(semaphore_arret_signalisation); |
sem_post(semaphore_signalisation); |
sem_post(semaphore_signalisation); |
# endif |
# endif |
|
|
Line 154 thread_surveillance_signaux(void *argume
|
Line 164 thread_surveillance_signaux(void *argume
|
// Attention : l'ordre de verrouillage des mutexes est important |
// Attention : l'ordre de verrouillage des mutexes est important |
// pour éviter les conditions bloquantes ! |
// pour éviter les conditions bloquantes ! |
|
|
pthread_mutex_lock(&mutex_interruptions); |
|
pthread_mutex_lock(&mutex_liste_threads); |
pthread_mutex_lock(&mutex_liste_threads); |
|
|
l_element_courant = liste_threads; |
l_element_courant = liste_threads; |
Line 164 thread_surveillance_signaux(void *argume
|
Line 173 thread_surveillance_signaux(void *argume
|
if ((*((struct_thread *) (*l_element_courant).donnee)).pid |
if ((*((struct_thread *) (*l_element_courant).donnee)).pid |
== getpid()) |
== getpid()) |
{ |
{ |
|
pthread_mutex_lock(&((*(*((struct_thread *) |
|
(*l_element_courant).donnee)).s_etat_processus) |
|
.mutex_interruptions)); |
|
|
if ((*(*((struct_thread *) (*l_element_courant).donnee)) |
if ((*(*((struct_thread *) (*l_element_courant).donnee)) |
.s_etat_processus).pointeur_signal_ecriture != |
.s_etat_processus).pointeur_signal_ecriture != |
(*(*((struct_thread *) (*l_element_courant) |
(*(*((struct_thread *) (*l_element_courant) |
Line 174 thread_surveillance_signaux(void *argume
|
Line 187 thread_surveillance_signaux(void *argume
|
pthread_kill((*((struct_thread *) |
pthread_kill((*((struct_thread *) |
(*l_element_courant).donnee)).tid, SIGALRM); |
(*l_element_courant).donnee)).tid, SIGALRM); |
} |
} |
|
|
|
pthread_mutex_unlock(&((*(*((struct_thread *) |
|
(*l_element_courant).donnee)).s_etat_processus) |
|
.mutex_interruptions)); |
} |
} |
|
|
l_element_courant = (*l_element_courant).suivant; |
l_element_courant = (*l_element_courant).suivant; |
} |
} |
|
|
pthread_mutex_unlock(&mutex_liste_threads); |
pthread_mutex_unlock(&mutex_liste_threads); |
pthread_mutex_unlock(&mutex_interruptions); |
|
|
|
// Nanosleep |
// Nanosleep |
|
|
Line 1380 recherche_thread(pid_t pid, pthread_t ti
|
Line 1396 recherche_thread(pid_t pid, pthread_t ti
|
|
|
struct_processus *s_etat_processus; |
struct_processus *s_etat_processus; |
|
|
|
if (pthread_mutex_lock(&mutex_liste_threads) != 0) |
|
{ |
|
return(NULL); |
|
} |
|
|
l_element_courant = liste_threads; |
l_element_courant = liste_threads; |
|
|
while(l_element_courant != NULL) |
while(l_element_courant != NULL) |
Line 1400 recherche_thread(pid_t pid, pthread_t ti
|
Line 1421 recherche_thread(pid_t pid, pthread_t ti
|
* Le processus n'existe plus. On ne distribue aucun signal. |
* Le processus n'existe plus. On ne distribue aucun signal. |
*/ |
*/ |
|
|
|
pthread_mutex_unlock(&mutex_liste_threads); |
return(NULL); |
return(NULL); |
} |
} |
|
|
s_etat_processus = (*((struct_thread *) |
s_etat_processus = (*((struct_thread *) |
(*l_element_courant).donnee)).s_etat_processus; |
(*l_element_courant).donnee)).s_etat_processus; |
|
|
|
if (pthread_mutex_unlock(&mutex_liste_threads) != 0) |
|
{ |
|
return(NULL); |
|
} |
|
|
return(s_etat_processus); |
return(s_etat_processus); |
} |
} |
|
|
Line 1527 verrouillage_gestionnaire_signaux(struct
|
Line 1554 verrouillage_gestionnaire_signaux(struct
|
return; |
return; |
} |
} |
|
|
|
/* |
if (semaphore == 1) |
if (semaphore == 1) |
{ |
{ |
// Le semaphore ne peut être pris par le thread qui a appelé |
// Le semaphore ne peut être pris par le thread qui a appelé |
Line 1546 verrouillage_gestionnaire_signaux(struct
|
Line 1574 verrouillage_gestionnaire_signaux(struct
|
return; |
return; |
} |
} |
} |
} |
|
*/ |
|
|
return; |
return; |
} |
} |
Line 1625 deverrouillage_gestionnaire_signaux(stru
|
Line 1654 deverrouillage_gestionnaire_signaux(stru
|
} |
} |
} |
} |
|
|
|
/* |
if (semaphore == 1) |
if (semaphore == 1) |
{ |
{ |
if (pthread_mutex_unlock(&mutex_liste_threads) != 0) |
if (pthread_mutex_unlock(&mutex_liste_threads) != 0) |
Line 1633 deverrouillage_gestionnaire_signaux(stru
|
Line 1663 deverrouillage_gestionnaire_signaux(stru
|
return; |
return; |
} |
} |
} |
} |
|
*/ |
|
|
return; |
return; |
} |
} |
Line 2595 scrutation_interruptions(struct_processu
|
Line 2626 scrutation_interruptions(struct_processu
|
|
|
// Interruptions qui arrivent depuis le groupe courant de threads. |
// Interruptions qui arrivent depuis le groupe courant de threads. |
|
|
if (pthread_mutex_trylock(&mutex_interruptions) == 0) |
if (pthread_mutex_trylock(&((*s_etat_processus).mutex_interruptions)) == 0) |
{ |
{ |
while((*s_etat_processus).pointeur_signal_lecture != |
while((*s_etat_processus).pointeur_signal_lecture != |
(*s_etat_processus).pointeur_signal_ecriture) |
(*s_etat_processus).pointeur_signal_ecriture) |
Line 2624 scrutation_interruptions(struct_processu
|
Line 2655 scrutation_interruptions(struct_processu
|
} |
} |
} |
} |
|
|
pthread_mutex_unlock(&mutex_interruptions); |
pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions)); |
} |
} |
|
|
return; |
return; |
Line 2989 envoi_signal_thread(pthread_t tid, enum
|
Line 3020 envoi_signal_thread(pthread_t tid, enum
|
s_etat_processus = (*((struct_thread *) (*l_element_courant).donnee)) |
s_etat_processus = (*((struct_thread *) (*l_element_courant).donnee)) |
.s_etat_processus; |
.s_etat_processus; |
|
|
if (pthread_mutex_lock(&mutex_interruptions) != 0) |
if (pthread_mutex_lock(&((*s_etat_processus).mutex_interruptions)) != 0) |
{ |
{ |
pthread_mutex_unlock(&mutex_liste_threads); |
pthread_mutex_unlock(&mutex_liste_threads); |
return(1); |
return(1); |
Line 3001 envoi_signal_thread(pthread_t tid, enum
|
Line 3032 envoi_signal_thread(pthread_t tid, enum
|
((*s_etat_processus).pointeur_signal_ecriture + 1) |
((*s_etat_processus).pointeur_signal_ecriture + 1) |
% LONGUEUR_QUEUE_SIGNAUX; |
% LONGUEUR_QUEUE_SIGNAUX; |
|
|
if (pthread_mutex_unlock(&mutex_interruptions) != 0) |
if (pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions)) != 0) |
{ |
{ |
pthread_mutex_unlock(&mutex_liste_threads); |
pthread_mutex_unlock(&mutex_liste_threads); |
return(1); |
return(1); |
Line 3031 int
|
Line 3062 int
|
envoi_signal_contexte(struct_processus *s_etat_processus_a_signaler, |
envoi_signal_contexte(struct_processus *s_etat_processus_a_signaler, |
enum signaux_rpl signal) |
enum signaux_rpl signal) |
{ |
{ |
pthread_mutex_lock(&mutex_interruptions); |
pthread_mutex_lock(&((*s_etat_processus_a_signaler).mutex_interruptions)); |
(*s_etat_processus_a_signaler).signaux_en_queue |
(*s_etat_processus_a_signaler).signaux_en_queue |
[(*s_etat_processus_a_signaler).pointeur_signal_ecriture] = |
[(*s_etat_processus_a_signaler).pointeur_signal_ecriture] = |
signal; |
signal; |
(*s_etat_processus_a_signaler).pointeur_signal_ecriture = |
(*s_etat_processus_a_signaler).pointeur_signal_ecriture = |
((*s_etat_processus_a_signaler).pointeur_signal_ecriture + 1) |
((*s_etat_processus_a_signaler).pointeur_signal_ecriture + 1) |
% LONGUEUR_QUEUE_SIGNAUX; |
% LONGUEUR_QUEUE_SIGNAUX; |
pthread_mutex_unlock(&mutex_interruptions); |
pthread_mutex_unlock(&((*s_etat_processus_a_signaler).mutex_interruptions)); |
|
|
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
if (sem_post(&((*s_queue_signaux).signalisation)) != 0) |
if (sem_post(&((*s_queue_signaux).signalisation)) != 0) |
Line 3123 creation_queue_signaux(struct_processus
|
Line 3154 creation_queue_signaux(struct_processus
|
# ifndef SEMAPHORES_NOMMES |
# ifndef SEMAPHORES_NOMMES |
sem_init(&((*s_queue_signaux).semaphore), 1, 1); |
sem_init(&((*s_queue_signaux).semaphore), 1, 1); |
sem_init(&((*s_queue_signaux).signalisation), 1, 0); |
sem_init(&((*s_queue_signaux).signalisation), 1, 0); |
|
sem_init(&((*s_queue_signaux).arret_signalisation), 1, 1); |
# else |
# else |
if ((semaphore_queue_signaux = sem_init2(1, getpid(), SEM_QUEUE)) |
if ((semaphore_queue_signaux = sem_init2(1, getpid(), SEM_QUEUE)) |
== SEM_FAILED) |
== SEM_FAILED) |
Line 3131 creation_queue_signaux(struct_processus
|
Line 3163 creation_queue_signaux(struct_processus
|
return; |
return; |
} |
} |
|
|
if ((semaphore_signalisation = sem_init2(1, getpid(), |
if ((semaphore_signalisation = sem_init2(0, getpid(), |
SEM_SIGNALISATION)) == SEM_FAILED) |
SEM_SIGNALISATION)) == SEM_FAILED) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_processus; |
(*s_etat_processus).erreur_systeme = d_es_processus; |
return; |
return; |
} |
} |
|
|
|
if ((semaphore_arret_signalisation = sem_init2(1, getpid(), |
|
SEM_ARRET_SIGNALISATION)) == SEM_FAILED) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_processus; |
|
return; |
|
} |
# endif |
# endif |
|
|
(*s_queue_signaux).pointeur_lecture = 0; |
(*s_queue_signaux).pointeur_lecture = 0; |
(*s_queue_signaux).pointeur_ecriture = 0; |
(*s_queue_signaux).pointeur_ecriture = 0; |
|
|
(*s_queue_signaux).requete_arret = d_faux; |
(*s_queue_signaux).requete_arret = d_faux; |
|
|
if (msync(s_queue_signaux, sizeof(struct_queue_signaux), 0)) |
if (msync(s_queue_signaux, sizeof(struct_queue_signaux), 0)) |
Line 3206 creation_queue_signaux(struct_processus
|
Line 3246 creation_queue_signaux(struct_processus
|
|
|
sem_init(&((*s_queue_signaux).semaphore), 1, 1); |
sem_init(&((*s_queue_signaux).semaphore), 1, 1); |
sem_init(&((*s_queue_signaux).signalisation), 1, 0); |
sem_init(&((*s_queue_signaux).signalisation), 1, 0); |
|
sem_init(&((*s_queue_signaux).arret_signalisation), 1, 1); |
|
|
(*s_queue_signaux).pointeur_lecture = 0; |
(*s_queue_signaux).pointeur_lecture = 0; |
(*s_queue_signaux).pointeur_ecriture = 0; |
(*s_queue_signaux).pointeur_ecriture = 0; |
(*s_queue_signaux).requete_arret = d_faux; |
(*s_queue_signaux).requete_arret = d_faux; |
Line 3229 creation_queue_signaux(struct_processus
|
Line 3271 creation_queue_signaux(struct_processus
|
|
|
sem_init(&((*s_queue_signaux).semaphore), 1, 1); |
sem_init(&((*s_queue_signaux).semaphore), 1, 1); |
sem_init(&((*s_queue_signaux).signalisation), 1, 0); |
sem_init(&((*s_queue_signaux).signalisation), 1, 0); |
|
sem_init(&((*s_queue_signaux).arret_signalisation), 1, 1); |
|
|
(*s_queue_signaux).pointeur_lecture = 0; |
(*s_queue_signaux).pointeur_lecture = 0; |
(*s_queue_signaux).pointeur_ecriture = 0; |
(*s_queue_signaux).pointeur_ecriture = 0; |
(*s_queue_signaux).requete_arret = d_faux; |
(*s_queue_signaux).requete_arret = d_faux; |
Line 3307 creation_queue_signaux(struct_processus
|
Line 3351 creation_queue_signaux(struct_processus
|
void |
void |
liberation_queue_signaux(struct_processus *s_etat_processus) |
liberation_queue_signaux(struct_processus *s_etat_processus) |
{ |
{ |
// Incrémenter le sémaphore pour être sûr de le débloquer. |
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
|
sem_wait(&((*s_queue_signaux).arret_signalisation)); |
|
# else |
|
sem_wait(semaphore_arret_signalisation); |
|
# endif |
|
|
(*s_queue_signaux).requete_arret = d_vrai; |
(*s_queue_signaux).requete_arret = d_vrai; |
|
|
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
|
sem_post(&((*s_queue_signaux).arret_signalisation)); |
|
# else |
|
sem_post(semaphore_arret_signalisation); |
|
# endif |
|
|
|
// Incrémenter le sémaphore pour être sûr de le débloquer. |
|
|
|
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
sem_post(&((*s_queue_signaux).signalisation)); |
sem_post(&((*s_queue_signaux).signalisation)); |
# else |
# else |
sem_post(semaphore_signalisation); |
sem_post(semaphore_signalisation); |
Line 3334 liberation_queue_signaux(struct_processu
|
Line 3390 liberation_queue_signaux(struct_processu
|
# else |
# else |
sem_close(semaphore_queue_signaux); |
sem_close(semaphore_queue_signaux); |
sem_close(semaphore_signalisation); |
sem_close(semaphore_signalisation); |
|
sem_close(semaphore_arret_signalisation); |
# endif |
# endif |
|
|
if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0) |
if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0) |
Line 3370 destruction_queue_signaux(struct_process
|
Line 3427 destruction_queue_signaux(struct_process
|
# endif |
# endif |
|
|
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
sem_wait(&((*s_queue_signaux).signalisation)); |
sem_wait(&((*s_queue_signaux).arret_signalisation)); |
# else |
# else |
sem_wait(semaphore_signalisation); |
sem_wait(semaphore_arret_signalisation); |
# endif |
# endif |
|
|
(*s_queue_signaux).requete_arret = d_vrai; |
(*s_queue_signaux).requete_arret = d_vrai; |
|
|
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
# if (!defined(SEMAPHORES_NOMMES)) || defined(IPCS_SYSV) |
sem_post(&((*s_queue_signaux).signalisation)); |
sem_post(&((*s_queue_signaux).arret_signalisation)); |
# else |
# else |
sem_post(semaphore_signalisation); |
sem_post(semaphore_arret_signalisation); |
# endif |
# endif |
|
|
// Incrémenter le sémaphore pour être sûr de le débloquer. |
// Incrémenter le sémaphore pour être sûr de le débloquer. |
Line 3415 destruction_queue_signaux(struct_process
|
Line 3472 destruction_queue_signaux(struct_process
|
unlink((*s_queue_signaux).signalisation.path); |
unlink((*s_queue_signaux).signalisation.path); |
free((*s_queue_signaux).signalisation.path); |
free((*s_queue_signaux).signalisation.path); |
|
|
|
if (semctl((*s_queue_signaux).arret_signalisation.sem, 0, IPC_RMID) |
|
== -1) |
|
{ |
|
(*s_etat_processus).erreur_systeme = d_es_processus; |
|
return; |
|
} |
|
|
|
unlink((*s_queue_signaux).arret_signalisation.path); |
|
free((*s_queue_signaux).arret_signalisation.path); |
|
|
if (shmdt(s_queue_signaux) == -1) |
if (shmdt(s_queue_signaux) == -1) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
Line 3443 destruction_queue_signaux(struct_process
|
Line 3510 destruction_queue_signaux(struct_process
|
sem_close(&((*s_queue_signaux).signalisation)); |
sem_close(&((*s_queue_signaux).signalisation)); |
sem_destroy(&((*s_queue_signaux).signalisation)); |
sem_destroy(&((*s_queue_signaux).signalisation)); |
|
|
|
sem_close(&((*s_queue_signaux).arret_signalisation)); |
|
sem_destroy(&((*s_queue_signaux).arret_signalisation)); |
|
|
if (DosFreeMem(s_queue_signaux) != 0) |
if (DosFreeMem(s_queue_signaux) != 0) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
Line 3453 destruction_queue_signaux(struct_process
|
Line 3523 destruction_queue_signaux(struct_process
|
# ifndef SEMAPHORES_NOMMES |
# ifndef SEMAPHORES_NOMMES |
sem_destroy(&((*s_queue_signaux).semaphore)); |
sem_destroy(&((*s_queue_signaux).semaphore)); |
sem_destroy(&((*s_queue_signaux).signalisation)); |
sem_destroy(&((*s_queue_signaux).signalisation)); |
|
sem_destroy(&((*s_queue_signaux).arret_signalisation)); |
# else |
# else |
sem_close(semaphore_queue_signaux); |
sem_close(semaphore_queue_signaux); |
sem_destroy2(semaphore_queue_signaux, getpid(), SEM_QUEUE); |
sem_destroy2(semaphore_queue_signaux, getpid(), SEM_QUEUE); |
|
|
sem_close(semaphore_signalisation); |
sem_close(semaphore_signalisation); |
sem_destroy2(semaphore_signalisation, getpid(), SEM_SIGNALISATION); |
sem_destroy2(semaphore_signalisation, getpid(), SEM_SIGNALISATION); |
|
|
|
sem_close(semaphore_arret_signalisation); |
|
sem_destroy2(semaphore_arret_signalisation, getpid(), |
|
SEM_ARRET_SIGNALISATION); |
# endif |
# endif |
|
|
if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0) |
if (munmap(s_queue_signaux, sizeof(struct_queue_signaux)) != 0) |