version 1.9, 2010/04/21 13:45:50
|
version 1.15, 2010/05/07 09:17:52
|
Line 82 insertion_thread(struct_processus *s_eta
|
Line 82 insertion_thread(struct_processus *s_eta
|
sigfillset(&set); |
sigfillset(&set); |
pthread_sigmask(SIG_BLOCK, &set, &oldset); |
pthread_sigmask(SIG_BLOCK, &set, &oldset); |
|
|
# ifndef SEMAPHORES_NOMMES |
|
while(sem_wait(&semaphore_liste_threads) == -1) |
|
# else |
|
while(sem_wait(semaphore_liste_threads) == -1) |
|
# endif |
|
{ |
|
if (errno != EINTR) |
|
{ |
|
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
|
sigpending(&set); |
|
|
|
(*s_etat_processus).erreur_systeme = d_es_processus; |
|
return; |
|
} |
|
} |
|
|
|
if ((l_nouvel_objet = malloc(sizeof(struct_liste_chainee_volatile))) |
if ((l_nouvel_objet = malloc(sizeof(struct_liste_chainee_volatile))) |
== NULL) |
== NULL) |
{ |
{ |
# ifndef SEMAPHORES_NOMMES |
|
sem_post(&semaphore_liste_threads); |
|
# else |
|
sem_post(semaphore_liste_threads); |
|
# endif |
|
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
sigpending(&set); |
sigpending(&set); |
|
|
Line 113 insertion_thread(struct_processus *s_eta
|
Line 92 insertion_thread(struct_processus *s_eta
|
return; |
return; |
} |
} |
|
|
(*l_nouvel_objet).suivant = liste_threads; |
|
|
|
if (((*l_nouvel_objet).donnee = malloc(sizeof(struct_thread))) == NULL) |
if (((*l_nouvel_objet).donnee = malloc(sizeof(struct_thread))) == NULL) |
{ |
{ |
# ifndef SEMAPHORES_NOMMES |
|
sem_post(&semaphore_liste_threads); |
|
# else |
|
sem_post(semaphore_liste_threads); |
|
# endif |
|
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
sigpending(&set); |
sigpending(&set); |
|
|
Line 136 insertion_thread(struct_processus *s_eta
|
Line 108 insertion_thread(struct_processus *s_eta
|
(*((struct_thread *) (*l_nouvel_objet).donnee)).s_etat_processus = |
(*((struct_thread *) (*l_nouvel_objet).donnee)).s_etat_processus = |
s_etat_processus; |
s_etat_processus; |
|
|
|
# ifndef SEMAPHORES_NOMMES |
|
while(sem_wait(&semaphore_liste_threads) == -1) |
|
# else |
|
while(sem_wait(semaphore_liste_threads) == -1) |
|
# endif |
|
{ |
|
if (errno != EINTR) |
|
{ |
|
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
|
sigpending(&set); |
|
|
|
(*s_etat_processus).erreur_systeme = d_es_processus; |
|
return; |
|
} |
|
} |
|
|
|
(*l_nouvel_objet).suivant = liste_threads; |
|
|
liste_threads = l_nouvel_objet; |
liste_threads = l_nouvel_objet; |
|
|
# ifndef SEMAPHORES_NOMMES |
# ifndef SEMAPHORES_NOMMES |
Line 168 insertion_thread_surveillance(struct_pro
|
Line 158 insertion_thread_surveillance(struct_pro
|
sigfillset(&set); |
sigfillset(&set); |
pthread_sigmask(SIG_BLOCK, &set, &oldset); |
pthread_sigmask(SIG_BLOCK, &set, &oldset); |
|
|
|
if ((l_nouvel_objet = malloc(sizeof(struct_liste_chainee_volatile))) |
|
== NULL) |
|
{ |
|
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
|
sigpending(&set); |
|
|
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
# ifndef SEMAPHORES_NOMMES |
# ifndef SEMAPHORES_NOMMES |
while(sem_wait(&semaphore_liste_threads) == -1) |
while(sem_wait(&semaphore_liste_threads) == -1) |
# else |
# else |
Line 184 insertion_thread_surveillance(struct_pro
|
Line 184 insertion_thread_surveillance(struct_pro
|
} |
} |
} |
} |
|
|
if ((l_nouvel_objet = malloc(sizeof(struct_liste_chainee_volatile))) |
|
== NULL) |
|
{ |
|
# ifndef SEMAPHORES_NOMMES |
|
sem_post(&semaphore_liste_threads); |
|
# else |
|
sem_post(semaphore_liste_threads); |
|
# endif |
|
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
|
sigpending(&set); |
|
|
|
(*s_etat_processus).erreur_systeme = d_es_allocation_memoire; |
|
return; |
|
} |
|
|
|
(*l_nouvel_objet).suivant = liste_threads_surveillance; |
(*l_nouvel_objet).suivant = liste_threads_surveillance; |
(*l_nouvel_objet).donnee = (void *) s_argument_thread; |
(*l_nouvel_objet).donnee = (void *) s_argument_thread; |
|
|
Line 289 retrait_thread(struct_processus *s_etat_
|
Line 274 retrait_thread(struct_processus *s_etat_
|
(*l_element_precedent).suivant = (*l_element_courant).suivant; |
(*l_element_precedent).suivant = (*l_element_courant).suivant; |
} |
} |
|
|
free((void *) (*l_element_courant).donnee); |
|
free((struct_liste_chainee_volatile *) l_element_courant); |
|
|
|
if (pthread_setspecific(semaphore_fork_processus_courant, NULL) != 0) |
if (pthread_setspecific(semaphore_fork_processus_courant, NULL) != 0) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_processus; |
(*s_etat_processus).erreur_systeme = d_es_processus; |
Line 319 retrait_thread(struct_processus *s_etat_
|
Line 301 retrait_thread(struct_processus *s_etat_
|
return; |
return; |
} |
} |
|
|
|
free((void *) (*l_element_courant).donnee); |
|
free((struct_liste_chainee_volatile *) l_element_courant); |
|
|
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
sigpending(&set); |
sigpending(&set); |
return; |
return; |
Line 381 retrait_thread_surveillance(struct_proce
|
Line 366 retrait_thread_surveillance(struct_proce
|
return; |
return; |
} |
} |
|
|
|
// l_element_courant->donnee n'est pas bonne lorsque ça part en vrille. |
if (l_element_precedent == NULL) |
if (l_element_precedent == NULL) |
{ |
{ |
liste_threads_surveillance = (*l_element_courant).suivant; |
liste_threads_surveillance = (*l_element_courant).suivant; |
Line 390 retrait_thread_surveillance(struct_proce
|
Line 376 retrait_thread_surveillance(struct_proce
|
(*l_element_precedent).suivant = (*l_element_courant).suivant; |
(*l_element_precedent).suivant = (*l_element_courant).suivant; |
} |
} |
|
|
free((struct_liste_chainee_volatile *) l_element_courant); |
|
|
|
if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0) |
if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0) |
{ |
{ |
|
# ifndef SEMAPHORES_NOMMES |
|
sem_post(&semaphore_liste_threads); |
|
# else |
|
sem_post(semaphore_liste_threads); |
|
# endif |
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
sigpending(&set); |
sigpending(&set); |
|
|
Line 411 retrait_thread_surveillance(struct_proce
|
Line 400 retrait_thread_surveillance(struct_proce
|
{ |
{ |
if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) |
if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) |
{ |
{ |
|
# ifndef SEMAPHORES_NOMMES |
|
sem_post(&semaphore_liste_threads); |
|
# else |
|
sem_post(semaphore_liste_threads); |
|
# endif |
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
sigpending(&set); |
sigpending(&set); |
|
|
Line 425 retrait_thread_surveillance(struct_proce
|
Line 419 retrait_thread_surveillance(struct_proce
|
{ |
{ |
if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) |
if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) |
{ |
{ |
|
# ifndef SEMAPHORES_NOMMES |
|
sem_post(&semaphore_liste_threads); |
|
# else |
|
sem_post(semaphore_liste_threads); |
|
# endif |
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
sigpending(&set); |
sigpending(&set); |
|
|
Line 446 retrait_thread_surveillance(struct_proce
|
Line 445 retrait_thread_surveillance(struct_proce
|
return; |
return; |
} |
} |
|
|
|
free((struct_liste_chainee_volatile *) l_element_courant); |
|
|
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
pthread_sigmask(SIG_SETMASK, &oldset, NULL); |
sigpending(&set); |
sigpending(&set); |
return; |
return; |
Line 626 liberation_threads(struct_processus *s_e
|
Line 627 liberation_threads(struct_processus *s_e
|
close((*s_etat_processus).pipe_nombre_objets_attente); |
close((*s_etat_processus).pipe_nombre_objets_attente); |
close((*s_etat_processus).pipe_nombre_interruptions_attente); |
close((*s_etat_processus).pipe_nombre_interruptions_attente); |
|
|
|
liberation(s_etat_processus, (*s_etat_processus).at_exit); |
|
|
if ((*s_etat_processus).nom_fichier_impression != NULL) |
if ((*s_etat_processus).nom_fichier_impression != NULL) |
{ |
{ |
free((*s_etat_processus).nom_fichier_impression); |
free((*s_etat_processus).nom_fichier_impression); |
Line 1153 liberation_threads(struct_processus *s_e
|
Line 1156 liberation_threads(struct_processus *s_e
|
element_courant = element_suivant; |
element_courant = element_suivant; |
} |
} |
|
|
|
/* |
|
================================================================================ |
|
À noter : on ne ferme pas la connexion car la conséquence immédiate est |
|
une destruction de l'objet pour le processus père. |
|
================================================================================ |
|
|
element_courant = (*s_etat_processus).s_connecteurs_sql; |
element_courant = (*s_etat_processus).s_connecteurs_sql; |
while(element_courant != NULL) |
while(element_courant != NULL) |
{ |
{ |
Line 1236 liberation_threads(struct_processus *s_e
|
Line 1245 liberation_threads(struct_processus *s_e
|
|
|
element_courant = element_suivant; |
element_courant = element_suivant; |
} |
} |
|
*/ |
|
|
|
(*s_etat_processus).s_connecteurs_sql = NULL; |
|
|
element_courant = (*s_etat_processus).s_marques; |
element_courant = (*s_etat_processus).s_marques; |
while(element_courant != NULL) |
while(element_courant != NULL) |
Line 1291 liberation_threads(struct_processus *s_e
|
Line 1303 liberation_threads(struct_processus *s_e
|
if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0) |
if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_processus; |
(*s_etat_processus).erreur_systeme = d_es_processus; |
|
sem_post(&semaphore_liste_threads); |
return; |
return; |
} |
} |
|
|
Line 1305 liberation_threads(struct_processus *s_e
|
Line 1318 liberation_threads(struct_processus *s_e
|
if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) |
if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_processus; |
(*s_etat_processus).erreur_systeme = d_es_processus; |
|
sem_post(&semaphore_liste_threads); |
return; |
return; |
} |
} |
|
|
Line 1316 liberation_threads(struct_processus *s_e
|
Line 1330 liberation_threads(struct_processus *s_e
|
if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) |
if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0) |
{ |
{ |
(*s_etat_processus).erreur_systeme = d_es_processus; |
(*s_etat_processus).erreur_systeme = d_es_processus; |
|
sem_post(&semaphore_liste_threads); |
return; |
return; |
} |
} |
} |
} |
Line 1957 interruption5(int signal, siginfo_t *sig
|
Line 1972 interruption5(int signal, siginfo_t *sig
|
return; |
return; |
} |
} |
|
|
|
if (signal == SIGFABORT) |
|
{ |
|
(*s_etat_processus).arret_depuis_abort = -1; |
|
} |
|
|
if (((*s_etat_processus).type_debug & d_debug_signaux) != 0) |
if (((*s_etat_processus).type_debug & d_debug_signaux) != 0) |
{ |
{ |
printf("[%d] SIGFSTOP (thread %llu)\n", (int) getpid(), |
if (signal == SIGFSTOP) |
(unsigned long long) pthread_self()); |
{ |
fflush(stdout); |
printf("[%d] SIGFSTOP (thread %llu)\n", (int) getpid(), |
|
(unsigned long long) pthread_self()); |
|
fflush(stdout); |
|
} |
|
else |
|
{ |
|
printf("[%d] SIGFABORT (thread %llu)\n", (int) getpid(), |
|
(unsigned long long) pthread_self()); |
|
fflush(stdout); |
|
} |
} |
} |
|
|
/* |
/* |
Line 1982 interruption5(int signal, siginfo_t *sig
|
Line 2011 interruption5(int signal, siginfo_t *sig
|
} |
} |
else |
else |
{ |
{ |
|
if ((s_etat_processus = recherche_thread(getpid(), pthread_self())) |
|
== NULL) |
|
{ |
|
deverrouillage_gestionnaire_signaux(); |
|
return; |
|
} |
|
|
|
if (signal == SIGFABORT) |
|
{ |
|
(*s_etat_processus).arret_depuis_abort = -1; |
|
} |
|
|
// Envoi d'un signal au thread maître du groupe. |
// Envoi d'un signal au thread maître du groupe. |
|
|
if (recherche_thread_principal(getpid(), &thread) == d_vrai) |
if (recherche_thread_principal(getpid(), &thread) == d_vrai) |
{ |
{ |
pthread_kill(thread, SIGFSTOP); |
pthread_kill(thread, signal); |
deverrouillage_gestionnaire_signaux(); |
deverrouillage_gestionnaire_signaux(); |
return; |
return; |
} |
} |
Line 2110 interruption9(int signal, siginfo_t *sig
|
Line 2151 interruption9(int signal, siginfo_t *sig
|
fflush(stdout); |
fflush(stdout); |
} |
} |
|
|
pthread_kill((*s_etat_processus).tid_processus_pere, SIGFSTOP); |
pthread_kill((*s_etat_processus).tid_processus_pere, SIGFABORT); |
deverrouillage_gestionnaire_signaux(); |
deverrouillage_gestionnaire_signaux(); |
return; |
return; |
} |
} |