1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.22
4: Copyright (C) 1989-2015 Dr. BERTRAND Joël
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:
23: #include "rpl-conv.h"
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: {
41: int status;
42:
43: pid_t ppid;
44:
45: sig_atomic_t registre_stop;
46:
47: ssize_t longueur_ecriture;
48:
49: struct_descripteur_thread *s_argument_thread;
50:
51: struct_liste_chainee *l_element_courant;
52: struct_liste_chainee *l_element_suivant;
53:
54: struct_liste_variables_statiques *l_element_statique_courant;
55: struct_liste_variables_statiques *l_element_statique_suivant;
56:
57: struct_objet *s_objet_temporaire;
58:
59: struct_processus *s_etat_processus;
60:
61: struct sigaction action;
62: struct sigaction registre;
63:
64: struct timespec attente;
65:
66: unsigned char caractere;
67: unsigned char *message;
68:
69: unsigned int erreur;
70:
71: integer8 i;
72:
73: attente.tv_sec = 0;
74: attente.tv_nsec = GRANULARITE_us * 1000;
75:
76: s_argument_thread = (struct_descripteur_thread *) argument;
77: s_etat_processus = (*s_argument_thread).s_nouvel_etat_processus;
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:
90: (*s_argument_thread).tid = pthread_self();
91: insertion_thread(s_etat_processus, d_faux);
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:
99: (*s_argument_thread).thread_actif = d_vrai;
100:
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:
107: // Envoi d'une donnée pour signaler le démarrage du thread au thread
108: // de surveillance.
109:
110: caractere = 0;
111:
112: if (write_atomic(s_etat_processus,
113: (*s_argument_thread).pipe_nombre_elements_attente[1],
114: &caractere, sizeof(caractere)) != sizeof(caractere))
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,
124: (*s_argument_thread).pipe_nombre_elements_attente[1],
125: &caractere, sizeof(caractere))) != sizeof(caractere))
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:
142: // Attente de la réception du signal rpl_sigstart.
143:
144: for((*s_etat_processus).demarrage_fils = d_faux;;)
145: {
146: scrutation_interruptions(s_etat_processus);
147:
148: if ((*s_etat_processus).demarrage_fils == d_vrai)
149: {
150: break;
151: }
152:
153: nanosleep(&attente, NULL);
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: {
179: if (setjmp(contexte_thread) == 0)
180: {
181: if (evaluation(s_etat_processus, (*s_argument_thread).argument, 'E')
182: == d_erreur)
183: {
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: }
190: }
191: else
192: {
193: if (((*s_etat_processus).arret_depuis_abort == 0)
194: && ((*s_etat_processus).at_exit != NULL))
195: {
196: (*s_etat_processus).var_volatile_requete_arret = 0;
197: (*s_etat_processus).var_volatile_alarme = 0;
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: }
204:
205: if (evaluation(s_etat_processus,
206: (*s_etat_processus).at_exit, 'E') == d_erreur)
207: {
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: }
214: }
215:
216: if ((*s_etat_processus).profilage == d_vrai)
217: {
218: profilage(s_etat_processus, NULL);
219: }
220: }
221: }
222: }
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:
235: caractere = 0;
236:
237: while((longueur_ecriture = write_atomic(s_etat_processus,
238: (*s_argument_thread).pipe_nombre_elements_attente[1],
239: &caractere, sizeof(caractere))) != sizeof(caractere))
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],
268: (int *) &((*s_etat_processus).erreur_execution),
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],
300: (int *) &((*s_etat_processus).erreur_systeme),
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]);
342: close((*s_argument_thread).pipe_nombre_elements_attente[1]);
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 *)
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: }
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_pile_processus));
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: {
418: envoi_signal_processus((*(*((struct_processus_fils *)
419: (*(*l_element_courant)
420: .donnee).objet)).thread).pid, rpl_sigurg);
421: }
422: else
423: {
424: if ((*s_etat_processus).arret_depuis_abort == -1)
425: {
426: envoi_signal_processus((*(*((struct_processus_fils *)
427: (*(*l_element_courant)
428: .donnee).objet)).thread).pid, rpl_sigabort);
429: }
430: else
431: {
432: envoi_signal_processus((*(*((struct_processus_fils *)
433: (*(*l_element_courant)
434: .donnee).objet)).thread).pid, rpl_sigstop);
435: }
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)
470: .mutex_pile_processus));
471: (*s_etat_processus).erreur_systeme = d_es_processus;
472:
473: pthread_mutex_lock(&((*s_argument_thread).mutex));
474: pthread_mutex_unlock(&((*s_argument_thread).mutex));
475:
476: (*s_argument_thread).thread_actif = d_faux;
477:
478: pthread_exit(NULL);
479: }
480:
481: if ((*(*((struct_processus_fils *)
482: (*(*l_element_courant).donnee).objet)).thread)
483: .thread_actif == d_vrai)
484: {
485: envoi_signal_thread((*(*((struct_processus_fils *)
486: (*(*l_element_courant).donnee).objet)).thread).tid,
487: rpl_sigurg);
488: }
489:
490: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
491: (*(*l_element_courant).donnee).objet)).thread)
492: .mutex)) != 0)
493: {
494: pthread_mutex_unlock(&((*s_etat_processus)
495: .mutex_pile_processus));
496: (*s_etat_processus).erreur_systeme = d_es_processus;
497:
498: pthread_mutex_lock(&((*s_argument_thread).mutex));
499: pthread_mutex_unlock(&((*s_argument_thread).mutex));
500:
501: (*s_argument_thread).thread_actif = d_faux;
502:
503: pthread_exit(NULL);
504: }
505: }
506: else
507: {
508: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
509: (*(*l_element_courant).donnee).objet)).thread).mutex))
510: != 0)
511: {
512: pthread_mutex_unlock(&((*s_etat_processus)
513: .mutex_pile_processus));
514: (*s_etat_processus).erreur_systeme = d_es_processus;
515:
516: pthread_mutex_lock(&((*s_argument_thread).mutex));
517: pthread_mutex_unlock(&((*s_argument_thread).mutex));
518:
519: (*s_argument_thread).thread_actif = d_faux;
520:
521: pthread_exit(NULL);
522: }
523:
524: if ((*(*((struct_processus_fils *)
525: (*(*l_element_courant).donnee).objet)).thread)
526: .thread_actif == d_vrai)
527: {
528: if ((*s_etat_processus).arret_depuis_abort == -1)
529: {
530: envoi_signal_thread((*(*((struct_processus_fils *)
531: (*(*l_element_courant).donnee).objet)).thread)
532: .tid, rpl_sigabort);
533: }
534: else
535: {
536: envoi_signal_thread((*(*((struct_processus_fils *)
537: (*(*l_element_courant).donnee).objet)).thread)
538: .tid, rpl_sigstop);
539: }
540: }
541:
542: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
543: (*(*l_element_courant).donnee).objet)).thread).mutex))
544: != 0)
545: {
546: pthread_mutex_unlock(&((*s_etat_processus)
547: .mutex_pile_processus));
548: (*s_etat_processus).erreur_systeme = d_es_processus;
549:
550: pthread_mutex_lock(&((*s_argument_thread).mutex));
551: pthread_mutex_unlock(&((*s_argument_thread).mutex));
552:
553: (*s_argument_thread).thread_actif = d_faux;
554:
555: pthread_exit(NULL);
556: }
557: }
558: }
559:
560: l_element_courant = (*l_element_courant).suivant;
561: }
562:
563: /*
564: * Attente de la fin de tous les processus fils
565: */
566:
567: for(i = 0; i < d_NOMBRE_INTERRUPTIONS;
568: (*s_etat_processus).masque_interruptions[i++] = 'I');
569:
570: attente.tv_sec = 0;
571: attente.tv_nsec = GRANULARITE_us * 1000;
572:
573: while((*s_etat_processus).l_base_pile_processus != NULL)
574: {
575: status = 0;
576:
577: l_element_courant = (struct_liste_chainee *)
578: (*s_etat_processus).l_base_pile_processus;
579:
580: registre_stop = (*s_etat_processus)
581: .var_volatile_traitement_retarde_stop;
582: (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
583:
584: for(i = 0; i < (*(*((struct_processus_fils *)
585: (*(*l_element_courant).donnee).objet)).thread)
586: .nombre_objets_dans_pipe; i++)
587: {
588: if ((s_objet_temporaire = lecture_pipe(s_etat_processus,
589: (*(*((struct_processus_fils *) (*(*l_element_courant)
590: .donnee).objet)).thread).pipe_objets[0])) != NULL)
591: {
592: liberation(s_etat_processus, s_objet_temporaire);
593:
594: (*(*((struct_processus_fils *) (*(*l_element_courant)
595: .donnee).objet)).thread).nombre_objets_dans_pipe--;
596:
597: action.sa_handler = SIG_IGN;
598: action.sa_flags = SA_ONSTACK;
599:
600: if (sigaction(SIGPIPE, &action, ®istre) != 0)
601: {
602: pthread_mutex_unlock(&((*s_etat_processus)
603: .mutex_pile_processus));
604:
605: if (registre_stop == 0)
606: {
607: if ((*s_etat_processus)
608: .var_volatile_traitement_retarde_stop
609: == -1)
610: {
611: (*s_etat_processus)
612: .var_volatile_requete_arret = -1;
613: }
614:
615: (*s_etat_processus)
616: .var_volatile_traitement_retarde_stop =
617: registre_stop;
618: }
619:
620: (*s_etat_processus).erreur_systeme = d_es_signal;
621: exit(EXIT_FAILURE);
622: }
623:
624: while((longueur_ecriture = write_atomic(
625: s_etat_processus, (*(*((struct_processus_fils *)
626: (*(*l_element_courant).donnee).objet)).thread)
627: .pipe_nombre_injections[1], "+",
628: sizeof(unsigned char))) !=
629: sizeof(unsigned char))
630: {
631: if (longueur_ecriture == -1)
632: {
633: // Le processus n'existe plus.
634: break;
635: }
636: }
637:
638: if (registre_stop == 0)
639: {
640: if ((*s_etat_processus)
641: .var_volatile_traitement_retarde_stop == -1)
642: {
643: (*s_etat_processus).var_volatile_requete_arret
644: = -1;
645: }
646:
647: (*s_etat_processus)
648: .var_volatile_traitement_retarde_stop =
649: registre_stop;
650: }
651:
652: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
653: {
654: pthread_mutex_unlock(&((*s_etat_processus)
655: .mutex_pile_processus));
656:
657: (*s_etat_processus).erreur_systeme = d_es_signal;
658: exit(EXIT_FAILURE);
659: }
660: }
661: }
662:
663: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
664: .donnee).objet)).thread).processus_detache == d_vrai)
665: {
666: if (waitpid((*(*((struct_processus_fils *)
667: (*(*l_element_courant).donnee).objet)).thread).pid,
668: &status, WNOHANG) < 0)
669: {
670: }
671: }
672:
673: if (pthread_mutex_lock(&((*s_etat_processus).mutex_interruptions)) != 0)
674: {
675: pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
676:
677: (*s_etat_processus).erreur_systeme = d_es_processus;
678: exit(EXIT_FAILURE);
679: }
680:
681: if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
682: {
683: affectation_interruptions_logicielles(s_etat_processus);
684: }
685:
686: if (pthread_mutex_unlock(&((*s_etat_processus).mutex_interruptions))
687: != 0)
688: {
689: pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
690:
691: (*s_etat_processus).erreur_systeme = d_es_processus;
692: exit(EXIT_FAILURE);
693: }
694:
695: pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
696: nanosleep(&attente, NULL);
697: pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus));
698: }
699:
700: pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus));
701:
702: l_element_courant = (*s_etat_processus).s_sockets;
703:
704: while(l_element_courant != NULL)
705: {
706: l_element_suivant = (*l_element_courant).suivant;
707:
708: /*
709: * Fermeture des sockets créées dans le processus courant.
710: */
711:
712: if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
713: .pid == getpid()) && (pthread_equal((*((struct_socket *)
714: (*(*l_element_courant).donnee).objet)).tid, pthread_self())
715: != 0))
716: {
717: if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
718: .socket_connectee == d_vrai)
719: {
720: shutdown((*((struct_socket *) (*(*l_element_courant).donnee)
721: .objet)).socket, SHUT_RDWR);
722: }
723:
724: close((*((struct_socket *) (*(*l_element_courant).donnee).objet))
725: .socket);
726:
727: if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
728: .effacement == 'Y')
729: {
730: unlink((*((struct_socket *) (*(*l_element_courant).donnee)
731: .objet)).adresse);
732: }
733: }
734:
735: liberation(s_etat_processus, (*((struct_liste_chainee *)
736: l_element_courant)).donnee);
737: free(l_element_courant);
738:
739: l_element_courant = l_element_suivant;
740: }
741:
742: l_element_courant = (*s_etat_processus).s_connecteurs_sql;
743:
744: while(l_element_courant != NULL)
745: {
746: l_element_suivant = (*l_element_courant).suivant;
747:
748: /*
749: * Fermeture des connecteurs créés dans le processus courant.
750: */
751:
752: if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
753: .pid == getpid()) && (pthread_equal((*((struct_socket *)
754: (*(*l_element_courant).donnee).objet)).tid, pthread_self())
755: != 0))
756: {
757: sqlclose((*l_element_courant).donnee);
758: }
759:
760: liberation(s_etat_processus, (*((struct_liste_chainee *)
761: l_element_courant)).donnee);
762: free(l_element_courant);
763:
764: l_element_courant = l_element_suivant;
765: }
766:
767: if ((((*s_etat_processus).erreur_execution != d_ex) ||
768: ((*s_etat_processus).exception != d_ep) ||
769: ((*s_etat_processus).erreur_systeme != d_es)) &&
770: ((*s_etat_processus).var_volatile_traitement_sigint == 0))
771: {
772: printf("%s [%d]\n", message =
773: messages(s_etat_processus), (int) getpid());
774: free(message);
775:
776: if ((*s_etat_processus).core == d_vrai)
777: {
778: printf("\n");
779:
780: if ((*s_etat_processus).langue == 'F')
781: {
782: printf("+++Information : Génération du fichier rpl-core "
783: "[%d]\n", (int) getpid());
784: }
785: else
786: {
787: printf("+++Information : Writing rpl-core file [%d]\n",
788: (int) getpid());
789: }
790:
791: rplcore(s_etat_processus);
792:
793: if ((*s_etat_processus).langue == 'F')
794: {
795: printf("+++Information : Processus tracé [%d]\n",
796: (int) getpid());
797: }
798: else
799: {
800: printf("+++Information : Done [%d]\n", (int) getpid());
801: }
802:
803: printf("\n");
804: fflush(stdout);
805: }
806: }
807:
808: if ((*s_etat_processus).entree_standard != NULL)
809: {
810: pclose((*s_etat_processus).entree_standard);
811: (*s_etat_processus).entree_standard = NULL;
812: }
813:
814: if ((*s_etat_processus).fichiers_graphiques != NULL)
815: {
816: instruction_cllcd(s_etat_processus);
817: }
818:
819: liberation(s_etat_processus, (*s_etat_processus).indep);
820: liberation(s_etat_processus, (*s_etat_processus).depend);
821:
822: free((*s_etat_processus).label_x);
823: free((*s_etat_processus).label_y);
824: free((*s_etat_processus).label_z);
825: free((*s_etat_processus).titre);
826: free((*s_etat_processus).legende);
827:
828: liberation(s_etat_processus,
829: (*s_etat_processus).parametres_courbes_de_niveau);
830:
831: if ((*s_etat_processus).instruction_derniere_erreur != NULL)
832: {
833: free((*s_etat_processus).instruction_derniere_erreur);
834: (*s_etat_processus).instruction_derniere_erreur = NULL;
835: }
836:
837: liberation_arbre_variables(s_etat_processus,
838: (*s_etat_processus).s_arbre_variables, d_faux);
839:
840: l_element_statique_courant = (*s_etat_processus)
841: .l_liste_variables_statiques;
842:
843: while(l_element_statique_courant != NULL)
844: {
845: l_element_statique_suivant = (*l_element_statique_courant).suivant;
846: free(l_element_statique_courant);
847: l_element_statique_courant = l_element_statique_suivant;
848: }
849:
850: l_element_courant = (*s_etat_processus).l_base_pile;
851: while(l_element_courant != NULL)
852: {
853: l_element_suivant = (*l_element_courant).suivant;
854:
855: liberation(s_etat_processus, (*l_element_courant).donnee);
856: free(l_element_courant);
857:
858: l_element_courant = l_element_suivant;
859: }
860:
861: l_element_courant = (*s_etat_processus).l_base_pile_last;
862: while(l_element_courant != NULL)
863: {
864: l_element_suivant = (*l_element_courant).suivant;
865:
866: liberation(s_etat_processus, (*l_element_courant).donnee);
867: free(l_element_courant);
868:
869: l_element_courant = l_element_suivant;
870: }
871:
872: l_element_courant = (*s_etat_processus).l_base_pile_contextes;
873: while(l_element_courant != NULL)
874: {
875: l_element_suivant = (*l_element_courant).suivant;
876:
877: liberation(s_etat_processus, (*l_element_courant).donnee);
878: free(l_element_courant);
879:
880: l_element_courant = l_element_suivant;
881: }
882:
883: l_element_courant = (*s_etat_processus).l_base_pile_taille_contextes;
884: while(l_element_courant != NULL)
885: {
886: l_element_suivant = (*l_element_courant).suivant;
887:
888: liberation(s_etat_processus, (*l_element_courant).donnee);
889: free(l_element_courant);
890:
891: l_element_courant = l_element_suivant;
892: }
893:
894: l_element_courant = (struct_liste_chainee *)
895: (*s_etat_processus).l_base_pile_systeme;
896: while(l_element_courant != NULL)
897: {
898: l_element_suivant = (struct_liste_chainee *)
899: (*((struct_liste_pile_systeme *)
900: l_element_courant)).suivant;
901:
902: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
903: l_element_courant)).indice_boucle);
904: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
905: l_element_courant)).limite_indice_boucle);
906: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
907: l_element_courant)).objet_de_test);
908:
909: if ((*((struct_liste_pile_systeme *)
910: l_element_courant)).nom_variable != NULL)
911: {
912: free((*((struct_liste_pile_systeme *)
913: l_element_courant)).nom_variable);
914: }
915:
916: free((struct_liste_pile_systeme *) l_element_courant);
917:
918: l_element_courant = l_element_suivant;
919: }
920:
921: l_element_courant = (*s_etat_processus).s_bibliotheques;
922:
923: while(l_element_courant != NULL)
924: {
925: l_element_suivant = (*l_element_courant).suivant;
926:
927: free((*((struct_bibliotheque *) (*l_element_courant).donnee)).nom);
928:
929: if (((*((struct_bibliotheque *) (*l_element_courant).donnee)).pid
930: == getpid()) && (pthread_equal((*((struct_bibliotheque *)
931: (*l_element_courant).donnee)).tid, pthread_self()) != 0))
932: {
933: dlclose((*((struct_bibliotheque *) (*l_element_courant).donnee))
934: .descripteur);
935: }
936:
937: free((*l_element_courant).donnee);
938: free(l_element_courant);
939:
940: l_element_courant = l_element_suivant;
941: }
942:
943: for(i = 0; i < (*s_etat_processus).nombre_instructions_externes; i++)
944: {
945: free((*s_etat_processus).s_instructions_externes[i].nom);
946: free((*s_etat_processus).s_instructions_externes[i]
947: .nom_bibliotheque);
948: }
949:
950: if ((*s_etat_processus).nombre_instructions_externes != 0)
951: {
952: free((*s_etat_processus).s_instructions_externes);
953: }
954:
955: if ((*s_etat_processus).debug == d_vrai)
956: if (((*s_etat_processus).type_debug & d_debug_processus) != 0)
957: {
958: if ((*s_etat_processus).langue == 'F')
959: {
960: printf("[%d] Fin du thread %llu\n", (int) getpid(),
961: (unsigned long long) pthread_self());
962: }
963: else
964: {
965: printf("[%d] End of thread %llu\n", (int) getpid(),
966: (unsigned long long) pthread_self());
967: }
968:
969: fflush(stdout);
970: }
971:
972: liberation(s_etat_processus, (*s_argument_thread).argument);
973: liberation(s_etat_processus, (*s_etat_processus).at_exit);
974: liberation(s_etat_processus, (*s_etat_processus).at_poke);
975:
976: for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
977: {
978: liberation(s_etat_processus,
979: (*s_etat_processus).corps_interruptions[i]);
980:
981: l_element_courant = (*s_etat_processus)
982: .pile_origine_interruptions[i];
983:
984: while(l_element_courant != NULL)
985: {
986: l_element_suivant = (*l_element_courant).suivant;
987:
988: liberation(s_etat_processus, (*l_element_courant).donnee);
989: free(l_element_courant);
990:
991: l_element_courant = l_element_suivant;
992: }
993: }
994:
995: l_element_courant = (struct_liste_chainee *) (*s_etat_processus).s_marques;
996:
997: while(l_element_courant != NULL)
998: {
999: free((*((struct_marque *) l_element_courant)).label);
1000: free((*((struct_marque *) l_element_courant)).position);
1001: l_element_suivant = (struct_liste_chainee *)
1002: (*((struct_marque *) l_element_courant)).suivant;
1003: free((struct_marque *) l_element_courant);
1004: l_element_courant = l_element_suivant;
1005: }
1006:
1007: if ((*s_etat_processus).generateur_aleatoire != NULL)
1008: {
1009: liberation_generateur_aleatoire(s_etat_processus);
1010: }
1011:
1012: if ((*s_etat_processus).profilage == d_vrai)
1013: {
1014: ecriture_profil(s_etat_processus);
1015: liberation_profil(s_etat_processus);
1016: }
1017:
1018: retrait_thread(s_etat_processus);
1019: pthread_mutex_destroy(&((*s_etat_processus).mutex_pile_processus));
1020: pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
1021: pthread_mutex_destroy(&((*s_etat_processus).mutex_interruptions));
1022: pthread_mutex_destroy(&((*s_etat_processus).mutex_signaux));
1023:
1024: # ifndef SEMAPHORES_NOMMES
1025: sem_destroy(&((*s_etat_processus).semaphore_fork));
1026: # else
1027: sem_destroy3((*s_etat_processus).semaphore_fork, getpid(),
1028: pthread_self(), SEM_FORK);
1029: # endif
1030:
1031: liberation_contexte_cas(s_etat_processus);
1032: free((*s_etat_processus).localisation);
1033: liberation_allocateur(s_etat_processus);
1034: liberation_allocateur_buffer(s_etat_processus);
1035: pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation_buffer));
1036: sys_free(s_etat_processus);
1037:
1038: pthread_mutex_lock(&((*s_argument_thread).mutex));
1039: (*s_argument_thread).thread_actif = d_faux;
1040: pthread_mutex_unlock(&((*s_argument_thread).mutex));
1041:
1042: pthread_exit(NULL);
1043: return(NULL);
1044: }
1045:
1046: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>