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