1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.4
4: Copyright (C) 1989-2011 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 'DFT'
29: ================================================================================
30: Entrées : structure processus
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_dft(struct_processus *s_etat_processus)
40: {
41: integer4 erreur;
42: integer4 inverse;
43: integer4 nombre_colonnes;
44: integer4 nombre_lignes;
45:
46: logical1 presence_longueur_dft;
47:
48: long longueur_dft_signee;
49:
50: struct_complexe16 *matrice_f77;
51:
52: struct_objet *s_objet_argument;
53: struct_objet *s_objet_longueur_dft;
54: struct_objet *s_objet_resultat;
55:
56: unsigned long i;
57: unsigned long j;
58: unsigned long k;
59: unsigned long longueur_dft;
60:
61: (*s_etat_processus).erreur_execution = d_ex;
62:
63: if ((*s_etat_processus).affichage_arguments == 'Y')
64: {
65: printf("\n DFT ");
66:
67: if ((*s_etat_processus).langue == 'F')
68: {
69: printf("(transformée de Fourier discrète)\n\n");
70: }
71: else
72: {
73: printf("(discrete Fourier transform)\n\n");
74: }
75:
76: printf(" 1: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
77: printf("-> 1: %s\n\n", d_VCX);
78:
79: printf(" 2: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
80: printf(" 1: %s\n", d_INT);
81: printf("-> 1: %s\n\n", d_VCX);
82:
83: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
84: printf("-> 1: %s\n\n", d_VCX);
85:
86: printf(" 2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
87: printf(" 1: %s\n", d_INT);
88: printf("-> 1: %s\n", d_MCX);
89:
90: return;
91: }
92: else if ((*s_etat_processus).test_instruction == 'Y')
93: {
94: (*s_etat_processus).nombre_arguments = -1;
95: return;
96: }
97:
98: /*
99: * Il est possible d'imposer une longueur de DFT au premier niveau
100: * de la pile.
101: */
102:
103: if ((*s_etat_processus).l_base_pile == NULL)
104: {
105: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
106: return;
107: }
108:
109: if ((*(*(*s_etat_processus).l_base_pile).donnee).type == INT)
110: {
111: presence_longueur_dft = d_vrai;
112:
113: if (test_cfsf(s_etat_processus, 31) == d_vrai)
114: {
115: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
116: {
117: return;
118: }
119: }
120:
121: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
122: &s_objet_longueur_dft) == d_erreur)
123: {
124: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
125: return;
126: }
127:
128: longueur_dft_signee = (*((integer8 *) (*s_objet_longueur_dft).objet));
129:
130: liberation(s_etat_processus, s_objet_longueur_dft);
131:
132: if (longueur_dft_signee <= 0)
133: {
134: (*s_etat_processus).erreur_execution = d_ex_longueur_dft;
135: return;
136: }
137:
138: longueur_dft = longueur_dft_signee;
139: }
140: else
141: {
142: presence_longueur_dft = d_faux;
143: longueur_dft = 0;
144:
145: if (test_cfsf(s_etat_processus, 31) == d_vrai)
146: {
147: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
148: {
149: return;
150: }
151: }
152: }
153:
154: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
155: &s_objet_argument) == d_erreur)
156: {
157: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
158: return;
159: }
160:
161: /*
162: --------------------------------------------------------------------------------
163: Vecteur
164: --------------------------------------------------------------------------------
165: */
166:
167: if (((*s_objet_argument).type == VIN) ||
168: ((*s_objet_argument).type == VRL) ||
169: ((*s_objet_argument).type == VCX))
170: {
171: if (presence_longueur_dft == d_faux)
172: {
173: longueur_dft = (*((struct_vecteur *)
174: (*s_objet_argument).objet)).taille;
175: }
176:
177: if ((matrice_f77 = malloc(longueur_dft *
178: sizeof(struct_complexe16))) == NULL)
179: {
180: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
181: return;
182: }
183:
184: if ((*s_objet_argument).type == VIN)
185: {
186: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
187: .taille; i++)
188: {
189: matrice_f77[i].partie_reelle = (real8) ((integer8 *)
190: (*((struct_vecteur *) (*s_objet_argument).objet))
191: .tableau)[i];
192: matrice_f77[i].partie_imaginaire = (real8) 0;
193: }
194: }
195: else if ((*s_objet_argument).type == VRL)
196: {
197: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
198: .taille; i++)
199: {
200: matrice_f77[i].partie_reelle = ((real8 *)
201: (*((struct_vecteur *) (*s_objet_argument).objet))
202: .tableau)[i];
203: matrice_f77[i].partie_imaginaire = (real8) 0;
204: }
205: }
206: else
207: {
208: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
209: .taille; i++)
210: {
211: matrice_f77[i].partie_reelle = ((struct_complexe16 *)
212: (*((struct_vecteur *) (*s_objet_argument).objet))
213: .tableau)[i].partie_reelle;
214: matrice_f77[i].partie_imaginaire = ((struct_complexe16 *)
215: (*((struct_vecteur *) (*s_objet_argument).objet))
216: .tableau)[i].partie_imaginaire;
217: }
218: }
219:
220: for(; i < longueur_dft; i++)
221: {
222: matrice_f77[i].partie_reelle = (real8) 0;
223: matrice_f77[i].partie_imaginaire = (real8) 0;
224: }
225:
226: nombre_lignes = 1;
227: nombre_colonnes = longueur_dft;
228: inverse = 0;
229:
230: dft(matrice_f77, &nombre_lignes, &nombre_colonnes, &inverse, &erreur);
231:
232: if (erreur != 0)
233: {
234: liberation(s_etat_processus, s_objet_argument);
235: free(matrice_f77);
236:
237: (*s_etat_processus).erreur_execution = d_ex_longueur_dft;
238: return;
239: }
240:
241: if ((s_objet_resultat = allocation(s_etat_processus, VCX)) == NULL)
242: {
243: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
244: return;
245: }
246:
247: (*((struct_vecteur *) (*s_objet_resultat).objet)).taille = longueur_dft;
248: (*((struct_vecteur *) (*s_objet_resultat).objet)).tableau = matrice_f77;
249: }
250:
251: /*
252: --------------------------------------------------------------------------------
253: Matrice
254: --------------------------------------------------------------------------------
255: */
256:
257: else if (((*s_objet_argument).type == MIN) ||
258: ((*s_objet_argument).type == MRL) ||
259: ((*s_objet_argument).type == MCX))
260: {
261: if (presence_longueur_dft == d_faux)
262: {
263: longueur_dft = (*((struct_matrice *)
264: (*s_objet_argument).objet)).nombre_colonnes;
265: }
266:
267: if ((matrice_f77 = malloc(longueur_dft *
268: (*((struct_matrice *) (*s_objet_argument).objet))
269: .nombre_lignes * sizeof(struct_complexe16))) == NULL)
270: {
271: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
272: return;
273: }
274:
275: if ((*s_objet_argument).type == MIN)
276: {
277: for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_argument)
278: .objet)).nombre_lignes; j++)
279: {
280: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument)
281: .objet)).nombre_colonnes; i++)
282: {
283: matrice_f77[k].partie_reelle = (real8) ((integer8 **)
284: (*((struct_matrice *) (*s_objet_argument).objet))
285: .tableau)[j][i];
286: matrice_f77[k++].partie_imaginaire = (real8) 0;
287: }
288: }
289:
290: for(; k < longueur_dft * (*((struct_matrice *) (*s_objet_argument)
291: .objet)).nombre_lignes; k++)
292: {
293: matrice_f77[k].partie_reelle = (real8) 0;
294: matrice_f77[k].partie_imaginaire = (real8) 0;
295: }
296: }
297: else if ((*s_objet_argument).type == MRL)
298: {
299: for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_argument)
300: .objet)).nombre_lignes; j++)
301: {
302: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument)
303: .objet)).nombre_colonnes; i++)
304: {
305: matrice_f77[k].partie_reelle = ((real8 **)
306: (*((struct_matrice *) (*s_objet_argument).objet))
307: .tableau)[j][i];
308: matrice_f77[k++].partie_imaginaire = (real8) 0;
309: }
310: }
311:
312: for(; k < longueur_dft * (*((struct_matrice *) (*s_objet_argument)
313: .objet)).nombre_lignes; k++)
314: {
315: matrice_f77[k].partie_reelle = (real8) 0;
316: matrice_f77[k].partie_imaginaire = (real8) 0;
317: }
318: }
319: else
320: {
321: for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_argument)
322: .objet)).nombre_lignes; j++)
323: {
324: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument)
325: .objet)).nombre_colonnes; i++)
326: {
327: matrice_f77[k].partie_reelle = ((struct_complexe16 **)
328: (*((struct_matrice *) (*s_objet_argument).objet))
329: .tableau)[j][i].partie_reelle;
330: matrice_f77[k++].partie_imaginaire =
331: ((struct_complexe16 **) (*((struct_matrice *)
332: (*s_objet_argument).objet)).tableau)[j][i]
333: .partie_imaginaire;
334: }
335: }
336:
337: for(; k < longueur_dft * (*((struct_matrice *) (*s_objet_argument)
338: .objet)).nombre_lignes; k++)
339: {
340: matrice_f77[k].partie_reelle = (real8) 0;
341: matrice_f77[k].partie_imaginaire = (real8) 0;
342: }
343: }
344:
345: nombre_lignes = (*((struct_matrice *) (*s_objet_argument).objet))
346: .nombre_lignes;
347: nombre_colonnes = longueur_dft;
348: inverse = 0;
349:
350: dft(matrice_f77, &nombre_lignes, &nombre_colonnes, &inverse, &erreur);
351:
352: if (erreur != 0)
353: {
354: liberation(s_etat_processus, s_objet_argument);
355: free(matrice_f77);
356:
357: (*s_etat_processus).erreur_execution = d_ex_longueur_dft;
358: return;
359: }
360:
361: if ((s_objet_resultat = allocation(s_etat_processus, MCX)) == NULL)
362: {
363: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
364: return;
365: }
366:
367: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
368: (*((struct_matrice *) (*s_objet_argument).objet))
369: .nombre_lignes;
370: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
371: longueur_dft;
372:
373: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
374: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
375: .nombre_lignes * sizeof(struct_complexe16 *))) == NULL)
376: {
377: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
378: return;
379: }
380:
381: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
382: .nombre_lignes; i++)
383: {
384: if ((((struct_complexe16 **) (*((struct_matrice *)
385: (*s_objet_resultat).objet)).tableau)[i] =
386: malloc((*((struct_matrice *)
387: (*s_objet_resultat).objet)).nombre_colonnes *
388: sizeof(struct_complexe16))) == NULL)
389: {
390: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
391: return;
392: }
393: }
394:
395: for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
396: .nombre_lignes; j++)
397: {
398: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
399: .nombre_colonnes; i++)
400: {
401: ((struct_complexe16 **) (*((struct_matrice *)
402: (*s_objet_resultat).objet)).tableau)[j][i]
403: .partie_reelle = matrice_f77[k].partie_reelle;
404: ((struct_complexe16 **) (*((struct_matrice *)
405: (*s_objet_resultat).objet)).tableau)[j][i]
406: .partie_imaginaire = matrice_f77[k++].partie_imaginaire;
407: }
408: }
409:
410: free(matrice_f77);
411: }
412:
413: /*
414: --------------------------------------------------------------------------------
415: Calcul de DFT impossible
416: --------------------------------------------------------------------------------
417: */
418:
419: else
420: {
421: liberation(s_etat_processus, s_objet_argument);
422:
423: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
424: return;
425: }
426:
427: liberation(s_etat_processus, s_objet_argument);
428:
429: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
430: s_objet_resultat) == d_erreur)
431: {
432: return;
433: }
434:
435: return;
436: }
437:
438:
439: /*
440: ================================================================================
441: Fonction 'DER'
442: ================================================================================
443: Entrées : structure processus
444: --------------------------------------------------------------------------------
445: Sorties :
446: --------------------------------------------------------------------------------
447: Effets de bord : néant
448: ================================================================================
449: */
450:
451: void
452: instruction_der(struct_processus *s_etat_processus)
453: {
454: logical1 expression_rpn;
455: logical1 last_valide;
456:
457: struct_liste_chainee *l_element_courant;
458: struct_liste_chainee *l_element_precedent;
459:
460: struct_objet *s_copie_argument_2;
461: struct_objet *s_objet_argument_1;
462: struct_objet *s_objet_argument_2;
463: struct_objet *s_objet_resultat;
464: struct_objet *s_objet_simplifie;
465:
466: (*s_etat_processus).erreur_execution = d_ex;
467:
468: if ((*s_etat_processus).affichage_arguments == 'Y')
469: {
470: printf("\n DER ");
471:
472: if ((*s_etat_processus).langue == 'F')
473: {
474: printf("(dérivation)\n\n");
475: }
476: else
477: {
478: printf("(derivation)\n\n");
479: }
480:
481: printf(" 2: %s, %s, %s, %s\n", d_INT, d_REL, d_CPL, d_NOM);
482: printf(" 1: %s\n", d_NOM);
483: printf("-> 1: %s\n\n", d_INT);
484:
485: printf(" 2: %s, %s\n", d_RPN, d_ALG);
486: printf(" 1: %s\n", d_NOM);
487: printf("-> 1: %s, %s\n", d_RPN, d_ALG);
488:
489: return;
490: }
491: else if ((*s_etat_processus).test_instruction == 'Y')
492: {
493: (*s_etat_processus).nombre_arguments = 2;
494: return;
495: }
496:
497: if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
498: {
499: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
500: {
501: return;
502: }
503: }
504:
505: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
506: &s_objet_argument_1) == d_erreur)
507: {
508: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
509: return;
510: }
511:
512: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
513: &s_objet_argument_2) == d_erreur)
514: {
515: liberation(s_etat_processus, s_objet_argument_1);
516:
517: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
518: return;
519: }
520:
521: expression_rpn = d_faux;
522:
523: /*
524: * Dérivation d'une expression
525: */
526:
527: if (((*s_objet_argument_1).type == NOM) &&
528: (((*s_objet_argument_2).type == RPN) ||
529: ((*s_objet_argument_2).type == ALG)))
530: {
531: if ((s_copie_argument_2 = copie_objet(s_etat_processus,
532: s_objet_argument_2, 'N')) == NULL)
533: {
534: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
535: return;
536: }
537:
538: if ((*s_copie_argument_2).type == RPN)
539: {
540: expression_rpn = d_vrai;
541: }
542:
543: l_element_courant = (struct_liste_chainee *)
544: (*s_copie_argument_2).objet;
545: l_element_precedent = l_element_courant;
546:
547: while((*l_element_courant).suivant != NULL)
548: {
549: l_element_precedent = l_element_courant;
550: l_element_courant = (*l_element_courant).suivant;
551: }
552:
553: if (((*l_element_precedent).suivant =
554: allocation_maillon(s_etat_processus)) == NULL)
555: {
556: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
557: return;
558: }
559:
560: (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
561: l_element_precedent = (*l_element_precedent).suivant;
562:
563: if (((*l_element_precedent).suivant =
564: allocation_maillon(s_etat_processus)) == NULL)
565: {
566: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
567: return;
568: }
569:
570: if (((*(*l_element_precedent).suivant).donnee =
571: allocation(s_etat_processus, FCT)) == NULL)
572: {
573: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
574: return;
575: }
576:
577: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
578: .donnee).objet)).nombre_arguments = 2;
579: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
580: .donnee).objet)).fonction = instruction_der;
581:
582: if (((*((struct_fonction *) (*(*(*l_element_precedent)
583: .suivant).donnee).objet)).nom_fonction =
584: malloc(4 * sizeof(unsigned char))) == NULL)
585: {
586: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
587: return;
588: }
589:
590: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
591: .suivant).donnee).objet)).nom_fonction, "DER");
592:
593: (*(*l_element_precedent).suivant).suivant = l_element_courant;
594:
595: s_objet_resultat = s_copie_argument_2;
596: s_objet_argument_1 = NULL;
597: }
598:
599: /*
600: * Dérivation d'un nom ou d'une constante
601: */
602:
603: else if (((*s_objet_argument_1).type == NOM) &&
604: (((*s_objet_argument_2).type == NOM) ||
605: ((*s_objet_argument_2).type == INT) ||
606: ((*s_objet_argument_2).type == REL) ||
607: ((*s_objet_argument_2).type == CPL)))
608: {
609: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
610: {
611: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
612: return;
613: }
614:
615: if (((*s_objet_resultat).objet =
616: allocation_maillon(s_etat_processus)) == NULL)
617: {
618: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
619: return;
620: }
621:
622: l_element_courant = (*s_objet_resultat).objet;
623:
624: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
625: == NULL)
626: {
627: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
628: return;
629: }
630:
631: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
632: .nombre_arguments = 0;
633: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
634: .fonction = instruction_vers_niveau_superieur;
635:
636: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
637: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
638: {
639: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
640: return;
641: }
642:
643: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
644: .nom_fonction, "<<");
645:
646: if (((*l_element_courant).suivant =
647: allocation_maillon(s_etat_processus)) == NULL)
648: {
649: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
650: return;
651: }
652:
653: l_element_courant = (*l_element_courant).suivant;
654: (*l_element_courant).donnee = s_objet_argument_2;
655:
656: if (((*l_element_courant).suivant =
657: allocation_maillon(s_etat_processus)) == NULL)
658: {
659: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
660: return;
661: }
662:
663: l_element_courant = (*l_element_courant).suivant;
664: (*l_element_courant).donnee = s_objet_argument_1;
665:
666: if (((*l_element_courant).suivant =
667: allocation_maillon(s_etat_processus)) == NULL)
668: {
669: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
670: return;
671: }
672:
673: l_element_courant = (*l_element_courant).suivant;
674:
675: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
676: == NULL)
677: {
678: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
679: return;
680: }
681:
682: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
683: .nombre_arguments = 2;
684: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
685: .fonction = instruction_der;
686:
687: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
688: .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
689: {
690: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
691: return;
692: }
693:
694: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
695: .nom_fonction, "DER");
696:
697: if (((*l_element_courant).suivant =
698: allocation_maillon(s_etat_processus)) == NULL)
699: {
700: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
701: return;
702: }
703:
704: l_element_courant = (*l_element_courant).suivant;
705:
706: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
707: == NULL)
708: {
709: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
710: return;
711: }
712:
713: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
714: .nombre_arguments = 0;
715: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
716: .fonction = instruction_vers_niveau_inferieur;
717:
718: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
719: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
720: {
721: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
722: return;
723: }
724:
725: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
726: .nom_fonction, ">>");
727:
728: (*l_element_courant).suivant = NULL;
729:
730: s_objet_argument_1 = NULL;
731: s_objet_argument_2 = NULL;
732: }
733:
734: /*
735: * Dérivation impossible
736: */
737:
738: else
739: {
740: liberation(s_etat_processus, s_objet_argument_1);
741: liberation(s_etat_processus, s_objet_argument_2);
742:
743: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
744: return;
745: }
746:
747: liberation(s_etat_processus, s_objet_argument_1);
748: liberation(s_etat_processus, s_objet_argument_2);
749:
750: if (expression_rpn == d_faux)
751: {
752: if (last_valide == d_vrai)
753: {
754: cf(s_etat_processus, 31);
755: }
756:
757: derivation(s_etat_processus, &s_objet_resultat);
758:
759: if (last_valide == d_vrai)
760: {
761: sf(s_etat_processus, 31);
762: }
763:
764: if (((*s_etat_processus).var_volatile_requete_arret == 0) &&
765: (s_objet_resultat != NULL))
766: {
767: if ((s_objet_simplifie = simplification(s_etat_processus,
768: s_objet_resultat)) == NULL)
769: {
770: return;
771: }
772:
773: liberation(s_etat_processus, s_objet_resultat);
774:
775: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
776: s_objet_simplifie) == d_erreur)
777: {
778: return;
779: }
780: }
781: else
782: {
783: if (s_objet_resultat != NULL)
784: {
785: liberation(s_etat_processus, s_objet_resultat);
786: }
787: }
788: }
789: else
790: {
791: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
792: s_objet_resultat) == d_erreur)
793: {
794: return;
795: }
796: }
797:
798: return;
799: }
800:
801:
802: /*
803: ================================================================================
804: Fonction 'DETACH'
805: ================================================================================
806: Entrées : structure processus
807: --------------------------------------------------------------------------------
808: Sorties :
809: --------------------------------------------------------------------------------
810: Effets de bord : néant
811: ================================================================================
812: */
813:
814: void
815: instruction_detach(struct_processus *s_etat_processus)
816: {
817: int pipe_initialisation_segment_signaux[2];
818:
819: logical1 drapeau;
820:
821: pid_t ppid;
822: pid_t pid_final;
823:
824: pthread_attr_t attributs;
825:
826: pthread_mutexattr_t attributs_mutex;
827:
828: pthread_t thread_surveillance;
829:
830: sig_atomic_t registre_stop;
831:
832: ssize_t longueur_ecriture;
833:
834: struct_descripteur_thread *s_argument_thread;
835: struct_descripteur_thread *s_argument_thread2;
836:
837: struct_liste_chainee *l_element_courant;
838: struct_liste_chainee *l_element_precedent;
839: struct_liste_chainee *l_element_suivant;
840:
841: struct_objet *s_objet;
842: struct_objet *s_objet_systeme;
843: struct_objet *s_objet_temporaire;
844:
845: struct sigaction action;
846: struct sigaction registre;
847:
848: struct timespec attente;
849:
850: unsigned char caractere;
851: unsigned char *message;
852:
853: unsigned int erreur;
854:
855: unsigned long i;
856:
857: volatile logical1 variable_partagee;
858:
859: volatile struct_objet *s_copie;
860:
861: (*s_etat_processus).erreur_execution = d_ex;
862:
863: attente.tv_sec = 0;
864: attente.tv_nsec = GRANULARITE_us * 1000;
865: s_copie = NULL;
866:
867: if ((*s_etat_processus).affichage_arguments == 'Y')
868: {
869: printf("\n DETACH ");
870:
871: if ((*s_etat_processus).langue == 'F')
872: {
873: printf("(détachement d'un processus)\n\n");
874: }
875: else
876: {
877: printf("(fork)\n\n");
878: }
879:
880: printf(" 1: %s, %s\n", d_NOM, d_RPN);
881: printf("-> 1: %s\n", d_PRC);
882:
883: return;
884: }
885: else if ((*s_etat_processus).test_instruction == 'Y')
886: {
887: (*s_etat_processus).nombre_arguments = -1;
888: return;
889: }
890:
891: if (test_cfsf(s_etat_processus, 31) == d_vrai)
892: {
893: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
894: {
895: return;
896: }
897: }
898:
899: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
900: &s_objet) == d_erreur)
901: {
902: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
903: return;
904: }
905:
906: /*
907: * Une routine fille doit pouvoir renvoyer des objets au processus
908: * père au travers de la fonction SEND. Il ne peut donc s'agir que
909: * d'une fonction ou d'une expression RPN.
910: */
911:
912: if (((*s_objet).type != NOM) && ((*s_objet).type != RPN))
913: {
914: liberation(s_etat_processus, s_objet);
915:
916: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
917: return;
918: }
919:
920: /*
921: * Si l'argument est de type NOM, il faut que la variable correspondante
922: * soit une variable de type RPN.
923: */
924:
925: variable_partagee = d_faux;
926:
927: if ((*s_objet).type == NOM)
928: {
929: if (recherche_variable(s_etat_processus, (*((struct_nom *)
930: (*s_objet).objet)).nom) == d_vrai)
931: {
932: if ((*(*s_etat_processus).pointeur_variable_courante).objet
933: == NULL)
934: {
935: if (pthread_mutex_lock(&((*(*s_etat_processus)
936: .s_liste_variables_partagees).mutex)) != 0)
937: {
938: (*s_etat_processus).erreur_systeme = d_es_processus;
939: return;
940: }
941:
942: if (recherche_variable_partagee(s_etat_processus,
943: (*(*s_etat_processus).pointeur_variable_courante).nom,
944: (*(*s_etat_processus).pointeur_variable_courante)
945: .variable_partagee, (*(*s_etat_processus)
946: .pointeur_variable_courante).origine) == d_faux)
947: {
948: if (pthread_mutex_unlock(&((*(*s_etat_processus)
949: .s_liste_variables_partagees).mutex)) != 0)
950: {
951: (*s_etat_processus).erreur_systeme = d_es_processus;
952: return;
953: }
954:
955: liberation(s_etat_processus, s_objet);
956:
957: (*s_etat_processus).erreur_systeme = d_es;
958: (*s_etat_processus).erreur_execution =
959: d_ex_argument_invalide;
960: return;
961: }
962:
963: if (((*(*(*s_etat_processus).s_liste_variables_partagees)
964: .table[(*(*s_etat_processus)
965: .s_liste_variables_partagees).position_variable].objet)
966: .type != RPN) && ((*(*(*s_etat_processus)
967: .s_liste_variables_partagees).table
968: [(*(*s_etat_processus).s_liste_variables_partagees)
969: .position_variable].objet).type != ADR))
970: {
971: if (pthread_mutex_unlock(&((*(*s_etat_processus)
972: .s_liste_variables_partagees).mutex)) != 0)
973: {
974: (*s_etat_processus).erreur_systeme = d_es_processus;
975: return;
976: }
977:
978: liberation(s_etat_processus, s_objet);
979:
980: (*s_etat_processus).erreur_execution =
981: d_ex_argument_invalide;
982: return;
983: }
984:
985: if ((s_copie = copie_objet(s_etat_processus,
986: (*(*s_etat_processus).s_liste_variables_partagees).table
987: [(*(*s_etat_processus).s_liste_variables_partagees)
988: .position_variable].objet, 'P')) == NULL)
989: {
990: if (pthread_mutex_unlock(&((*(*s_etat_processus)
991: .s_liste_variables_partagees).mutex)) != 0)
992: {
993: (*s_etat_processus).erreur_systeme = d_es_processus;
994: return;
995: }
996:
997: (*s_etat_processus).erreur_systeme =
998: d_es_allocation_memoire;
999:
1000: return;
1001: }
1002:
1003: variable_partagee = d_vrai;
1004:
1005: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1006: .s_liste_variables_partagees).mutex)) != 0)
1007: {
1008: (*s_etat_processus).erreur_systeme = d_es_processus;
1009: return;
1010: }
1011: }
1012: else
1013: {
1014: if (((*(*(*s_etat_processus).pointeur_variable_courante).objet)
1015: .type != RPN) && ((*(*(*s_etat_processus)
1016: .pointeur_variable_courante).objet).type != ADR))
1017: {
1018: liberation(s_etat_processus, s_objet);
1019:
1020: (*s_etat_processus).erreur_execution =
1021: d_ex_argument_invalide;
1022: return;
1023: }
1024: }
1025: }
1026: else // Variable inexistante
1027: {
1028: liberation(s_etat_processus, s_objet);
1029:
1030: (*s_etat_processus).erreur_systeme = d_es;
1031: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
1032: return;
1033: }
1034: }
1035:
1036: if ((s_argument_thread = malloc(sizeof(struct_descripteur_thread))) == NULL)
1037: {
1038: (*s_etat_processus).erreur_systeme = d_es_processus;
1039: return;
1040: }
1041:
1042: if (pipe((*s_argument_thread).pipe_erreurs) != 0)
1043: {
1044: (*s_etat_processus).erreur_systeme = d_es_processus;
1045: return;
1046: }
1047:
1048: if (pipe((*s_argument_thread).pipe_interruptions) != 0)
1049: {
1050: (*s_etat_processus).erreur_systeme = d_es_processus;
1051: return;
1052: }
1053:
1054: if (pipe((*s_argument_thread).pipe_nombre_interruptions_attente) != 0)
1055: {
1056: (*s_etat_processus).erreur_systeme = d_es_processus;
1057: return;
1058: }
1059:
1060: if (pipe((*s_argument_thread).pipe_objets) != 0)
1061: {
1062: (*s_etat_processus).erreur_systeme = d_es_processus;
1063: return;
1064: }
1065:
1066: if (pipe((*s_argument_thread).pipe_acquittement) != 0)
1067: {
1068: (*s_etat_processus).erreur_systeme = d_es_processus;
1069: return;
1070: }
1071:
1072: if (pipe((*s_argument_thread).pipe_nombre_objets_attente) != 0)
1073: {
1074: (*s_etat_processus).erreur_systeme = d_es_processus;
1075: return;
1076: }
1077:
1078: if (pipe((*s_argument_thread).pipe_injections) != 0)
1079: {
1080: (*s_etat_processus).erreur_systeme = d_es_processus;
1081: return;
1082: }
1083:
1084: if (pipe((*s_argument_thread).pipe_nombre_injections) != 0)
1085: {
1086: (*s_etat_processus).erreur_systeme = d_es_processus;
1087: return;
1088: }
1089:
1090: if (pipe(pipe_initialisation_segment_signaux) != 0)
1091: {
1092: (*s_etat_processus).erreur_systeme = d_es_processus;
1093: return;
1094: }
1095:
1096: ppid = getpid();
1097:
1098: /*
1099: * Le mutex suivant permet de copier un contexte propre.
1100: */
1101:
1102: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
1103: {
1104: (*s_etat_processus).erreur_systeme = d_es_processus;
1105: return;
1106: }
1107:
1108: fflush(NULL);
1109:
1110: /*
1111: * On bloque tous les threads concurents pour qu'il n'y ait ni allocation
1112: * de mémoire, ni libération, ni copie d'objet concurrent au fork().
1113: */
1114:
1115: verrouillage_threads_concurrents(s_etat_processus);
1116: (*s_argument_thread).pid = fork();
1117: deverrouillage_threads_concurrents(s_etat_processus);
1118:
1119: (*s_argument_thread).thread_pere = pthread_self();
1120: (*s_argument_thread).processus_detache = d_vrai;
1121:
1122: pthread_mutexattr_init(&attributs_mutex);
1123: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
1124: pthread_mutex_init(&((*s_argument_thread).mutex), &attributs_mutex);
1125: pthread_mutexattr_destroy(&attributs_mutex);
1126:
1127: pthread_mutexattr_init(&attributs_mutex);
1128: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
1129: pthread_mutex_init(&((*s_argument_thread).mutex_nombre_references),
1130: &attributs_mutex);
1131: pthread_mutexattr_destroy(&attributs_mutex);
1132:
1133: if ((*s_argument_thread).pid > 0)
1134: {
1135: /*
1136: * Processus père
1137: */
1138:
1139: if (variable_partagee == d_vrai)
1140: {
1141: liberation(s_etat_processus, s_copie);
1142: }
1143:
1144: liberation(s_etat_processus, s_objet);
1145:
1146: if ((s_objet = allocation(s_etat_processus, PRC)) == NULL)
1147: {
1148: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1149: return;
1150: }
1151:
1152: (*((struct_processus_fils *) (*s_objet).objet)).thread =
1153: s_argument_thread;
1154: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1155: .nombre_objets_dans_pipe = 0;
1156: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1157: .nombre_interruptions_dans_pipe = 0;
1158: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1159: .nombre_references = 1;
1160:
1161: /*
1162: * On copie l'objet plutôt que le pointeur car cet objet peut être
1163: * accédé depuis deux threads distincts et aboutir à un blocage lors
1164: * d'une copie.
1165: */
1166:
1167: if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet, 'O'))
1168: == NULL)
1169: {
1170: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1171: return;
1172: }
1173:
1174: if (close((*s_argument_thread).pipe_erreurs[1]) != 0)
1175: {
1176: (*s_etat_processus).erreur_systeme = d_es_processus;
1177: return;
1178: }
1179:
1180: if (close((*s_argument_thread).pipe_interruptions[1]) != 0)
1181: {
1182: (*s_etat_processus).erreur_systeme = d_es_processus;
1183: return;
1184: }
1185:
1186: if (close((*s_argument_thread).pipe_nombre_interruptions_attente[1])
1187: != 0)
1188: {
1189: (*s_etat_processus).erreur_systeme = d_es_processus;
1190: return;
1191: }
1192:
1193: if (close((*s_argument_thread).pipe_objets[1]) != 0)
1194: {
1195: (*s_etat_processus).erreur_systeme = d_es_processus;
1196: return;
1197: }
1198:
1199: if (close((*s_argument_thread).pipe_nombre_objets_attente[1]) != 0)
1200: {
1201: (*s_etat_processus).erreur_systeme = d_es_processus;
1202: return;
1203: }
1204:
1205: if (close((*s_argument_thread).pipe_injections[0]) != 0)
1206: {
1207: (*s_etat_processus).erreur_systeme = d_es_processus;
1208: return;
1209: }
1210:
1211: if (close((*s_argument_thread).pipe_nombre_injections[0]) != 0)
1212: {
1213: (*s_etat_processus).erreur_systeme = d_es_processus;
1214: return;
1215: }
1216:
1217: if (close((*s_argument_thread).pipe_acquittement[0]) != 0)
1218: {
1219: (*s_etat_processus).erreur_systeme = d_es_processus;
1220: return;
1221: }
1222:
1223: if (pthread_attr_init(&attributs) != 0)
1224: {
1225: (*s_etat_processus).erreur_systeme = d_es_processus;
1226: return;
1227: }
1228:
1229: if (pthread_attr_setdetachstate(&attributs,
1230: PTHREAD_CREATE_DETACHED) != 0)
1231: {
1232: (*s_etat_processus).erreur_systeme = d_es_processus;
1233: return;
1234: }
1235:
1236: # ifdef SCHED_OTHER
1237: if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
1238: {
1239: (*s_etat_processus).erreur_systeme = d_es_processus;
1240: return;
1241: }
1242: # endif
1243:
1244: # ifdef PTHREAD_EXPLICIT_SCHED
1245: if (pthread_attr_setinheritsched(&attributs,
1246: PTHREAD_EXPLICIT_SCHED) != 0)
1247: {
1248: (*s_etat_processus).erreur_systeme = d_es_processus;
1249: return;
1250: }
1251: # endif
1252:
1253: # ifdef PTHREAD_SCOPE_SYSTEM
1254: if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
1255: {
1256: (*s_etat_processus).erreur_systeme = d_es_processus;
1257: return;
1258: }
1259: # endif
1260:
1261: (*s_argument_thread).s_etat_processus = s_etat_processus;
1262:
1263: if (pthread_create(&thread_surveillance, &attributs,
1264: surveillance_processus, s_argument_thread) != 0)
1265: {
1266: (*s_etat_processus).erreur_systeme = d_es_processus;
1267: return;
1268: }
1269:
1270: if (pthread_attr_destroy(&attributs) != 0)
1271: {
1272: (*s_etat_processus).erreur_systeme = d_es_processus;
1273: return;
1274: }
1275: }
1276: else if ((*s_argument_thread).pid == 0)
1277: {
1278: /*
1279: * Processus fils
1280: */
1281:
1282: liberation_queue_signaux(s_etat_processus);
1283: creation_queue_signaux(s_etat_processus);
1284: routine_recursive = 0;
1285:
1286: (*s_etat_processus).pointeur_signal_lecture = 0;
1287: (*s_etat_processus).pointeur_signal_ecriture = 0;
1288:
1289: if (write_atomic(s_etat_processus,
1290: pipe_initialisation_segment_signaux[1],
1291: "-", sizeof(unsigned char)) != sizeof(unsigned char))
1292: {
1293: (*s_etat_processus).erreur_systeme = d_es_processus;
1294: }
1295:
1296: close(pipe_initialisation_segment_signaux[0]);
1297: close(pipe_initialisation_segment_signaux[1]);
1298:
1299: if ((*s_etat_processus).debug == d_vrai)
1300: if (((*s_etat_processus).type_debug &
1301: d_debug_processus) != 0)
1302: {
1303: if ((*s_etat_processus).langue == 'F')
1304: {
1305: printf("[%d] Lancement du processus fils %d de %d\n",
1306: (int) getpid(), (int) getpid(), (int) ppid);
1307: }
1308: else
1309: {
1310: printf("[%d] Start child process %d from %d\n", (int) getpid(),
1311: (int) getpid(), (int) ppid);
1312: }
1313:
1314: fflush(stdout);
1315: }
1316:
1317: if (close((*s_argument_thread).pipe_erreurs[0]) != 0)
1318: {
1319: (*s_etat_processus).erreur_systeme = d_es_processus;
1320: }
1321: else if (close((*s_argument_thread).pipe_interruptions[0]) != 0)
1322: {
1323: (*s_etat_processus).erreur_systeme = d_es_processus;
1324: }
1325: else if (close((*s_argument_thread)
1326: .pipe_nombre_interruptions_attente[0]) != 0)
1327: {
1328: (*s_etat_processus).erreur_systeme = d_es_processus;
1329: }
1330: else if (close((*s_argument_thread).pipe_objets[0]) != 0)
1331: {
1332: (*s_etat_processus).erreur_systeme = d_es_processus;
1333: }
1334: else if (close((*s_argument_thread).pipe_nombre_objets_attente[0]) != 0)
1335: {
1336: (*s_etat_processus).erreur_systeme = d_es_processus;
1337: }
1338: else if (close((*s_argument_thread).pipe_injections[1]) != 0)
1339: {
1340: (*s_etat_processus).erreur_systeme = d_es_processus;
1341: }
1342: else if (close((*s_argument_thread).pipe_nombre_injections[1]) != 0)
1343: {
1344: (*s_etat_processus).erreur_systeme = d_es_processus;
1345: }
1346: else if (close((*s_argument_thread).pipe_acquittement[1]) != 0)
1347: {
1348: (*s_etat_processus).erreur_systeme = d_es_processus;
1349: }
1350:
1351: if ((*s_etat_processus).debug == d_vrai)
1352: if (((*s_etat_processus).type_debug &
1353: d_debug_processus) != 0)
1354: {
1355: if ((*s_etat_processus).langue == 'F')
1356: {
1357: printf("[%d] Libération des objets du processus père\n",
1358: (int) getpid());
1359: }
1360: else
1361: {
1362: printf("[%d] Freeing parent process memory\n", getpid());
1363: }
1364:
1365: fflush(stdout);
1366: }
1367:
1368: l_element_courant = (*s_etat_processus).liste_mutexes;
1369: while(l_element_courant != NULL)
1370: {
1371: pthread_mutex_trylock(&((*((struct_mutex *) (*(*l_element_courant)
1372: .donnee).objet)).mutex));
1373: pthread_mutex_unlock(&((*((struct_mutex *) (*(*l_element_courant)
1374: .donnee).objet)).mutex));
1375: pthread_mutex_destroy(&((*((struct_mutex *) (*(*l_element_courant)
1376: .donnee).objet)).mutex));
1377:
1378: liberation(s_etat_processus, (*l_element_courant).donnee);
1379: l_element_suivant = (*l_element_courant).suivant;
1380: free(l_element_courant);
1381: l_element_courant = l_element_suivant;
1382: }
1383:
1384: (*s_etat_processus).liste_mutexes = NULL;
1385:
1386: liberation_threads(s_etat_processus);
1387:
1388: (*(*s_etat_processus).s_liste_variables_partagees)
1389: .table = NULL;
1390: (*(*s_etat_processus).s_liste_variables_partagees)
1391: .nombre_variables = 0;
1392: (*(*s_etat_processus).s_liste_variables_partagees)
1393: .nombre_variables_allouees = 0;
1394:
1395: insertion_thread(s_etat_processus, d_vrai);
1396:
1397: // Envoi d'une donnée pour signaler le démarrage du processus au thread
1398: // de surveillance.
1399:
1400: if (write_atomic(s_etat_processus,
1401: (*s_argument_thread).pipe_nombre_objets_attente[1],
1402: "-", sizeof(unsigned char)) != sizeof(unsigned char))
1403: {
1404: pthread_mutex_unlock(&((*s_etat_processus).mutex));
1405: (*s_etat_processus).erreur_systeme = d_es_processus;
1406:
1407: pid_final = -2;
1408:
1409: while((longueur_ecriture = write_atomic(s_etat_processus,
1410: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
1411: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1412: {
1413: if (longueur_ecriture == -1)
1414: {
1415: break;
1416: }
1417: }
1418:
1419: while((longueur_ecriture = write_atomic(s_etat_processus,
1420: (*s_argument_thread).pipe_nombre_objets_attente[1],
1421: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1422: {
1423: if (longueur_ecriture == -1)
1424: {
1425: break;
1426: }
1427: }
1428:
1429: destruction_queue_signaux(s_etat_processus);
1430: BUG(1, uprintf("Process management error line %d\n", __LINE__));
1431: exit(EXIT_FAILURE);
1432: }
1433:
1434: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
1435: {
1436: (*s_etat_processus).erreur_systeme = d_es_processus;
1437:
1438: pid_final = -2;
1439:
1440: while((longueur_ecriture = write_atomic(s_etat_processus,
1441: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
1442: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1443: {
1444: if (longueur_ecriture == -1)
1445: {
1446: break;
1447: }
1448: }
1449:
1450: while((longueur_ecriture = write_atomic(s_etat_processus,
1451: (*s_argument_thread).pipe_nombre_objets_attente[1],
1452: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1453: {
1454: if (longueur_ecriture == -1)
1455: {
1456: break;
1457: }
1458: }
1459:
1460: destruction_queue_signaux(s_etat_processus);
1461: BUG(1, uprintf("Process management error line %d\n", __LINE__));
1462: exit(EXIT_FAILURE);
1463: }
1464:
1465: pthread_mutex_trylock(&((*s_etat_processus).protection_liste_mutexes));
1466:
1467: if (pthread_mutex_unlock(&((*s_etat_processus)
1468: .protection_liste_mutexes)) != 0)
1469: {
1470: (*s_etat_processus).erreur_systeme = d_es_processus;
1471:
1472: pid_final = -2;
1473:
1474: while((longueur_ecriture = write_atomic(s_etat_processus,
1475: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
1476: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1477: {
1478: if (longueur_ecriture == -1)
1479: {
1480: break;
1481: }
1482: }
1483:
1484: while((longueur_ecriture = write_atomic(s_etat_processus,
1485: (*s_argument_thread).pipe_nombre_objets_attente[1],
1486: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1487: {
1488: if (longueur_ecriture == -1)
1489: {
1490: break;
1491: }
1492: }
1493:
1494: destruction_queue_signaux(s_etat_processus);
1495: BUG(1, uprintf("Process management error line %d\n", __LINE__));
1496: exit(EXIT_FAILURE);
1497: }
1498:
1499: if ((*s_etat_processus).evaluation_expression_compilee == 'N')
1500: {
1501: free((*s_etat_processus).instruction_courante);
1502: (*s_etat_processus).instruction_courante = NULL;
1503: }
1504:
1505: (*s_etat_processus).var_volatile_processus_pere = 0;
1506: (*s_etat_processus).var_volatile_processus_racine = 0;
1507:
1508: // On réinitialise toutes les interruptions.
1509:
1510: (*s_etat_processus).traitement_interruption = 'N';
1511: (*s_etat_processus).traitement_interruptible = 'Y';
1512: (*s_etat_processus).nombre_interruptions_en_queue = 0;
1513: (*s_etat_processus).nombre_interruptions_non_affectees = 0;
1514: (*s_etat_processus).processus_detache = d_vrai;
1515:
1516: liberation(s_etat_processus, (*s_etat_processus).at_exit);
1517: (*s_etat_processus).at_exit = NULL;
1518: liberation(s_etat_processus, (*s_etat_processus).at_poke);
1519: (*s_etat_processus).at_poke = NULL;
1520: (*s_etat_processus).traitement_at_poke = 'N';
1521:
1522: for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
1523: {
1524: liberation(s_etat_processus,
1525: (*s_etat_processus).corps_interruptions[i]);
1526:
1527: (*s_etat_processus).corps_interruptions[i] = NULL;
1528: (*s_etat_processus).masque_interruptions[i] = 'N';
1529: (*s_etat_processus).queue_interruptions[i] = 0;
1530:
1531: l_element_courant = (*s_etat_processus)
1532: .pile_origine_interruptions[i];
1533:
1534: while(l_element_courant != NULL)
1535: {
1536: l_element_suivant = (*l_element_courant).suivant;
1537: liberation(s_etat_processus, (*l_element_courant).donnee);
1538: free(l_element_courant);
1539: l_element_courant = l_element_suivant;
1540: }
1541:
1542: (*s_etat_processus).pile_origine_interruptions[i] = NULL;
1543: }
1544:
1545: /*
1546: * On bloque l'exécution du processus fils jusqu'à ce que
1547: * le père ait renseigné correctement la pile des processus.
1548: * Dans le cas contraire, on pourrait essayer de traiter
1549: * un RECV sur un système chargé avant que cette pile soit
1550: * renseignée.
1551: */
1552:
1553: // Attente de la réception du signal rpl_sigstart.
1554:
1555: for((*s_etat_processus).demarrage_fils = d_faux;;)
1556: {
1557: scrutation_interruptions(s_etat_processus);
1558:
1559: if ((*s_etat_processus).demarrage_fils == d_vrai)
1560: {
1561: break;
1562: }
1563:
1564: nanosleep(&attente, NULL);
1565: }
1566:
1567: (*s_etat_processus).niveau_initial = (*s_etat_processus).niveau_courant;
1568: (*s_etat_processus).presence_pipes = d_vrai;
1569: (*s_etat_processus).debug_programme = d_faux;
1570: (*s_etat_processus).pipe_donnees = (*s_argument_thread).pipe_objets[1];
1571: (*s_etat_processus).pipe_nombre_objets_attente = (*s_argument_thread)
1572: .pipe_nombre_objets_attente[1];
1573: (*s_etat_processus).pipe_interruptions = (*s_argument_thread)
1574: .pipe_interruptions[1];
1575: (*s_etat_processus).pipe_nombre_interruptions_attente =
1576: (*s_argument_thread).pipe_nombre_interruptions_attente[1];
1577: (*s_etat_processus).pipe_injections =
1578: (*s_argument_thread).pipe_injections[0];
1579: (*s_etat_processus).pipe_nombre_injections =
1580: (*s_argument_thread).pipe_nombre_injections[0];
1581: (*s_etat_processus).pipe_acquittement =
1582: (*s_argument_thread).pipe_acquittement[0];
1583: (*s_etat_processus).nombre_objets_injectes = 0;
1584: (*s_etat_processus).nombre_objets_envoyes_non_lus = 0;
1585: (*s_etat_processus).temps_maximal_cpu = 0;
1586: (*s_etat_processus).presence_fusible = d_faux;
1587: (*s_etat_processus).thread_fusible = 0;
1588: (*s_etat_processus).pid_erreur_processus_fils = getpid();
1589:
1590: if ((*s_etat_processus).profilage == d_vrai)
1591: {
1592: liberation_profil(s_etat_processus);
1593: }
1594:
1595: (*s_etat_processus).pile_profilage = NULL;
1596:
1597: if ((*s_etat_processus).generateur_aleatoire != NULL)
1598: {
1599: liberation_generateur_aleatoire(s_etat_processus);
1600: }
1601:
1602: (*s_etat_processus).generateur_aleatoire = NULL;
1603:
1604: if ((*s_etat_processus).instruction_derniere_erreur != NULL)
1605: {
1606: free((*s_etat_processus).instruction_derniere_erreur);
1607: (*s_etat_processus).instruction_derniere_erreur = NULL;
1608: }
1609:
1610: /*
1611: * Initialisation de la pile des processus. Cette pile est effacée
1612: * par liberation_threads().
1613: */
1614:
1615: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
1616: {
1617: (*s_etat_processus).erreur_systeme = d_es;
1618:
1619: pid_final = -2;
1620:
1621: while((longueur_ecriture = write_atomic(s_etat_processus,
1622: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
1623: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1624: {
1625: if (longueur_ecriture == -1)
1626: {
1627: break;
1628: }
1629: }
1630:
1631: while((longueur_ecriture = write_atomic(s_etat_processus,
1632: (*s_argument_thread).pipe_nombre_objets_attente[1],
1633: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1634: {
1635: if (longueur_ecriture == -1)
1636: {
1637: break;
1638: }
1639: }
1640:
1641: destruction_queue_signaux(s_etat_processus);
1642: BUG(1, uprintf("Process management error line %d\n", __LINE__));
1643: exit(EXIT_FAILURE);
1644: }
1645:
1646: l_element_courant = (struct_liste_chainee *)
1647: (*s_etat_processus).l_base_pile_processus;
1648:
1649: while(l_element_courant != NULL)
1650: {
1651: s_argument_thread2 = (struct_descripteur_thread *)
1652: (*((struct_processus_fils *) (*(*l_element_courant).donnee)
1653: .objet)).thread;
1654:
1655: (*s_argument_thread2).nombre_references--;
1656:
1657: BUG((*s_argument_thread2).nombre_references < 0,
1658: destruction_queue_signaux(s_etat_processus),
1659: printf("(*s_argument_thread2).nombre_references = %d\n",
1660: (int) (*s_argument_thread2).nombre_references));
1661:
1662: if ((*s_argument_thread2).nombre_references == 0)
1663: {
1664: close((*s_argument_thread2).pipe_objets[0]);
1665: close((*s_argument_thread2).pipe_acquittement[1]);
1666: close((*s_argument_thread2).pipe_injections[1]);
1667: close((*s_argument_thread2).pipe_nombre_injections[1]);
1668: close((*s_argument_thread2).pipe_nombre_objets_attente[0]);
1669: close((*s_argument_thread2).pipe_interruptions[0]);
1670: close((*s_argument_thread2)
1671: .pipe_nombre_interruptions_attente[0]);
1672:
1673: pthread_mutex_destroy(&((*s_argument_thread2).mutex));
1674:
1675: if ((*s_argument_thread2).processus_detache == d_faux)
1676: {
1677: if ((*s_argument_thread2).destruction_objet == d_vrai)
1678: {
1679: liberation(s_etat_processus,
1680: (*s_argument_thread2).argument);
1681: }
1682: }
1683:
1684: free(s_argument_thread2);
1685: free((*(*l_element_courant).donnee).objet);
1686: free((*l_element_courant).donnee);
1687: }
1688:
1689: l_element_suivant = (*l_element_courant).suivant;
1690: free((struct_liste_chainee *) l_element_courant);
1691: l_element_courant = l_element_suivant;
1692: }
1693:
1694: (*s_etat_processus).l_base_pile_processus = NULL;
1695:
1696: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
1697: {
1698: (*s_etat_processus).erreur_systeme = d_es;
1699:
1700: pid_final = -2;
1701:
1702: while((longueur_ecriture = write_atomic(s_etat_processus,
1703: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
1704: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1705: {
1706: if (longueur_ecriture == -1)
1707: {
1708: break;
1709: }
1710: }
1711:
1712: while((longueur_ecriture = write_atomic(s_etat_processus,
1713: (*s_argument_thread).pipe_nombre_objets_attente[1],
1714: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1715: {
1716: if (longueur_ecriture == -1)
1717: {
1718: break;
1719: }
1720: }
1721:
1722: destruction_queue_signaux(s_etat_processus);
1723: BUG(1, uprintf("Process management error line %d\n", __LINE__));
1724: exit(EXIT_FAILURE);
1725: }
1726:
1727: /*
1728: * Initialisation de la pile système
1729: */
1730:
1731: l_element_courant = (struct_liste_chainee *)
1732: (*s_etat_processus).l_base_pile_systeme;
1733: while(l_element_courant != NULL)
1734: {
1735: l_element_suivant = (struct_liste_chainee *)
1736: (*((struct_liste_pile_systeme *)
1737: l_element_courant)).suivant;
1738:
1739: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
1740: l_element_courant)).indice_boucle);
1741: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
1742: l_element_courant)).limite_indice_boucle);
1743: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
1744: l_element_courant)).objet_de_test);
1745:
1746: if ((*((struct_liste_pile_systeme *) l_element_courant))
1747: .nom_variable != NULL)
1748: {
1749: free((*((struct_liste_pile_systeme *)
1750: l_element_courant)).nom_variable);
1751: }
1752:
1753: free((struct_liste_pile_systeme *) l_element_courant);
1754:
1755: l_element_courant = l_element_suivant;
1756: }
1757:
1758: (*s_etat_processus).l_base_pile_systeme = NULL;
1759: (*s_etat_processus).hauteur_pile_systeme = 0;
1760:
1761: empilement_pile_systeme(s_etat_processus);
1762:
1763: if ((*s_etat_processus).erreur_systeme != d_es)
1764: {
1765: pid_final = -2;
1766:
1767: while((longueur_ecriture = write_atomic(s_etat_processus,
1768: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
1769: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1770: {
1771: if (longueur_ecriture == -1)
1772: {
1773: break;
1774: }
1775: }
1776:
1777: while((longueur_ecriture = write_atomic(s_etat_processus,
1778: (*s_argument_thread).pipe_nombre_objets_attente[1],
1779: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1780: {
1781: if (longueur_ecriture == -1)
1782: {
1783: break;
1784: }
1785: }
1786:
1787: destruction_queue_signaux(s_etat_processus);
1788: BUG(1, uprintf("Process management error line %d\n", __LINE__));
1789: exit(EXIT_FAILURE);
1790: }
1791:
1792: (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
1793:
1794: l_element_courant = (struct_liste_chainee *)
1795: (*s_etat_processus).s_marques;
1796:
1797: while(l_element_courant != NULL)
1798: {
1799: free((*((struct_marque *) l_element_courant)).label);
1800: free((*((struct_marque *) l_element_courant)).position);
1801: l_element_suivant = (struct_liste_chainee *)
1802: (*((struct_marque *) l_element_courant)).suivant;
1803: free((struct_marque *) l_element_courant);
1804: l_element_courant = l_element_suivant;
1805: }
1806:
1807: (*s_etat_processus).s_marques = NULL;
1808:
1809: /*
1810: * On empile deux valeurs retour_definition pour pouvoir récupérer
1811: * les variables dans le cas d'un programme compilé.
1812: */
1813:
1814: empilement_pile_systeme(s_etat_processus);
1815:
1816: if ((*s_etat_processus).erreur_systeme != d_es)
1817: {
1818: pid_final = -2;
1819:
1820: while((longueur_ecriture = write_atomic(s_etat_processus,
1821: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
1822: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1823: {
1824: if (longueur_ecriture == -1)
1825: {
1826: break;
1827: }
1828: }
1829:
1830: while((longueur_ecriture = write_atomic(s_etat_processus,
1831: (*s_argument_thread).pipe_nombre_objets_attente[1],
1832: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
1833: {
1834: if (longueur_ecriture == -1)
1835: {
1836: break;
1837: }
1838: }
1839:
1840: destruction_queue_signaux(s_etat_processus);
1841: BUG(1, uprintf("Process management error line %d\n", __LINE__));
1842: exit(EXIT_FAILURE);
1843: }
1844:
1845: (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
1846:
1847: /*
1848: * Destruction des sorties graphiques et PostScript
1849: */
1850:
1851: while((*s_etat_processus).fichiers_graphiques != NULL)
1852: {
1853: free((*(*s_etat_processus).fichiers_graphiques).nom);
1854:
1855: if ((*(*s_etat_processus).fichiers_graphiques).legende != NULL)
1856: {
1857: free((*(*s_etat_processus).fichiers_graphiques).legende);
1858: }
1859:
1860: l_element_precedent = (void *) (*s_etat_processus)
1861: .fichiers_graphiques;
1862: (*s_etat_processus).fichiers_graphiques =
1863: (*(*s_etat_processus).fichiers_graphiques).suivant;
1864: free(l_element_precedent);
1865: }
1866:
1867: if ((*s_etat_processus).entree_standard != NULL)
1868: {
1869: pclose((*s_etat_processus).entree_standard);
1870: (*s_etat_processus).entree_standard = NULL;
1871: }
1872:
1873: (*s_etat_processus).requete_nouveau_plan = d_vrai;
1874: (*s_etat_processus).mise_a_jour_trace_requise = d_faux;
1875:
1876: if ((*s_etat_processus).nom_fichier_impression != NULL)
1877: {
1878: free((*s_etat_processus).nom_fichier_impression);
1879: (*s_etat_processus).nom_fichier_impression = NULL;
1880: }
1881:
1882: /*
1883: * Destruction des piles de fichiers
1884: */
1885:
1886: l_element_courant = (*s_etat_processus).s_fichiers;
1887:
1888: while(l_element_courant != NULL)
1889: {
1890: l_element_suivant = (*l_element_courant).suivant;
1891:
1892: fclose((*((struct_descripteur_fichier *)
1893: (*l_element_courant).donnee)).descripteur_c);
1894:
1895: if ((*((struct_descripteur_fichier *)
1896: (*l_element_courant).donnee)).type != 'C')
1897: {
1898: sqlite3_close((*((struct_descripteur_fichier *)
1899: (*l_element_courant).donnee)).descripteur_sqlite);
1900: }
1901:
1902: free((*((struct_descripteur_fichier *) (*l_element_courant)
1903: .donnee)).nom);
1904: free((struct_descripteur_fichier *) (*l_element_courant).donnee);
1905: free(l_element_courant);
1906:
1907: l_element_courant = l_element_suivant;
1908: }
1909:
1910: /*
1911: * Destruction des piles de connecteurs SQL
1912: */
1913:
1914: /*
1915: ================================================================================
1916: À noter : on ne ferme pas la connexion car la conséquence immédiate est
1917: une destruction de l'objet pour le processus père.
1918: ================================================================================
1919: */
1920:
1921: l_element_courant = (*s_etat_processus).s_connecteurs_sql;
1922:
1923: while(l_element_courant != NULL)
1924: {
1925: l_element_suivant = (*l_element_courant).suivant;
1926:
1927: // sqlclose((*l_element_courant).donnee);
1928: liberation(s_etat_processus, (*l_element_courant).donnee);
1929: l_element_courant = l_element_suivant;
1930: }
1931:
1932: (*s_etat_processus).s_connecteurs_sql = NULL;
1933:
1934: /*
1935: * On ne détruit pas les sockets car il faut utiliser DETACH
1936: * pour traiter plusieurs connexions simultanées sur les sockets
1937: */
1938:
1939: (*s_etat_processus).s_fichiers = NULL;
1940:
1941: if ((*s_etat_processus).debug == d_vrai)
1942: {
1943: if (((*s_etat_processus).type_debug & d_debug_processus)
1944: != 0)
1945: {
1946: if ((*s_etat_processus).langue == 'F')
1947: {
1948: printf("[%d] Évaluation de l'objet détaché\n", getpid());
1949: }
1950: else
1951: {
1952: printf("[%d] Évaluation of detached object\n", getpid());
1953: }
1954: }
1955: }
1956:
1957: if ((*s_etat_processus).erreur_systeme == d_es)
1958: {
1959: if (setjmp(contexte_processus) == 0)
1960: {
1961: if (variable_partagee == d_faux)
1962: {
1963: if (evaluation(s_etat_processus, s_objet, 'E') == d_erreur)
1964: {
1965: if (((*s_etat_processus).erreur_execution == d_ex) &&
1966: ((*s_etat_processus).erreur_systeme == d_es))
1967: {
1968: (*s_etat_processus).erreur_execution =
1969: d_ex_erreur_evaluation;
1970: }
1971: }
1972: else
1973: {
1974: if (((*s_etat_processus).var_volatile_alarme == 0)
1975: && ((*s_etat_processus).arret_depuis_abort == 0)
1976: && ((*s_etat_processus).at_exit != NULL))
1977: {
1978: (*s_etat_processus).var_volatile_requete_arret = 0;
1979:
1980: if (evaluation(s_etat_processus,
1981: (*s_etat_processus).at_exit, 'E') ==
1982: d_erreur)
1983: {
1984: (*s_etat_processus).erreur_execution =
1985: d_ex_erreur_evaluation;
1986: }
1987: }
1988: }
1989: }
1990: else
1991: {
1992: if (evaluation(s_etat_processus, s_copie, 'E') == d_erreur)
1993: {
1994: if (((*s_etat_processus).erreur_execution == d_ex) &&
1995: ((*s_etat_processus).erreur_systeme == d_es))
1996: {
1997: (*s_etat_processus).erreur_execution =
1998: d_ex_erreur_evaluation;
1999: }
2000: }
2001: else
2002: {
2003: if ((*s_etat_processus).at_exit != NULL)
2004: {
2005: (*s_etat_processus).var_volatile_requete_arret = 0;
2006:
2007: if (evaluation(s_etat_processus,
2008: (*s_etat_processus).at_exit, 'E') ==
2009: d_erreur)
2010: {
2011: (*s_etat_processus).erreur_execution =
2012: d_ex_erreur_evaluation;
2013: }
2014: }
2015: }
2016:
2017: liberation(s_etat_processus, s_copie);
2018: }
2019: }
2020: }
2021:
2022: liberation(s_etat_processus, (*s_etat_processus).at_exit);
2023: liberation(s_etat_processus, (*s_etat_processus).at_poke);
2024:
2025: l_element_courant = (*s_etat_processus).liste_mutexes;
2026: while(l_element_courant != NULL)
2027: {
2028: pthread_mutex_trylock(&((*((struct_mutex *)
2029: (*(*l_element_courant).donnee).objet)).mutex));
2030: pthread_mutex_unlock(&((*((struct_mutex *)
2031: (*(*l_element_courant).donnee).objet)).mutex));
2032: pthread_mutex_destroy(&((*((struct_mutex *)
2033: (*(*l_element_courant).donnee).objet)).mutex));
2034:
2035: liberation(s_etat_processus, (*l_element_courant).donnee);
2036: l_element_suivant = (*l_element_courant).suivant;
2037: free(l_element_courant);
2038: l_element_courant = l_element_suivant;
2039: }
2040:
2041: if ((*s_etat_processus).presence_fusible == d_vrai)
2042: {
2043: pthread_cancel((*s_etat_processus).thread_fusible);
2044: }
2045:
2046: pid_final = -2;
2047:
2048: while((longueur_ecriture = write_atomic(s_etat_processus,
2049: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
2050: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
2051: {
2052: if (longueur_ecriture == -1)
2053: {
2054: break;
2055: }
2056: }
2057:
2058: while((longueur_ecriture = write_atomic(s_etat_processus,
2059: (*s_argument_thread).pipe_nombre_objets_attente[1],
2060: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
2061: {
2062: if (longueur_ecriture == -1)
2063: {
2064: break;
2065: }
2066: }
2067:
2068: if ((*s_etat_processus).var_volatile_processus_pere != 0)
2069: {
2070: // Racine des processus atteinte
2071:
2072: erreur = d_ex;
2073:
2074: while((longueur_ecriture = write_atomic(s_etat_processus,
2075: (*s_argument_thread).pipe_erreurs[1], &erreur,
2076: sizeof((*s_etat_processus).erreur_execution))) !=
2077: sizeof((*s_etat_processus).erreur_execution))
2078: {
2079: if (longueur_ecriture == -1)
2080: {
2081: break;
2082: }
2083: }
2084: }
2085: else
2086: {
2087: while((longueur_ecriture = write_atomic(s_etat_processus,
2088: (*s_argument_thread).pipe_erreurs[1],
2089: &((*s_etat_processus).erreur_execution),
2090: sizeof((*s_etat_processus).erreur_execution))) !=
2091: sizeof((*s_etat_processus).erreur_execution))
2092: {
2093: if (longueur_ecriture == -1)
2094: {
2095: break;
2096: }
2097: }
2098: }
2099:
2100: if ((*s_etat_processus).var_volatile_processus_pere != 0)
2101: {
2102: // Racine des processus atteinte
2103:
2104: erreur = d_es;
2105:
2106: while((longueur_ecriture = write_atomic(s_etat_processus,
2107: (*s_argument_thread).pipe_erreurs[1], &erreur,
2108: sizeof((*s_etat_processus).erreur_systeme))) !=
2109: sizeof((*s_etat_processus).erreur_systeme))
2110: {
2111: if (longueur_ecriture == -1)
2112: {
2113: break;
2114: }
2115: }
2116: }
2117: else
2118: {
2119: while((longueur_ecriture = write_atomic(s_etat_processus,
2120: (*s_argument_thread).pipe_erreurs[1],
2121: &((*s_etat_processus).erreur_systeme),
2122: sizeof((*s_etat_processus).erreur_systeme))) !=
2123: sizeof((*s_etat_processus).erreur_systeme))
2124: {
2125: if (longueur_ecriture == -1)
2126: {
2127: break;
2128: }
2129: }
2130: }
2131:
2132: if ((*s_etat_processus).pid_erreur_processus_fils == 0)
2133: {
2134: while((longueur_ecriture = write_atomic(s_etat_processus,
2135: (*s_argument_thread).pipe_erreurs[1],
2136: &ppid, sizeof(ppid))) != sizeof(ppid))
2137: {
2138: if (longueur_ecriture == -1)
2139: {
2140: break;
2141: }
2142: }
2143: }
2144: else
2145: {
2146: while((longueur_ecriture = write_atomic(s_etat_processus,
2147: (*s_argument_thread).pipe_erreurs[1],
2148: &((*s_etat_processus).pid_erreur_processus_fils),
2149: sizeof((*s_etat_processus).pid_erreur_processus_fils))) !=
2150: sizeof((*s_etat_processus).pid_erreur_processus_fils))
2151: {
2152: if (longueur_ecriture == -1)
2153: {
2154: break;
2155: }
2156: }
2157: }
2158:
2159: close((*s_argument_thread).pipe_erreurs[1]);
2160: close((*s_argument_thread).pipe_interruptions[1]);
2161: close((*s_argument_thread).pipe_nombre_interruptions_attente[1]);
2162: close((*s_argument_thread).pipe_objets[1]);
2163: close((*s_argument_thread).pipe_nombre_objets_attente[1]);
2164: close((*s_argument_thread).pipe_injections[0]);
2165: close((*s_argument_thread).pipe_nombre_injections[0]);
2166: close((*s_argument_thread).pipe_acquittement[0]);
2167:
2168: l_element_courant = (*s_etat_processus).s_fichiers;
2169:
2170: while(l_element_courant != NULL)
2171: {
2172: l_element_suivant = (*l_element_courant).suivant;
2173:
2174: fclose((*((struct_descripteur_fichier *)
2175: (*l_element_courant).donnee)).descripteur_c);
2176:
2177: if ((*((struct_descripteur_fichier *)
2178: (*l_element_courant).donnee)).type != 'C')
2179: {
2180: sqlite3_close((*((struct_descripteur_fichier *)
2181: (*l_element_courant).donnee)).descripteur_sqlite);
2182: }
2183:
2184: if (((*((struct_descripteur_fichier *) (*l_element_courant)
2185: .donnee)).pid == getpid()) &&
2186: (pthread_equal((*((struct_descripteur_fichier *)
2187: (*l_element_courant).donnee)).tid, pthread_self()) != 0))
2188: {
2189: if ((*((struct_descripteur_fichier *) (*l_element_courant)
2190: .donnee)).effacement == 'Y')
2191: {
2192: unlink((*((struct_descripteur_fichier *)
2193: (*l_element_courant).donnee)).nom);
2194: }
2195: }
2196:
2197: free((*((struct_descripteur_fichier *) (*l_element_courant)
2198: .donnee)).nom);
2199: free((struct_descripteur_fichier *) (*l_element_courant).donnee);
2200: free(l_element_courant);
2201:
2202: l_element_courant = l_element_suivant;
2203: }
2204:
2205: pthread_mutex_lock(&((*s_etat_processus).mutex));
2206:
2207: l_element_courant = (struct_liste_chainee *)
2208: (*s_etat_processus).l_base_pile_processus;
2209:
2210: while(l_element_courant != NULL)
2211: {
2212: if ((*(*((struct_processus_fils *) (*(*((struct_liste_chainee *)
2213: l_element_courant)).donnee).objet)).thread)
2214: .processus_detache == d_vrai)
2215: {
2216: if ((*s_etat_processus).debug == d_vrai)
2217: {
2218: if (((*s_etat_processus).type_debug & d_debug_processus)
2219: != 0)
2220: {
2221: if ((*s_etat_processus).langue == 'F')
2222: {
2223: printf("[%d] Signalement pour arrêt du "
2224: "processus %d\n",
2225: (int) getpid(),
2226: (int) (*(*((struct_processus_fils *)
2227: (*(*((struct_liste_chainee *)
2228: l_element_courant)).donnee).objet))
2229: .thread).pid);
2230: }
2231: else
2232: {
2233: printf("[%d] Send stop signal to process %d\n",
2234: (int) getpid(),
2235: (int) (*(*((struct_processus_fils *)
2236: (*(*((struct_liste_chainee *)
2237: l_element_courant)).donnee).objet))
2238: .thread).pid);
2239: }
2240: }
2241: }
2242:
2243: if ((*s_etat_processus).var_volatile_alarme != 0)
2244: {
2245: envoi_signal_processus((*(*((struct_processus_fils *)
2246: (*(*l_element_courant).donnee).objet)).thread).pid,
2247: rpl_sigurg);
2248: }
2249: else
2250: {
2251: if ((*s_etat_processus).arret_depuis_abort == -1)
2252: {
2253: envoi_signal_processus((*(*((struct_processus_fils *)
2254: (*(*l_element_courant).donnee).objet)).thread)
2255: .pid, rpl_sigabort);
2256: }
2257: else
2258: {
2259: envoi_signal_processus((*(*((struct_processus_fils *)
2260: (*(*l_element_courant).donnee).objet)).thread)
2261: .pid, rpl_sigstop);
2262: }
2263: }
2264: }
2265: else
2266: {
2267: if ((*s_etat_processus).debug == d_vrai)
2268: {
2269: if (((*s_etat_processus).type_debug & d_debug_processus)
2270: != 0)
2271: {
2272: if ((*s_etat_processus).langue == 'F')
2273: {
2274: printf("[%d] Signalement pour arrêt du "
2275: "thread %llu\n",
2276: (int) getpid(), (unsigned long long)
2277: (*(*((struct_processus_fils *)
2278: (*(*((struct_liste_chainee *)
2279: l_element_courant)).donnee).objet)).thread)
2280: .tid);
2281: }
2282: else
2283: {
2284: printf("[%d] Send stop signal to thread %llu\n",
2285: (int) getpid(), (unsigned long long)
2286: (*(*((struct_processus_fils *)
2287: (*(*((struct_liste_chainee *)
2288: l_element_courant)).donnee).objet)).thread)
2289: .tid);
2290: }
2291: }
2292: }
2293:
2294: pthread_mutex_lock(&((*(*((struct_processus_fils *)
2295: (*(*l_element_courant).donnee).objet)).thread).mutex));
2296:
2297: if ((*(*((struct_processus_fils *)
2298: (*(*l_element_courant).donnee).objet)).thread)
2299: .thread_actif == d_vrai)
2300: {
2301: if ((*s_etat_processus).var_volatile_alarme != 0)
2302: {
2303: envoi_signal_thread((*(*((struct_processus_fils *)
2304: (*(*l_element_courant).donnee).objet)).thread)
2305: .tid, rpl_sigurg);
2306: }
2307: else
2308: {
2309: if ((*s_etat_processus).arret_depuis_abort == -1)
2310: {
2311: envoi_signal_thread((*(*((struct_processus_fils *)
2312: (*(*l_element_courant).donnee).objet))
2313: .thread).tid, rpl_sigabort);
2314: }
2315: else
2316: {
2317: envoi_signal_thread((*(*((struct_processus_fils *)
2318: (*(*l_element_courant).donnee).objet))
2319: .thread).tid, rpl_sigstop);
2320: }
2321: }
2322: }
2323:
2324: pthread_mutex_unlock(&((*(*((struct_processus_fils *)
2325: (*(*l_element_courant).donnee).objet)).thread).mutex));
2326: }
2327:
2328: l_element_courant = (*l_element_courant).suivant;
2329: }
2330:
2331: /*
2332: * Attente de la fin de tous les processus fils
2333: */
2334:
2335: for(i = 0; i < d_NOMBRE_INTERRUPTIONS;
2336: (*s_etat_processus).masque_interruptions[i++] = 'I');
2337:
2338: attente.tv_sec = 0;
2339: attente.tv_nsec = GRANULARITE_us * 1000;
2340:
2341: while((*s_etat_processus).l_base_pile_processus != NULL)
2342: {
2343: l_element_courant = (struct_liste_chainee *)
2344: (*s_etat_processus).l_base_pile_processus;
2345:
2346: registre_stop = (*s_etat_processus)
2347: .var_volatile_traitement_retarde_stop;
2348: (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
2349:
2350: for(i = 0; i < (unsigned long) (*(*((struct_processus_fils *)
2351: (*(*l_element_courant)
2352: .donnee).objet)).thread).nombre_objets_dans_pipe; i++)
2353: {
2354: if ((s_objet_temporaire = lecture_pipe(s_etat_processus,
2355: (*(*((struct_processus_fils *) (*(*l_element_courant)
2356: .donnee).objet)).thread).pipe_objets[0])) != NULL)
2357: {
2358: liberation(s_etat_processus, s_objet_temporaire);
2359:
2360: (*(*((struct_processus_fils *) (*(*l_element_courant)
2361: .donnee).objet)).thread).nombre_objets_dans_pipe--;
2362:
2363: action.sa_handler = SIG_IGN;
2364: action.sa_flags = SA_ONSTACK;
2365:
2366: if (sigaction(SIGPIPE, &action, ®istre) != 0)
2367: {
2368: pthread_mutex_unlock(&((*s_etat_processus).mutex));
2369:
2370: if (registre_stop == 0)
2371: {
2372: if ((*s_etat_processus)
2373: .var_volatile_traitement_retarde_stop
2374: == -1)
2375: {
2376: (*s_etat_processus)
2377: .var_volatile_requete_arret = -1;
2378: }
2379:
2380: (*s_etat_processus)
2381: .var_volatile_traitement_retarde_stop =
2382: registre_stop;
2383: }
2384:
2385: destruction_queue_signaux(s_etat_processus);
2386: (*s_etat_processus).erreur_systeme = d_es_signal;
2387: exit(EXIT_FAILURE);
2388: }
2389:
2390: while((longueur_ecriture = write_atomic(
2391: s_etat_processus, (*(*((struct_processus_fils *)
2392: (*(*l_element_courant).donnee).objet))
2393: .thread).pipe_nombre_injections[1], "+",
2394: sizeof(unsigned char))) !=
2395: sizeof(unsigned char))
2396: {
2397: if (longueur_ecriture == -1)
2398: {
2399: // Le processus n'existe plus.
2400: break;
2401: }
2402: }
2403:
2404: if (registre_stop == 0)
2405: {
2406: if ((*s_etat_processus)
2407: .var_volatile_traitement_retarde_stop == -1)
2408: {
2409: (*s_etat_processus).var_volatile_requete_arret
2410: = -1;
2411: }
2412:
2413: (*s_etat_processus)
2414: .var_volatile_traitement_retarde_stop =
2415: registre_stop;
2416: }
2417:
2418: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
2419: {
2420: destruction_queue_signaux(s_etat_processus);
2421:
2422: pthread_mutex_unlock(&((*s_etat_processus).mutex));
2423: (*s_etat_processus).erreur_systeme = d_es_signal;
2424: exit(EXIT_FAILURE);
2425: }
2426: }
2427: }
2428:
2429: pthread_mutex_unlock(&((*s_etat_processus).mutex));
2430:
2431: if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
2432: {
2433: affectation_interruptions_logicielles(s_etat_processus);
2434: }
2435:
2436: nanosleep(&attente, NULL);
2437: pthread_mutex_lock(&((*s_etat_processus).mutex));
2438:
2439: scrutation_interruptions(s_etat_processus);
2440: }
2441:
2442: pthread_mutex_unlock(&((*s_etat_processus).mutex));
2443:
2444: l_element_courant = (*s_etat_processus).s_sockets;
2445:
2446: while(l_element_courant != NULL)
2447: {
2448: l_element_suivant = (*l_element_courant).suivant;
2449:
2450: if ((*((struct_socket *) (*(*l_element_courant).donnee)
2451: .objet)).socket_connectee == d_vrai)
2452: {
2453: shutdown((*((struct_socket *) (*(*l_element_courant).donnee)
2454: .objet)).socket, SHUT_RDWR);
2455: }
2456:
2457: close((*((struct_socket *) (*(*l_element_courant).donnee)
2458: .objet)).socket);
2459:
2460: if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
2461: .pid == getpid()) && (pthread_equal((*((struct_socket *)
2462: (*(*l_element_courant).donnee).objet)).tid, pthread_self())
2463: != 0))
2464: {
2465: if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
2466: .effacement == 'Y')
2467: {
2468: unlink((*((struct_socket *) (*(*l_element_courant).donnee)
2469: .objet)).adresse);
2470: }
2471: }
2472:
2473: liberation(s_etat_processus,
2474: (*((struct_liste_chainee *) l_element_courant)).donnee);
2475: free(l_element_courant);
2476:
2477: l_element_courant = l_element_suivant;
2478: }
2479:
2480: l_element_courant = (*s_etat_processus).s_connecteurs_sql;
2481:
2482: while(l_element_courant != NULL)
2483: {
2484: l_element_suivant = (*l_element_courant).suivant;
2485:
2486: sqlclose((*l_element_courant).donnee);
2487:
2488: liberation(s_etat_processus,
2489: (*((struct_liste_chainee *) l_element_courant)).donnee);
2490: free(l_element_courant);
2491:
2492: l_element_courant = l_element_suivant;
2493: }
2494:
2495: if ((((*s_etat_processus).erreur_execution != d_ex) ||
2496: ((*s_etat_processus).exception != d_ep) ||
2497: ((*s_etat_processus).erreur_systeme != d_es)) &&
2498: ((*s_etat_processus).var_volatile_traitement_sigint == 0))
2499: {
2500: printf("%s [%d]\n", message =
2501: messages(s_etat_processus), (int) getpid());
2502: free(message);
2503:
2504: if ((*s_etat_processus).core == d_vrai)
2505: {
2506: printf("\n");
2507:
2508: if ((*s_etat_processus).langue == 'F')
2509: {
2510: printf("+++Information : Génération du fichier rpl-core "
2511: "[%d]\n", (int) getpid());
2512: }
2513: else
2514: {
2515: printf("+++Information : Writing rpl-core file [%d]\n",
2516: (int) getpid());
2517: }
2518:
2519: rplcore(s_etat_processus);
2520:
2521: if ((*s_etat_processus).langue == 'F')
2522: {
2523: printf("+++Information : Processus tracé [%d]\n",
2524: (int) getpid());
2525: }
2526: else
2527: {
2528: printf("+++Information : Done [%d]\n", (int) getpid());
2529: }
2530:
2531: printf("\n");
2532: fflush(stdout);
2533: }
2534: }
2535:
2536: liberation_arbre_instructions(s_etat_processus,
2537: (*s_etat_processus).arbre_instructions);
2538: free((*s_etat_processus).pointeurs_caracteres);
2539:
2540: if ((*s_etat_processus).entree_standard != NULL)
2541: {
2542: pclose((*s_etat_processus).entree_standard);
2543: (*s_etat_processus).entree_standard = NULL;
2544: }
2545:
2546: liberation(s_etat_processus, (*s_etat_processus).indep);
2547: liberation(s_etat_processus, (*s_etat_processus).depend);
2548:
2549: free((*s_etat_processus).label_x);
2550: free((*s_etat_processus).label_y);
2551: free((*s_etat_processus).label_z);
2552: free((*s_etat_processus).titre);
2553: free((*s_etat_processus).legende);
2554:
2555: liberation(s_etat_processus,
2556: (*s_etat_processus).parametres_courbes_de_niveau);
2557:
2558: if ((*s_etat_processus).instruction_derniere_erreur != NULL)
2559: {
2560: free((*s_etat_processus).instruction_derniere_erreur);
2561: (*s_etat_processus).instruction_derniere_erreur = NULL;
2562: }
2563:
2564: liberation_arbre_variables(s_etat_processus,
2565: (*s_etat_processus).s_arbre_variables, d_vrai);
2566: free((*s_etat_processus).pointeurs_caracteres_variables);
2567:
2568: for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++)
2569: {
2570: liberation(s_etat_processus,
2571: (*s_etat_processus).s_liste_variables_statiques[i].objet);
2572: free((*s_etat_processus).s_liste_variables_statiques[i].nom);
2573: }
2574:
2575: free((*s_etat_processus).s_liste_variables_statiques);
2576:
2577: for(i = 0; i < (*(*s_etat_processus).s_liste_variables_partagees)
2578: .nombre_variables; i++)
2579: {
2580: liberation(s_etat_processus,
2581: (*(*s_etat_processus).s_liste_variables_partagees)
2582: .table[i].objet);
2583: free((*(*s_etat_processus).s_liste_variables_partagees)
2584: .table[i].nom);
2585: }
2586:
2587: if ((*(*s_etat_processus).s_liste_variables_partagees).table
2588: != NULL)
2589: {
2590: free((struct_variable_partagee *)
2591: (*(*s_etat_processus).s_liste_variables_partagees).table);
2592: }
2593:
2594: pthread_mutex_destroy(&((*(*s_etat_processus)
2595: .s_liste_variables_partagees).mutex));
2596:
2597: l_element_courant = (*s_etat_processus).l_base_pile;
2598: while(l_element_courant != NULL)
2599: {
2600: l_element_suivant = (*l_element_courant).suivant;
2601:
2602: liberation(s_etat_processus, (*l_element_courant).donnee);
2603: free(l_element_courant);
2604:
2605: l_element_courant = l_element_suivant;
2606: }
2607:
2608: l_element_courant = (*s_etat_processus).l_base_pile_last;
2609: while(l_element_courant != NULL)
2610: {
2611: l_element_suivant = (*l_element_courant).suivant;
2612:
2613: liberation(s_etat_processus, (*l_element_courant).donnee);
2614: free(l_element_courant);
2615:
2616: l_element_courant = l_element_suivant;
2617: }
2618:
2619: l_element_courant = (*s_etat_processus).l_base_pile_contextes;
2620: while(l_element_courant != NULL)
2621: {
2622: l_element_suivant = (*l_element_courant).suivant;
2623:
2624: liberation(s_etat_processus, (*l_element_courant).donnee);
2625: free(l_element_courant);
2626:
2627: l_element_courant = l_element_suivant;
2628: }
2629:
2630: l_element_courant = (*s_etat_processus).l_base_pile_taille_contextes;
2631: while(l_element_courant != NULL)
2632: {
2633: l_element_suivant = (*l_element_courant).suivant;
2634:
2635: liberation(s_etat_processus, (*l_element_courant).donnee);
2636: free(l_element_courant);
2637:
2638: l_element_courant = l_element_suivant;
2639: }
2640:
2641: l_element_courant = (struct_liste_chainee *)
2642: (*s_etat_processus).l_base_pile_systeme;
2643: while(l_element_courant != NULL)
2644: {
2645: l_element_suivant = (struct_liste_chainee *)
2646: (*((struct_liste_pile_systeme *)
2647: l_element_courant)).suivant;
2648:
2649: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
2650: l_element_courant)).indice_boucle);
2651: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
2652: l_element_courant)).limite_indice_boucle);
2653: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
2654: l_element_courant)).objet_de_test);
2655:
2656: if ((*((struct_liste_pile_systeme *)
2657: l_element_courant)).nom_variable != NULL)
2658: {
2659: free((*((struct_liste_pile_systeme *)
2660: l_element_courant)).nom_variable);
2661: }
2662:
2663: free((struct_liste_pile_systeme *) l_element_courant);
2664:
2665: l_element_courant = l_element_suivant;
2666: }
2667:
2668: /*
2669: * Destruction des bibliothèques
2670: */
2671:
2672: l_element_courant = (*s_etat_processus).s_bibliotheques;
2673:
2674: while(l_element_courant != NULL)
2675: {
2676: l_element_suivant = (*l_element_courant).suivant;
2677:
2678: free((*((struct_bibliotheque *) (*l_element_courant).donnee)).nom);
2679:
2680: dlclose((*((struct_bibliotheque *) (*l_element_courant).donnee))
2681: .descripteur);
2682:
2683: free((*l_element_courant).donnee);
2684: free(l_element_courant);
2685:
2686: l_element_courant = l_element_suivant;
2687: }
2688:
2689: for(i = 0; i < (*s_etat_processus).nombre_instructions_externes; i++)
2690: {
2691: free((*s_etat_processus).s_instructions_externes[i].nom);
2692: free((*s_etat_processus).s_instructions_externes[i]
2693: .nom_bibliotheque);
2694: }
2695:
2696: if ((*s_etat_processus).nombre_instructions_externes != 0)
2697: {
2698: free((*s_etat_processus).s_instructions_externes);
2699: }
2700:
2701: l_element_courant = (struct_liste_chainee *)
2702: (*s_etat_processus).s_marques;
2703:
2704: while(l_element_courant != NULL)
2705: {
2706: free((*((struct_marque *) l_element_courant)).label);
2707: free((*((struct_marque *) l_element_courant)).position);
2708: l_element_suivant = (struct_liste_chainee *)
2709: (*((struct_marque *) l_element_courant)).suivant;
2710: free((struct_marque *) l_element_courant);
2711: l_element_courant = l_element_suivant;
2712: }
2713:
2714: free((*s_etat_processus).chemin_fichiers_temporaires);
2715:
2716: if ((*s_etat_processus).debug == d_vrai)
2717: if (((*s_etat_processus).type_debug &
2718: d_debug_processus) != 0)
2719: {
2720: if ((*s_etat_processus).langue == 'F')
2721: {
2722: printf("[%d] Arrêt du processus\n", (int) getpid());
2723: }
2724: else
2725: {
2726: printf("[%d] Stop process\n", (int) getpid());
2727: }
2728:
2729: fflush(stdout);
2730: }
2731:
2732: liberation(s_etat_processus, s_objet);
2733:
2734: free((*s_etat_processus).definitions_chainees);
2735: free((*s_etat_processus).nom_fichier_historique);
2736:
2737: for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
2738: {
2739: liberation(s_etat_processus,
2740: (*s_etat_processus).corps_interruptions[i]);
2741:
2742: l_element_courant = (*s_etat_processus)
2743: .pile_origine_interruptions[i];
2744:
2745: while(l_element_courant != NULL)
2746: {
2747: l_element_suivant = (*l_element_courant).suivant;
2748:
2749: liberation(s_etat_processus, (*l_element_courant).donnee);
2750: free(l_element_courant);
2751:
2752: l_element_courant = l_element_suivant;
2753: }
2754: }
2755:
2756: if ((*s_etat_processus).generateur_aleatoire != NULL)
2757: {
2758: liberation_generateur_aleatoire(s_etat_processus);
2759: }
2760:
2761: if ((*s_etat_processus).profilage == d_vrai)
2762: {
2763: ecriture_profil(s_etat_processus);
2764: liberation_profil(s_etat_processus);
2765: }
2766:
2767: closelog();
2768:
2769: liberation_allocateur(s_etat_processus);
2770: retrait_thread(s_etat_processus);
2771:
2772: pthread_mutex_destroy(&((*s_etat_processus).mutex));
2773: pthread_mutex_destroy(&((*s_etat_processus).mutex_allocation));
2774: pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));
2775:
2776: # ifndef SEMAPHORES_NOMMES
2777: sem_post(&((*s_etat_processus).semaphore_fork));
2778: sem_destroy(&((*s_etat_processus).semaphore_fork));
2779: # else
2780: sem_post((*s_etat_processus).semaphore_fork);
2781: sem_destroy3((*s_etat_processus).semaphore_fork, getpid(),
2782: pthread_self(), SEM_FORK);
2783: # endif
2784:
2785: free((*s_etat_processus).localisation);
2786: free(s_argument_thread);
2787:
2788: clear_history();
2789:
2790: destruction_queue_signaux(s_etat_processus);
2791: liberation_contexte_cas(s_etat_processus);
2792: free(s_etat_processus);
2793:
2794: # ifdef DEBUG_MEMOIRE
2795: debug_memoire_verification();
2796: analyse_post_mortem();
2797: # endif
2798:
2799: exit(EXIT_SUCCESS);
2800: }
2801: else
2802: {
2803: (*s_etat_processus).erreur_systeme = d_es_processus;
2804: return;
2805: }
2806:
2807: // Si le pid existe déjà dans la pile des processus, il s'agit forcement
2808: // d'un processus moribond. On attend donc qu'il soit effectivement
2809: // libéré.
2810:
2811: do
2812: {
2813: l_element_courant = (struct_liste_chainee *)
2814: (*s_etat_processus).l_base_pile_processus;
2815: drapeau = d_faux;
2816:
2817: attente.tv_sec = 0;
2818: attente.tv_nsec = GRANULARITE_us * 1000;
2819:
2820: while(l_element_courant != NULL)
2821: {
2822: if ((*(*((struct_processus_fils *)
2823: (*(*l_element_courant).donnee).objet)).thread)
2824: .processus_detache == d_vrai)
2825: {
2826: if ((*(*((struct_processus_fils *)
2827: (*(*l_element_courant).donnee).objet)).thread).pid ==
2828: (*s_argument_thread).pid)
2829: {
2830: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
2831: {
2832: (*s_etat_processus).erreur_systeme = d_es_processus;
2833: return;
2834: }
2835:
2836: nanosleep(&attente, NULL);
2837: INCR_GRANULARITE(attente.tv_nsec);
2838:
2839: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
2840: {
2841: (*s_etat_processus).erreur_systeme = d_es_processus;
2842: return;
2843: }
2844:
2845: drapeau = d_vrai;
2846: break;
2847: }
2848: }
2849:
2850: scrutation_interruptions(s_etat_processus);
2851: l_element_courant = (*l_element_courant).suivant;
2852: }
2853: } while(drapeau == d_vrai);
2854:
2855: if (empilement(s_etat_processus,
2856: (struct_liste_chainee **) &((*s_etat_processus)
2857: .l_base_pile_processus), s_objet_systeme) == d_erreur)
2858: {
2859: pthread_mutex_unlock(&((*s_etat_processus).mutex));
2860: return;
2861: }
2862:
2863: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2864: s_objet) == d_erreur)
2865: {
2866: pthread_mutex_unlock(&((*s_etat_processus).mutex));
2867: return;
2868: }
2869:
2870: // On attend une donnée fictive pour être sûr que le segment de mémoire
2871: // partagée destiné à la gestion des signaux est bien initialisé.
2872:
2873: attente.tv_sec = 0;
2874: attente.tv_nsec = GRANULARITE_us * 1000;
2875:
2876: while(read_atomic(s_etat_processus,
2877: pipe_initialisation_segment_signaux[0],
2878: &caractere, sizeof(caractere)) == 0)
2879: {
2880: scrutation_interruptions(s_etat_processus);
2881: nanosleep(&attente, NULL);
2882: INCR_GRANULARITE(attente.tv_nsec);
2883: }
2884:
2885: close(pipe_initialisation_segment_signaux[0]);
2886: close(pipe_initialisation_segment_signaux[1]);
2887:
2888: // Le fils peut être présent sans être en attente du signal de départ.
2889:
2890: if (envoi_signal_processus((*s_argument_thread).pid, rpl_sigstart) != 0)
2891: {
2892: (*s_etat_processus).erreur_systeme = d_es_processus;
2893: pthread_mutex_unlock(&((*s_etat_processus).mutex));
2894: return;
2895: }
2896:
2897: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
2898: {
2899: (*s_etat_processus).erreur_systeme = d_es_processus;
2900: return;
2901: }
2902:
2903: return;
2904: }
2905:
2906: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>