Annotation of rpl/src/gestion_threads.c, revision 1.111
1.1 bertrand 1: /*
2: ================================================================================
1.110 bertrand 3: RPL/2 (R) version 4.1.31
1.109 bertrand 4: Copyright (C) 1989-2019 Dr. BERTRAND Joël
1.1 bertrand 5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
1.26 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 24:
25:
26: /*
27: ================================================================================
28: Fonction de lancement d'un thread
29: ================================================================================
30: Entrées : pointeur sur une structure
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void *
39: lancement_thread(void *argument)
40: {
1.69 bertrand 41: int status;
1.1 bertrand 42:
1.69 bertrand 43: pid_t ppid;
1.1 bertrand 44:
1.69 bertrand 45: sig_atomic_t registre_stop;
1.1 bertrand 46:
1.69 bertrand 47: ssize_t longueur_ecriture;
1.1 bertrand 48:
1.69 bertrand 49: struct_descripteur_thread *s_argument_thread;
1.1 bertrand 50:
1.69 bertrand 51: struct_liste_chainee *l_element_courant;
52: struct_liste_chainee *l_element_suivant;
1.1 bertrand 53:
1.69 bertrand 54: struct_liste_variables_statiques *l_element_statique_courant;
55: struct_liste_variables_statiques *l_element_statique_suivant;
1.1 bertrand 56:
1.69 bertrand 57: struct_objet *s_objet_temporaire;
1.1 bertrand 58:
1.69 bertrand 59: struct_processus *s_etat_processus;
1.1 bertrand 60:
1.69 bertrand 61: struct sigaction action;
62: struct sigaction registre;
1.1 bertrand 63:
1.69 bertrand 64: struct timespec attente;
1.1 bertrand 65:
1.79 bertrand 66: unsigned char caractere;
1.69 bertrand 67: unsigned char *message;
1.1 bertrand 68:
1.69 bertrand 69: unsigned int erreur;
70:
1.74 bertrand 71: integer8 i;
1.1 bertrand 72:
73: attente.tv_sec = 0;
74: attente.tv_nsec = GRANULARITE_us * 1000;
75:
76: s_argument_thread = (struct_descripteur_thread *) argument;
1.20 bertrand 77: s_etat_processus = (*s_argument_thread).s_nouvel_etat_processus;
1.55 bertrand 78:
79: # ifndef SEMAPHORES_NOMMES
80: sem_init(&((*s_etat_processus).semaphore_fork), 0, 0);
1.111 ! bertrand 81: uprintf("[%d-%llu] Semaphore fork %p (gestion_threads.c)\n", (int) getpid(),
! 82: (unsigned long long) pthread_self(),
! 83: &((*s_etat_processus).semaphore_fork));
1.55 bertrand 84: # else
85: if (((*s_etat_processus).semaphore_fork = sem_init3(0, getpid(),
86: pthread_self(), SEM_FORK)) == SEM_FAILED)
87: {
88: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
89: return(NULL);
90: }
91: # endif
92:
1.1 bertrand 93: (*s_argument_thread).tid = pthread_self();
1.75 bertrand 94: insertion_thread(s_etat_processus, d_faux);
1.80 bertrand 95:
96: if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0)
97: {
98: (*s_etat_processus).erreur_systeme = d_es_processus;
99: return(NULL);
100: }
101:
1.1 bertrand 102: (*s_argument_thread).thread_actif = d_vrai;
103:
1.80 bertrand 104: if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
105: {
106: (*s_etat_processus).erreur_systeme = d_es_processus;
107: return(NULL);
108: }
109:
1.1 bertrand 110: // Envoi d'une donnée pour signaler le démarrage du thread au thread
111: // de surveillance.
112:
1.79 bertrand 113: caractere = 0;
114:
1.1 bertrand 115: if (write_atomic(s_etat_processus,
1.79 bertrand 116: (*s_argument_thread).pipe_nombre_elements_attente[1],
117: &caractere, sizeof(caractere)) != sizeof(caractere))
1.1 bertrand 118: {
119: (*s_etat_processus).erreur_systeme = d_es_processus;
120:
121: pthread_mutex_lock(&((*s_argument_thread).mutex));
122: pthread_mutex_unlock(&((*s_argument_thread).mutex));
123:
124: (*s_argument_thread).thread_actif = d_faux;
125:
126: while((longueur_ecriture = write_atomic(s_etat_processus,
1.79 bertrand 127: (*s_argument_thread).pipe_nombre_elements_attente[1],
128: &caractere, sizeof(caractere))) != sizeof(caractere))
1.1 bertrand 129: {
130: if (longueur_ecriture == -1)
131: {
132: break;
133: }
134: }
135:
136: pthread_exit(NULL);
137: }
138:
139: if ((*s_etat_processus).evaluation_expression_compilee == 'N')
140: {
141: free((*s_etat_processus).instruction_courante);
142: (*s_etat_processus).instruction_courante = NULL;
143: }
144:
1.50 bertrand 145: // Attente de la réception du signal rpl_sigstart.
1.1 bertrand 146:
1.50 bertrand 147: for((*s_etat_processus).demarrage_fils = d_faux;;)
1.1 bertrand 148: {
1.50 bertrand 149: scrutation_interruptions(s_etat_processus);
150:
151: if ((*s_etat_processus).demarrage_fils == d_vrai)
1.1 bertrand 152: {
1.50 bertrand 153: break;
154: }
1.1 bertrand 155:
1.50 bertrand 156: nanosleep(&attente, NULL);
1.1 bertrand 157: }
158:
159: if ((*s_etat_processus).debug == d_vrai)
160: if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
161: {
162: if ((*s_etat_processus).langue == 'F')
163: {
164: printf("[%d] Lancement du thread %llu\n", (int) getpid(),
165: (unsigned long long) pthread_self());
166: }
167: else
168: {
169: printf("[%d] Start thread %llu\n", (int) getpid(),
170: (unsigned long long) pthread_self());
171: }
172:
173: fflush(stdout);
174: }
175:
176: (*s_etat_processus).pid_erreur_processus_fils = getpid();
177:
178: // Évaluation de l'objet
179:
180: if ((*s_etat_processus).erreur_systeme == d_es)
181: {
1.49 bertrand 182: if (setjmp(contexte_thread) == 0)
1.1 bertrand 183: {
1.49 bertrand 184: if (evaluation(s_etat_processus, (*s_argument_thread).argument, 'E')
185: == d_erreur)
1.1 bertrand 186: {
1.49 bertrand 187: if (((*s_etat_processus).erreur_execution == d_ex) &&
188: ((*s_etat_processus).erreur_systeme == d_es))
189: {
190: (*s_etat_processus).erreur_execution =
191: d_ex_erreur_evaluation;
192: }
1.1 bertrand 193: }
1.49 bertrand 194: else
1.10 bertrand 195: {
1.76 bertrand 196: if (((*s_etat_processus).arret_depuis_abort == 0)
1.49 bertrand 197: && ((*s_etat_processus).at_exit != NULL))
198: {
199: (*s_etat_processus).var_volatile_requete_arret = 0;
1.76 bertrand 200: (*s_etat_processus).var_volatile_alarme = 0;
1.77 bertrand 201: (*s_etat_processus).var_volatile_traitement_sigint = 0;
202:
203: if ((*s_etat_processus).profilage == d_vrai)
204: {
205: profilage(s_etat_processus, "ATEXIT");
206: }
1.13 bertrand 207:
1.49 bertrand 208: if (evaluation(s_etat_processus,
209: (*s_etat_processus).at_exit, 'E') == d_erreur)
1.12 bertrand 210: {
1.49 bertrand 211: if (((*s_etat_processus).erreur_execution == d_ex) &&
212: ((*s_etat_processus).erreur_systeme == d_es))
213: {
214: (*s_etat_processus).erreur_execution =
215: d_ex_erreur_evaluation;
216: }
1.12 bertrand 217: }
1.77 bertrand 218:
219: if ((*s_etat_processus).profilage == d_vrai)
220: {
221: profilage(s_etat_processus, NULL);
222: }
1.10 bertrand 223: }
224: }
225: }
1.1 bertrand 226:
227: if ((*s_argument_thread).destruction_objet == d_vrai)
228: {
229: liberation(s_etat_processus, (*s_argument_thread).argument);
230: }
231: }
232:
233: if ((*s_etat_processus).presence_fusible == d_vrai)
234: {
235: pthread_cancel((*s_etat_processus).thread_fusible);
236: }
237:
1.79 bertrand 238: caractere = 0;
1.1 bertrand 239:
240: while((longueur_ecriture = write_atomic(s_etat_processus,
1.79 bertrand 241: (*s_argument_thread).pipe_nombre_elements_attente[1],
242: &caractere, sizeof(caractere))) != sizeof(caractere))
1.1 bertrand 243: {
244: if (longueur_ecriture == -1)
245: {
246: break;
247: }
248: }
249:
250: if ((*s_etat_processus).var_volatile_processus_pere != 0)
251: {
252: // Racine des processus atteinte
253:
254: erreur = d_ex;
255:
256: while((longueur_ecriture = write_atomic(s_etat_processus,
257: (*s_argument_thread).pipe_erreurs[1], &erreur,
258: sizeof((*s_etat_processus).erreur_execution))) !=
259: sizeof((*s_etat_processus).erreur_execution))
260: {
261: if (longueur_ecriture == -1)
262: {
263: break;
264: }
265: }
266: }
267: else
268: {
269: while((longueur_ecriture = write_atomic(s_etat_processus,
270: (*s_argument_thread).pipe_erreurs[1],
1.79 bertrand 271: (int *) &((*s_etat_processus).erreur_execution),
1.1 bertrand 272: sizeof((*s_etat_processus).erreur_execution))) !=
273: sizeof((*s_etat_processus).erreur_execution))
274: {
275: if (longueur_ecriture == -1)
276: {
277: break;
278: }
279: }
280: }
281:
282: if ((*s_etat_processus).var_volatile_processus_pere != 0)
283: {
284: // Racine des processus atteinte
285:
286: erreur = d_es;
287:
288: while((longueur_ecriture = write_atomic(s_etat_processus,
289: (*s_argument_thread).pipe_erreurs[1], &erreur,
290: sizeof((*s_etat_processus).erreur_systeme))) !=
291: sizeof((*s_etat_processus).erreur_systeme))
292: {
293: if (longueur_ecriture == -1)
294: {
295: break;
296: }
297: }
298: }
299: else
300: {
301: while((longueur_ecriture = write_atomic(s_etat_processus,
302: (*s_argument_thread).pipe_erreurs[1],
1.79 bertrand 303: (int *) &((*s_etat_processus).erreur_systeme),
1.1 bertrand 304: sizeof((*s_etat_processus).erreur_systeme))) !=
305: sizeof((*s_etat_processus).erreur_systeme))
306: {
307: if (longueur_ecriture == -1)
308: {
309: break;
310: }
311: }
312: }
313:
314: if ((*s_etat_processus).pid_erreur_processus_fils == 0)
315: {
316: ppid = getpid();
317:
318: while((longueur_ecriture = write_atomic(s_etat_processus,
319: (*s_argument_thread).pipe_erreurs[1],
320: &ppid, sizeof(ppid))) != sizeof(ppid))
321: {
322: if (longueur_ecriture == -1)
323: {
324: break;
325: }
326: }
327: }
328: else
329: {
330: while((longueur_ecriture = write_atomic(s_etat_processus,
331: (*s_argument_thread).pipe_erreurs[1],
332: &((*s_etat_processus).pid_erreur_processus_fils),
333: sizeof((*s_etat_processus).pid_erreur_processus_fils))) !=
334: sizeof((*s_etat_processus).pid_erreur_processus_fils))
335: {
336: if (longueur_ecriture == -1)
337: {
338: break;
339: }
340: }
341: }
342:
343: l_element_courant = (*s_etat_processus).s_fichiers;
344:
345: while(l_element_courant != NULL)
346: {
347: l_element_suivant = (*l_element_courant).suivant;
348:
349: if ((*((struct_descripteur_fichier *) (*l_element_courant)
350: .donnee)).pid == getpid())
351: {
352: fclose((*((struct_descripteur_fichier *)
1.5 bertrand 353: (*l_element_courant).donnee)).descripteur_c);
354:
355: if ((*((struct_descripteur_fichier *)
356: (*l_element_courant).donnee)).type != 'C')
357: {
358: sqlite3_close((*((struct_descripteur_fichier *)
359: (*l_element_courant).donnee)).descripteur_sqlite);
360: }
1.1 bertrand 361:
362: if ((*((struct_descripteur_fichier *) (*l_element_courant)
363: .donnee)).effacement == 'Y')
364: {
365: unlink((*((struct_descripteur_fichier *)
366: (*l_element_courant).donnee)).nom);
367: }
368: }
369:
370: free((*((struct_descripteur_fichier *) (*l_element_courant)
371: .donnee)).nom);
372: free((struct_descripteur_fichier *) (*l_element_courant).donnee);
373: free(l_element_courant);
374:
375: l_element_courant = l_element_suivant;
376: }
377:
1.83 bertrand 378: pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus));
1.1 bertrand 379:
380: l_element_courant = (struct_liste_chainee *)
381: (*s_etat_processus).l_base_pile_processus;
382:
383: while(l_element_courant != NULL)
384: {
385: if ((*(*((struct_processus_fils *) (*(*l_element_courant).donnee)
386: .objet)).thread).processus_detache == d_vrai)
387: {
388: if ((*s_etat_processus).debug == d_vrai)
389: {
390: if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
391: {
392: if ((*s_etat_processus).langue == 'F')
393: {
394: printf("[%d] Signalement pour arrêt du processus %d\n",
395: (int) getpid(),
396: (int) (*(*((struct_processus_fils *)
397: (*(*l_element_courant).donnee).objet)).thread)
398: .pid);
399: }
400: else
401: {
402: printf("[%d] Send stop signal to process %d\n",
403: (int) getpid(),
404: (int) (*(*((struct_processus_fils *)
405: (*(*l_element_courant).donnee).objet)).thread)
406: .pid);
407: }
408: }
409: }
410:
411: if ((*s_etat_processus).var_volatile_alarme != 0)
412: {
1.50 bertrand 413: envoi_signal_processus((*(*((struct_processus_fils *)
414: (*(*l_element_courant)
1.102 bertrand 415: .donnee).objet)).thread).pid, rpl_sigurg, d_faux);
1.1 bertrand 416: }
417: else
418: {
1.14 bertrand 419: if ((*s_etat_processus).arret_depuis_abort == -1)
420: {
1.50 bertrand 421: envoi_signal_processus((*(*((struct_processus_fils *)
422: (*(*l_element_courant)
1.102 bertrand 423: .donnee).objet)).thread).pid, rpl_sigabort, d_faux);
1.14 bertrand 424: }
425: else
426: {
1.50 bertrand 427: envoi_signal_processus((*(*((struct_processus_fils *)
428: (*(*l_element_courant)
1.102 bertrand 429: .donnee).objet)).thread).pid, rpl_sigstop,d_faux);
1.14 bertrand 430: }
1.1 bertrand 431: }
432: }
433: else
434: {
435: if ((*s_etat_processus).debug == d_vrai)
436: {
437: if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
438: {
439: if ((*s_etat_processus).langue == 'F')
440: {
441: printf("[%d] Signalement pour arrêt du thread %llu\n",
442: (int) getpid(), (unsigned long long)
443: (*(*((struct_processus_fils *)
444: (*(*l_element_courant).donnee).objet)).thread)
445: .tid);
446: }
447: else
448: {
449: printf("[%d] Send stop signal to thread %llu\n",
450: (int) getpid(), (unsigned long long)
451: (*(*((struct_processus_fils *)
452: (*(*l_element_courant).donnee).objet)).thread)
453: .tid);
454: }
455: }
456: }
457:
458: if ((*s_etat_processus).var_volatile_alarme != 0)
459: {
460: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
461: (*(*l_element_courant).donnee).objet)).thread).mutex))
462: != 0)
463: {
1.83 bertrand 464: pthread_mutex_unlock(&((*s_etat_processus)
465: .mutex_pile_processus));
1.1 bertrand 466: (*s_etat_processus).erreur_systeme = d_es_processus;
467:
468: pthread_mutex_lock(&((*s_argument_thread).mutex));
469: pthread_mutex_unlock(&((*s_argument_thread).mutex));
470:
471: (*s_argument_thread).thread_actif = d_faux;
472:
473: pthread_exit(NULL);
474: }
475:
476: if ((*(*((struct_processus_fils *)
477: (*(*l_element_courant).donnee).objet)).thread)
478: .thread_actif == d_vrai)
479: {
1.50 bertrand 480: envoi_signal_thread((*(*((struct_processus_fils *)
1.1 bertrand 481: (*(*l_element_courant).donnee).objet)).thread).tid,
1.50 bertrand 482: rpl_sigurg);
1.1 bertrand 483: }
484:
485: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
486: (*(*l_element_courant).donnee).objet)).thread)
487: .mutex)) != 0)
488: {
1.83 bertrand 489: pthread_mutex_unlock(&((*s_etat_processus)
490: .mutex_pile_processus));
1.1 bertrand 491: (*s_etat_processus).erreur_systeme = d_es_processus;
492:
493: pthread_mutex_lock(&((*s_argument_thread).mutex));
494: pthread_mutex_unlock(&((*s_argument_thread).mutex));
495:
496: (*s_argument_thread).thread_actif = d_faux;
497:
498: pthread_exit(NULL);
499: }
500: }
501: else
502: {
503: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
504: (*(*l_element_courant).donnee).objet)).thread).mutex))
505: != 0)
506: {
1.83 bertrand 507: pthread_mutex_unlock(&((*s_etat_processus)
508: .mutex_pile_processus));
1.1 bertrand 509: (*s_etat_processus).erreur_systeme = d_es_processus;
510:
511: pthread_mutex_lock(&((*s_argument_thread).mutex));
512: pthread_mutex_unlock(&((*s_argument_thread).mutex));
513:
514: (*s_argument_thread).thread_actif = d_faux;
515:
516: pthread_exit(NULL);
517: }
518:
519: if ((*(*((struct_processus_fils *)
520: (*(*l_element_courant).donnee).objet)).thread)
521: .thread_actif == d_vrai)
522: {
1.14 bertrand 523: if ((*s_etat_processus).arret_depuis_abort == -1)
524: {
1.50 bertrand 525: envoi_signal_thread((*(*((struct_processus_fils *)
1.14 bertrand 526: (*(*l_element_courant).donnee).objet)).thread)
1.50 bertrand 527: .tid, rpl_sigabort);
1.14 bertrand 528: }
529: else
530: {
1.50 bertrand 531: envoi_signal_thread((*(*((struct_processus_fils *)
1.14 bertrand 532: (*(*l_element_courant).donnee).objet)).thread)
1.50 bertrand 533: .tid, rpl_sigstop);
1.14 bertrand 534: }
1.1 bertrand 535: }
536:
537: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
538: (*(*l_element_courant).donnee).objet)).thread).mutex))
539: != 0)
540: {
1.83 bertrand 541: pthread_mutex_unlock(&((*s_etat_processus)
542: .mutex_pile_processus));
1.1 bertrand 543: (*s_etat_processus).erreur_systeme = d_es_processus;
544:
545: pthread_mutex_lock(&((*s_argument_thread).mutex));
546: pthread_mutex_unlock(&((*s_argument_thread).mutex));
547:
548: (*s_argument_thread).thread_actif = d_faux;
549:
550: pthread_exit(NULL);
551: }
552: }
553: }
554:
555: l_element_courant = (*l_element_courant).suivant;
556: }
557:
558: /*
559: * Attente de la fin de tous les processus fils
560: */
561:
562: for(i = 0; i < d_NOMBRE_INTERRUPTIONS;
563: (*s_etat_processus).masque_interruptions[i++] = 'I');
564:
565: attente.tv_sec = 0;
566: attente.tv_nsec = GRANULARITE_us * 1000;
567:
568: while((*s_etat_processus).l_base_pile_processus != NULL)
569: {
570: status = 0;
571:
572: l_element_courant = (struct_liste_chainee *)
573: (*s_etat_processus).l_base_pile_processus;
574:
575: registre_stop = (*s_etat_processus)
576: .var_volatile_traitement_retarde_stop;
577: (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
578:
1.74 bertrand 579: for(i = 0; i < (*(*((struct_processus_fils *)
1.1 bertrand 580: (*(*l_element_courant).donnee).objet)).thread)
581: .nombre_objets_dans_pipe; i++)
582: {
583: if ((s_objet_temporaire = lecture_pipe(s_etat_processus,
584: (*(*((struct_processus_fils *) (*(*l_element_courant)
585: .donnee).objet)).thread).pipe_objets[0])) != NULL)
586: {
587: liberation(s_etat_processus, s_objet_temporaire);
588:
589: (*(*((struct_processus_fils *) (*(*l_element_courant)
590: .donnee).objet)).thread).nombre_objets_dans_pipe--;
591:
592: action.sa_handler = SIG_IGN;
593: action.sa_flags = SA_ONSTACK;
594:
595: if (sigaction(SIGPIPE, &action, ®istre) != 0)
596: {
1.83 bertrand 597: pthread_mutex_unlock(&((*s_etat_processus)
598: .mutex_pile_processus));
1.1 bertrand 599:
600: if (registre_stop == 0)
601: {
602: if ((*s_etat_processus)
603: .var_volatile_traitement_retarde_stop
604: == -1)
605: {
606: (*s_etat_processus)
607: .var_volatile_requete_arret = -1;
608: }
609:
610: (*s_etat_processus)
611: .var_volatile_traitement_retarde_stop =
612: registre_stop;
613: }
614:
615: (*s_etat_processus).erreur_systeme = d_es_signal;
616: exit(EXIT_FAILURE);
617: }
618:
619: while((longueur_ecriture = write_atomic(
620: s_etat_processus, (*(*((struct_processus_fils *)
621: (*(*l_element_courant).donnee).objet)).thread)
622: .pipe_nombre_injections[1], "+",
623: sizeof(unsigned char))) !=
624: sizeof(unsigned char))
625: {
626: if (longueur_ecriture == -1)
627: {
628: // Le processus n'existe plus.
629: break;
630: }
631: }
632:
633: if (registre_stop == 0)
634: {
635: if ((*s_etat_processus)
636: .var_volatile_traitement_retarde_stop == -1)
637: {
638: (*s_etat_processus).var_volatile_requete_arret
639: = -1;
640: }
641:
642: (*s_etat_processus)
643: .var_volatile_traitement_retarde_stop =
644: registre_stop;
645: }
646:
647: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
648: {
1.83 bertrand 649: pthread_mutex_unlock(&((*s_etat_processus)
650: .mutex_pile_processus));
1.1 bertrand 651:
652: (*s_etat_processus).erreur_systeme = d_es_signal;
653: exit(EXIT_FAILURE);
654: }
655: }
656: }
657:
658: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
659: .donnee).objet)).thread).processus_detache == d_vrai)
660: {
661: if (waitpid((*(*((struct_processus_fils *)
662: (*(*l_element_courant).donnee).objet)).thread).pid,
663: &status, WNOHANG) < 0)
664: {
665: }
666: }
667:
1.82 bertrand 668: if (pthread_mutex_lock(&((*s_etat_processus).mutex_interruptions)) != 0)
669: {
1.83 bertrand 670: pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
1.82 bertrand 671:
672: (*s_etat_processus).erreur_systeme = d_es_processus;
673: exit(EXIT_FAILURE);
674: }
675:
1.15 bertrand 676: if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
677: {
678: affectation_interruptions_logicielles(s_etat_processus);
679: }
680:
1.82 bertrand 681: if (pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions))
682: != 0)
683: {
1.83 bertrand 684: pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
1.82 bertrand 685:
686: (*s_etat_processus).erreur_systeme = d_es_processus;
687: exit(EXIT_FAILURE);
688: }
689:
1.83 bertrand 690: pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
1.1 bertrand 691: nanosleep(&attente, NULL);
1.83 bertrand 692: pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus));
1.1 bertrand 693: }
694:
1.83 bertrand 695: pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
1.1 bertrand 696:
697: l_element_courant = (*s_etat_processus).s_sockets;
698:
699: while(l_element_courant != NULL)
700: {
701: l_element_suivant = (*l_element_courant).suivant;
702:
703: /*
704: * Fermeture des sockets créées dans le processus courant.
705: */
706:
707: if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
708: .pid == getpid()) && (pthread_equal((*((struct_socket *)
709: (*(*l_element_courant).donnee).objet)).tid, pthread_self())
710: != 0))
711: {
712: if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
713: .socket_connectee == d_vrai)
714: {
715: shutdown((*((struct_socket *) (*(*l_element_courant).donnee)
716: .objet)).socket, SHUT_RDWR);
717: }
718:
719: close((*((struct_socket *) (*(*l_element_courant).donnee).objet))
720: .socket);
721:
722: if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
723: .effacement == 'Y')
724: {
725: unlink((*((struct_socket *) (*(*l_element_courant).donnee)
726: .objet)).adresse);
727: }
728: }
729:
730: liberation(s_etat_processus, (*((struct_liste_chainee *)
731: l_element_courant)).donnee);
732: free(l_element_courant);
733:
734: l_element_courant = l_element_suivant;
735: }
736:
737: l_element_courant = (*s_etat_processus).s_connecteurs_sql;
738:
739: while(l_element_courant != NULL)
740: {
741: l_element_suivant = (*l_element_courant).suivant;
742:
743: /*
744: * Fermeture des connecteurs créés dans le processus courant.
745: */
746:
747: if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
748: .pid == getpid()) && (pthread_equal((*((struct_socket *)
749: (*(*l_element_courant).donnee).objet)).tid, pthread_self())
750: != 0))
751: {
752: sqlclose((*l_element_courant).donnee);
753: }
754:
755: liberation(s_etat_processus, (*((struct_liste_chainee *)
756: l_element_courant)).donnee);
757: free(l_element_courant);
758:
759: l_element_courant = l_element_suivant;
760: }
761:
762: if ((((*s_etat_processus).erreur_execution != d_ex) ||
763: ((*s_etat_processus).exception != d_ep) ||
764: ((*s_etat_processus).erreur_systeme != d_es)) &&
765: ((*s_etat_processus).var_volatile_traitement_sigint == 0))
766: {
767: printf("%s [%d]\n", message =
768: messages(s_etat_processus), (int) getpid());
769: free(message);
770:
771: if ((*s_etat_processus).core == d_vrai)
772: {
773: printf("\n");
774:
775: if ((*s_etat_processus).langue == 'F')
776: {
777: printf("+++Information : Génération du fichier rpl-core "
778: "[%d]\n", (int) getpid());
779: }
780: else
781: {
782: printf("+++Information : Writing rpl-core file [%d]\n",
783: (int) getpid());
784: }
785:
786: rplcore(s_etat_processus);
787:
788: if ((*s_etat_processus).langue == 'F')
789: {
790: printf("+++Information : Processus tracé [%d]\n",
791: (int) getpid());
792: }
793: else
794: {
795: printf("+++Information : Done [%d]\n", (int) getpid());
796: }
797:
798: printf("\n");
799: fflush(stdout);
800: }
801: }
802:
803: if ((*s_etat_processus).entree_standard != NULL)
804: {
805: pclose((*s_etat_processus).entree_standard);
806: (*s_etat_processus).entree_standard = NULL;
807: }
808:
809: if ((*s_etat_processus).fichiers_graphiques != NULL)
810: {
811: instruction_cllcd(s_etat_processus);
812: }
813:
814: liberation(s_etat_processus, (*s_etat_processus).indep);
815: liberation(s_etat_processus, (*s_etat_processus).depend);
816:
817: free((*s_etat_processus).label_x);
818: free((*s_etat_processus).label_y);
819: free((*s_etat_processus).label_z);
820: free((*s_etat_processus).titre);
821: free((*s_etat_processus).legende);
822:
823: liberation(s_etat_processus,
824: (*s_etat_processus).parametres_courbes_de_niveau);
825:
826: if ((*s_etat_processus).instruction_derniere_erreur != NULL)
827: {
828: free((*s_etat_processus).instruction_derniere_erreur);
829: (*s_etat_processus).instruction_derniere_erreur = NULL;
830: }
831:
1.35 bertrand 832: liberation_arbre_variables(s_etat_processus,
833: (*s_etat_processus).s_arbre_variables, d_faux);
1.1 bertrand 834:
1.69 bertrand 835: l_element_statique_courant = (*s_etat_processus)
836: .l_liste_variables_statiques;
837:
838: while(l_element_statique_courant != NULL)
839: {
840: l_element_statique_suivant = (*l_element_statique_courant).suivant;
841: free(l_element_statique_courant);
842: l_element_statique_courant = l_element_statique_suivant;
843: }
844:
1.1 bertrand 845: l_element_courant = (*s_etat_processus).l_base_pile;
846: while(l_element_courant != NULL)
847: {
848: l_element_suivant = (*l_element_courant).suivant;
849:
850: liberation(s_etat_processus, (*l_element_courant).donnee);
851: free(l_element_courant);
852:
853: l_element_courant = l_element_suivant;
854: }
855:
856: l_element_courant = (*s_etat_processus).l_base_pile_last;
857: while(l_element_courant != NULL)
858: {
859: l_element_suivant = (*l_element_courant).suivant;
860:
861: liberation(s_etat_processus, (*l_element_courant).donnee);
862: free(l_element_courant);
863:
864: l_element_courant = l_element_suivant;
865: }
866:
867: l_element_courant = (*s_etat_processus).l_base_pile_contextes;
868: while(l_element_courant != NULL)
869: {
870: l_element_suivant = (*l_element_courant).suivant;
871:
872: liberation(s_etat_processus, (*l_element_courant).donnee);
873: free(l_element_courant);
874:
875: l_element_courant = l_element_suivant;
876: }
877:
878: l_element_courant = (*s_etat_processus).l_base_pile_taille_contextes;
879: while(l_element_courant != NULL)
880: {
881: l_element_suivant = (*l_element_courant).suivant;
882:
883: liberation(s_etat_processus, (*l_element_courant).donnee);
884: free(l_element_courant);
885:
886: l_element_courant = l_element_suivant;
887: }
888:
889: l_element_courant = (struct_liste_chainee *)
890: (*s_etat_processus).l_base_pile_systeme;
891: while(l_element_courant != NULL)
892: {
893: l_element_suivant = (struct_liste_chainee *)
894: (*((struct_liste_pile_systeme *)
895: l_element_courant)).suivant;
896:
897: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
898: l_element_courant)).indice_boucle);
899: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
900: l_element_courant)).limite_indice_boucle);
901: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
902: l_element_courant)).objet_de_test);
903:
904: if ((*((struct_liste_pile_systeme *)
905: l_element_courant)).nom_variable != NULL)
906: {
907: free((*((struct_liste_pile_systeme *)
908: l_element_courant)).nom_variable);
909: }
910:
911: free((struct_liste_pile_systeme *) l_element_courant);
912:
913: l_element_courant = l_element_suivant;
914: }
915:
916: l_element_courant = (*s_etat_processus).s_bibliotheques;
917:
918: while(l_element_courant != NULL)
919: {
920: l_element_suivant = (*l_element_courant).suivant;
921:
922: free((*((struct_bibliotheque *) (*l_element_courant).donnee)).nom);
923:
924: if (((*((struct_bibliotheque *) (*l_element_courant).donnee)).pid
925: == getpid()) && (pthread_equal((*((struct_bibliotheque *)
926: (*l_element_courant).donnee)).tid, pthread_self()) != 0))
927: {
928: dlclose((*((struct_bibliotheque *) (*l_element_courant).donnee))
929: .descripteur);
930: }
931:
932: free((*l_element_courant).donnee);
933: free(l_element_courant);
934:
935: l_element_courant = l_element_suivant;
936: }
937:
938: for(i = 0; i < (*s_etat_processus).nombre_instructions_externes; i++)
939: {
940: free((*s_etat_processus).s_instructions_externes[i].nom);
941: free((*s_etat_processus).s_instructions_externes[i]
942: .nom_bibliotheque);
943: }
944:
945: if ((*s_etat_processus).nombre_instructions_externes != 0)
946: {
947: free((*s_etat_processus).s_instructions_externes);
948: }
949:
950: if ((*s_etat_processus).debug == d_vrai)
951: if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
952: {
953: if ((*s_etat_processus).langue == 'F')
954: {
955: printf("[%d] Fin du thread %llu\n", (int) getpid(),
956: (unsigned long long) pthread_self());
957: }
958: else
959: {
960: printf("[%d] End of thread %llu\n", (int) getpid(),
961: (unsigned long long) pthread_self());
962: }
963:
964: fflush(stdout);
965: }
966:
967: liberation(s_etat_processus, (*s_argument_thread).argument);
1.11 bertrand 968: liberation(s_etat_processus, (*s_etat_processus).at_exit);
1.25 bertrand 969: liberation(s_etat_processus, (*s_etat_processus).at_poke);
1.1 bertrand 970:
971: for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
972: {
973: liberation(s_etat_processus,
974: (*s_etat_processus).corps_interruptions[i]);
975:
976: l_element_courant = (*s_etat_processus)
977: .pile_origine_interruptions[i];
978:
979: while(l_element_courant != NULL)
980: {
981: l_element_suivant = (*l_element_courant).suivant;
982:
983: liberation(s_etat_processus, (*l_element_courant).donnee);
984: free(l_element_courant);
985:
986: l_element_courant = l_element_suivant;
987: }
988: }
989:
990: l_element_courant = (struct_liste_chainee *) (*s_etat_processus).s_marques;
991:
992: while(l_element_courant != NULL)
993: {
994: free((*((struct_marque *) l_element_courant)).label);
995: free((*((struct_marque *) l_element_courant)).position);
996: l_element_suivant = (struct_liste_chainee *)
997: (*((struct_marque *) l_element_courant)).suivant;
998: free((struct_marque *) l_element_courant);
999: l_element_courant = l_element_suivant;
1000: }
1001:
1002: if ((*s_etat_processus).generateur_aleatoire != NULL)
1003: {
1004: liberation_generateur_aleatoire(s_etat_processus);
1005: }
1006:
1007: if ((*s_etat_processus).profilage == d_vrai)
1008: {
1009: ecriture_profil(s_etat_processus);
1010: liberation_profil(s_etat_processus);
1011: }
1012:
1013: retrait_thread(s_etat_processus);
1.83 bertrand 1014: pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus));
1.21 bertrand 1015: pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
1.82 bertrand 1016: pthread_mutex_destroy(&((*s_etat_processus).mutex_interruptions));
1.83 bertrand 1017: pthread_mutex_destroy(&((*s_etat_processus).mutex_signaux));
1.53 bertrand 1018:
1019: # ifndef SEMAPHORES_NOMMES
1.111 ! bertrand 1020: sem_post(&((*s_etat_processus).semaphore_fork));
1.53 bertrand 1021: sem_destroy(&((*s_etat_processus).semaphore_fork));
1022: # else
1.111 ! bertrand 1023: sem_post((*s_etat_processus).semaphore_fork);
1.55 bertrand 1024: sem_destroy3((*s_etat_processus).semaphore_fork, getpid(),
1025: pthread_self(), SEM_FORK);
1.53 bertrand 1026: # endif
1.28 bertrand 1027:
1.101 bertrand 1028: close((*s_argument_thread).pipe_erreurs[1]);
1029: close((*s_argument_thread).pipe_interruptions[1]);
1030: close((*s_argument_thread).pipe_nombre_elements_attente[1]);
1031: close((*s_argument_thread).pipe_objets[1]);
1032: close((*s_argument_thread).pipe_injections[0]);
1033: close((*s_argument_thread).pipe_nombre_injections[0]);
1034: close((*s_argument_thread).pipe_acquittement[0]);
1035:
1.45 bertrand 1036: liberation_contexte_cas(s_etat_processus);
1.95 bertrand 1037: free((*s_etat_processus).localisation);
1038: liberation_allocateur(s_etat_processus);
1.92 bertrand 1039: liberation_allocateur_buffer(s_etat_processus);
1.95 bertrand 1040: pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer));
1.93 bertrand 1041: sys_free(s_etat_processus);
1.1 bertrand 1042:
1043: pthread_mutex_lock(&((*s_argument_thread).mutex));
1.81 bertrand 1044: (*s_argument_thread).thread_actif = d_faux;
1.1 bertrand 1045: pthread_mutex_unlock(&((*s_argument_thread).mutex));
1046:
1047: pthread_exit(NULL);
1.26 bertrand 1048: return(NULL);
1.1 bertrand 1049: }
1050:
1051: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>