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