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