1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.31
4: Copyright (C) 1989-2019 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 surveillance d'un processus fils.
29: Elle tourne dans un thread séparé et ferme les descripteurs lors
30: de la mort du fils.
31: ================================================================================
32: Entrées : pointeur sur une structure
33: --------------------------------------------------------------------------------
34: Sorties :
35: --------------------------------------------------------------------------------
36: Effets de bord : néant
37: ================================================================================
38: */
39:
40: void *
41: surveillance_processus(void *argument)
42: {
43: int status;
44:
45: integer8 nombre_donnees;
46:
47: logical1 drapeau;
48: logical1 drapeau_fin;
49: logical1 drapeau_fin_scrutation;
50: logical1 drapeau_elements_traites;
51:
52: pid_t pid;
53: pid_t pid_erreur;
54:
55: ssize_t iostat;
56: ssize_t longueur_ecriture;
57:
58: struct_descripteur_thread *s_argument_thread;
59:
60: struct_liste_chainee *l_element_courant;
61: struct_liste_chainee *l_element_precedent;
62:
63: struct_processus *s_etat_processus;
64:
65: struct timespec attente;
66:
67: unsigned char caractere;
68:
69: int tampon_erreur_execution;
70: int tampon_erreur_systeme;
71:
72: sigset_t set;
73:
74: sigfillset(&set);
75: pthread_sigmask(SIG_BLOCK, &set, NULL);
76:
77: s_argument_thread = argument;
78: s_etat_processus = (*s_argument_thread).s_etat_processus;
79:
80: if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)) != 0)
81: {
82: (*s_etat_processus).erreur_systeme = d_es_processus;
83: BUG(1, uprintf("General mutex error!\n"));
84: }
85:
86: nombre_thread_surveillance_processus++;
87: insertion_thread_surveillance(s_etat_processus, s_argument_thread);
88:
89: if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus)) != 0)
90: {
91: (*s_etat_processus).erreur_systeme = d_es_processus;
92: BUG(1, uprintf("General mutex error!\n"));
93: }
94:
95: attente.tv_sec = 0;
96: attente.tv_nsec = GRANULARITE_us * 1000;
97:
98: status = 0;
99:
100: drapeau_elements_traites = d_faux;
101:
102: if ((*s_etat_processus).debug == d_vrai)
103: if (((*s_etat_processus).type_debug &
104: d_debug_processus) != 0)
105: {
106: if ((*s_argument_thread).processus_detache == d_vrai)
107: {
108: if ((*s_etat_processus).langue == 'F')
109: {
110: printf("[%d] Lancement du thread de surveillance du"
111: " processus %d\n", (int) getpid(),
112: (int) (*s_argument_thread).pid);
113: }
114: else
115: {
116: printf("[%d] Start monitoring of process %d\n", (int) getpid(),
117: (int) (*s_argument_thread).pid);
118: }
119: }
120: else
121: {
122: if ((*s_etat_processus).langue == 'F')
123: {
124: printf("[%d] Lancement du thread de surveillance du"
125: " thread %llu\n", (int) getpid(), (unsigned long long)
126: (*s_argument_thread).tid);
127: }
128: else
129: {
130: printf("[%d] Start monitoring of thread %llu\n",
131: (int) getpid(), (unsigned long long)
132: (*s_argument_thread).tid);
133: }
134: }
135:
136: fflush(stdout);
137: }
138:
139: /*
140: * On attend une donnée fictive pour être sûr que le processus fils
141: * est bien démarré.
142: */
143:
144: while(read_atomic(s_etat_processus,
145: (*s_argument_thread).pipe_nombre_elements_attente[0],
146: &caractere, sizeof(caractere)) == 0)
147: {
148: if ((*s_etat_processus).var_volatile_requete_arret != 0)
149: {
150: drapeau_elements_traites = d_vrai;
151: }
152:
153: nanosleep(&attente, NULL);
154: }
155:
156: do
157: {
158: if ((*s_argument_thread).processus_detache == d_vrai)
159: {
160: /*
161: * Le processus est un processus détaché.
162: */
163:
164: if (drapeau_elements_traites == d_vrai)
165: {
166: nanosleep(&attente, NULL);
167: }
168: else if ((iostat = read_atomic(s_etat_processus,
169: (*s_argument_thread).pipe_nombre_elements_attente[0],
170: &caractere, sizeof(caractere))) == 0)
171: {
172: // Rien dans le pipe
173: nanosleep(&attente, NULL);
174: }
175: else if (iostat == sizeof(caractere))
176: {
177: // Un objet supplémentaire est dans le pipe correspondant
178: // au processus surveillé par ce thread.
179:
180: if (pthread_mutex_lock(&((*s_etat_processus)
181: .mutex_pile_processus)) != 0)
182: {
183: (*s_etat_processus).erreur_systeme_processus_fils =
184: d_es_processus;
185: }
186:
187: l_element_courant = (struct_liste_chainee *)
188: (*s_etat_processus).l_base_pile_processus;
189:
190: while(l_element_courant != NULL)
191: {
192: if ((*(*((struct_processus_fils *)
193: (*(*l_element_courant).donnee).objet))
194: .thread).processus_detache == d_faux)
195: {
196: l_element_courant = (*l_element_courant)
197: .suivant;
198: continue;
199: }
200:
201: if ((*(*((struct_processus_fils *)
202: (*(*l_element_courant).donnee).objet))
203: .thread).pid == (*s_argument_thread).pid)
204: {
205: break;
206: }
207:
208: l_element_courant = (*l_element_courant).suivant;
209: }
210:
211: BUG(l_element_courant == NULL,
212: printf("Process or thread not found"));
213:
214: switch(caractere)
215: {
216: case 1:
217: case 2:
218: {
219: if ((*s_etat_processus).debug == d_vrai)
220: if (((*s_etat_processus).type_debug &
221: d_debug_processus) != 0)
222: {
223: if ((*s_etat_processus).langue == 'F')
224: {
225: if (caractere == 1)
226: {
227: printf("[%d] Données en provenance "
228: "du processus %d\n", (int) getpid(),
229: (int) (*s_argument_thread).pid);
230: }
231: else
232: {
233: printf("[%d] Interrution logicielle "
234: "en provenance du processus "
235: "%d\n", (int) getpid(),
236: (int) (*s_argument_thread).pid);
237: }
238:
239: fflush(stdout);
240: }
241: else
242: {
243: if (caractere == 1)
244: {
245: printf("[%d] Data from process %d\n",
246: (int) getpid(),
247: (int) (*s_argument_thread).pid);
248: }
249: else
250: {
251: printf("[%d] Software interrupt "
252: "from process %d\n", (int) getpid(),
253: (int) (*s_argument_thread).pid);
254: }
255:
256: fflush(stdout);
257: }
258: }
259:
260: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
261: (*(*l_element_courant).donnee).objet))
262: .thread).mutex)) != 0)
263: {
264: (*s_etat_processus).erreur_systeme =
265: d_es_processus;
266: }
267:
268: if (caractere == 1)
269: {
270: (*(*((struct_processus_fils *)
271: (*(*l_element_courant).donnee).objet))
272: .thread).nombre_objets_dans_pipe++;
273: }
274: else
275: {
276: (*(*((struct_processus_fils *)
277: (*(*l_element_courant).donnee).objet))
278: .thread).nombre_interruptions_dans_pipe++;
279:
280: if (pthread_mutex_lock(&((*s_etat_processus)
281: .mutex_interruptions)) != 0)
282: {
283: (*s_etat_processus).erreur_systeme =
284: d_es_processus;
285: }
286:
287: (*s_etat_processus)
288: .nombre_interruptions_non_affectees++;
289:
290: if (pthread_mutex_unlock(&((*s_etat_processus)
291: .mutex_interruptions)) != 0)
292: {
293: (*s_etat_processus).erreur_systeme =
294: d_es_processus;
295: }
296: }
297:
298: if (pthread_mutex_unlock(
299: &((*(*((struct_processus_fils *)
300: (*(*l_element_courant).donnee).objet))
301: .thread).mutex)) != 0)
302: {
303: (*s_etat_processus).erreur_systeme =
304: d_es_processus;
305: }
306:
307: while((longueur_ecriture =
308: write_atomic(s_etat_processus,
309: (*(*((struct_processus_fils *)
310: (*(*l_element_courant).donnee).objet))
311: .thread).pipe_acquittement[1], "-",
312: sizeof(unsigned char))) !=
313: sizeof(unsigned char))
314: {
315: if (longueur_ecriture == -1)
316: {
317: (*s_etat_processus)
318: .erreur_systeme_processus_fils =
319: d_es_processus;
320: }
321: }
322:
323: if ((*s_etat_processus).debug == d_vrai)
324: if (((*s_etat_processus).type_debug &
325: d_debug_processus) != 0)
326: {
327: if ((*s_etat_processus).langue == 'F')
328: {
329: if (caractere == 1)
330: {
331: printf("[%d] Données acquittées "
332: "en provenance du "
333: "processus %d\n", (int) getpid(),
334: (int) (*s_argument_thread).pid);
335: }
336: else
337: {
338: printf("[%d] Interruption logicielle "
339: "acquittée en provenance "
340: "du processus %d\n", (int) getpid(),
341: (int) (*s_argument_thread).pid);
342: }
343:
344: fflush(stdout);
345: }
346: else
347: {
348: if (caractere == 1)
349: {
350: printf("[%d] Data acknowklegment "
351: "from process %d\n", (int) getpid(),
352: (int) (*s_argument_thread).pid);
353: }
354: else
355: {
356: printf("[%d] Software interrupt "
357: "acknowklegment from "
358: "process %d\n", (int) getpid(),
359: (int) (*s_argument_thread).pid);
360: }
361:
362: fflush(stdout);
363: }
364: }
365:
366: envoi_signal_thread(NULL,
367: (*s_argument_thread).thread_pere,
368: rpl_siginject);
369: break;
370: }
371:
372: case 0:
373: {
374: break;
375: }
376:
377: default:
378: {
379: (*s_etat_processus).erreur_systeme_processus_fils =
380: d_es_processus;
381: BUG(1, printf("Spurious interprocess data"));
382: }
383: }
384:
385: if (pthread_mutex_unlock(&((*s_etat_processus)
386: .mutex_pile_processus)) != 0)
387: {
388: (*s_etat_processus).erreur_systeme_processus_fils =
389: d_es_processus;
390: }
391: }
392: else
393: {
394: (*s_etat_processus).erreur_systeme = d_es_processus;
395: }
396:
397: if ((pid = waitpid((*s_argument_thread).pid, &status, WNOHANG)) < 0)
398: {
399: break;
400: }
401:
402: drapeau_fin_scrutation = (!WIFEXITED(status)) ||
403: (!WIFSIGNALED(status)) || (pid == 0);
404:
405: if (WIFEXITED(status))
406: {
407: if (WEXITSTATUS(status) == (0xFF & EXIT_FAILURE))
408: {
409: (*s_etat_processus).erreur_systeme = d_es_processus;
410: }
411: }
412: }
413: else
414: {
415: /*
416: * Le processus n'est pas détaché.
417: */
418:
419: if (drapeau_elements_traites == d_vrai)
420: {
421: nanosleep(&attente, NULL);
422: }
423: else if ((iostat = read_atomic(s_etat_processus,
424: (*s_argument_thread).pipe_nombre_elements_attente[0],
425: &caractere, sizeof(caractere))) == 0)
426: {
427: // Rien dans le pipe
428: nanosleep(&attente, NULL);
429: }
430: else if (iostat == sizeof(caractere))
431: {
432: // Un objet supplémentaire est dans le pipe correspondant
433: // au processus surveillé par ce thread.
434:
435: if (pthread_mutex_lock(&((*s_etat_processus)
436: .mutex_pile_processus)) != 0)
437: {
438: (*s_etat_processus).erreur_systeme_processus_fils =
439: d_es_processus;
440: }
441:
442: l_element_courant = (struct_liste_chainee *)
443: (*s_etat_processus).l_base_pile_processus;
444:
445: while(l_element_courant != NULL)
446: {
447: if ((*(*((struct_processus_fils *)
448: (*(*l_element_courant).donnee).objet))
449: .thread).processus_detache == d_vrai)
450: {
451: l_element_courant = (*l_element_courant).suivant;
452: continue;
453: }
454:
455: if ((*(*((struct_processus_fils *)
456: (*(*l_element_courant).donnee).objet))
457: .thread).tid == (*s_argument_thread).tid)
458: {
459: break;
460: }
461:
462: l_element_courant = (*l_element_courant).suivant;
463: }
464:
465: BUG(l_element_courant == NULL,
466: printf("Process or thread not found"));
467:
468: switch(caractere)
469: {
470: case 1:
471: case 2:
472: {
473: if ((*s_etat_processus).debug == d_vrai)
474: if (((*s_etat_processus).type_debug &
475: d_debug_processus) != 0)
476: {
477: if ((*s_etat_processus).langue == 'F')
478: {
479: if (caractere == 1)
480: {
481: printf("[%d] Données en provenance "
482: "du thread %llu\n", (int) getpid(),
483: (unsigned long long)
484: (*s_argument_thread).tid);
485: }
486: else
487: {
488: printf("[%d] Interrution logicielle "
489: "en provenance du thread "
490: "%llu\n", (int) getpid(),
491: (unsigned long long)
492: (*s_argument_thread).tid);
493: }
494:
495: fflush(stdout);
496: }
497: else
498: {
499: if (caractere == 1)
500: {
501: printf("[%d] Data from thread %llu\n",
502: (int) getpid(), (unsigned long long)
503: (*s_argument_thread).tid);
504: }
505: else
506: {
507: printf("[%d] Software interrupt "
508: "from thread %llu\n",
509: (int) getpid(), (unsigned long long)
510: (*s_argument_thread).tid);
511: }
512:
513: fflush(stdout);
514: }
515: }
516:
517: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
518: (*(*l_element_courant).donnee).objet))
519: .thread).mutex)) != 0)
520: {
521: (*s_etat_processus).erreur_systeme =
522: d_es_processus;
523: }
524:
525: if (caractere == 1)
526: {
527: (*(*((struct_processus_fils *)
528: (*(*l_element_courant).donnee).objet))
529: .thread).nombre_objets_dans_pipe++;
530: }
531: else
532: {
533: (*(*((struct_processus_fils *)
534: (*(*l_element_courant).donnee).objet))
535: .thread).nombre_interruptions_dans_pipe++;
536:
537: if (pthread_mutex_lock(&((*s_etat_processus)
538: .mutex_interruptions)) != 0)
539: {
540: (*s_etat_processus).erreur_systeme =
541: d_es_processus;
542: }
543:
544: (*s_etat_processus)
545: .nombre_interruptions_non_affectees++;
546:
547: if (pthread_mutex_unlock(&((*s_etat_processus)
548: .mutex_interruptions)) != 0)
549: {
550: (*s_etat_processus).erreur_systeme =
551: d_es_processus;
552: }
553: }
554:
555: if (pthread_mutex_unlock(
556: &((*(*((struct_processus_fils *)
557: (*(*l_element_courant).donnee).objet))
558: .thread).mutex)) != 0)
559: {
560: (*s_etat_processus).erreur_systeme =
561: d_es_processus;
562: }
563:
564: while((longueur_ecriture =
565: write_atomic(s_etat_processus,
566: (*(*((struct_processus_fils *)
567: (*(*l_element_courant).donnee).objet))
568: .thread).pipe_acquittement[1], "-",
569: sizeof(unsigned char))) !=
570: sizeof(unsigned char))
571: {
572: if (longueur_ecriture == -1)
573: {
574: (*s_etat_processus)
575: .erreur_systeme_processus_fils =
576: d_es_processus;
577: }
578: }
579:
580: if ((*s_etat_processus).debug == d_vrai)
581: if (((*s_etat_processus).type_debug &
582: d_debug_processus) != 0)
583: {
584: if ((*s_etat_processus).langue == 'F')
585: {
586: if (caractere == 1)
587: {
588: printf("[%d] Données acquittées "
589: "en provenance du "
590: "thread %llu\n", (int) getpid(),
591: (unsigned long long)
592: (*s_argument_thread).tid);
593: }
594: else
595: {
596: printf("[%d] Interruption logicielle "
597: "acquittée en provenance "
598: "du thread %llu\n", (int) getpid(),
599: (unsigned long long)
600: (*s_argument_thread).tid);
601: }
602:
603: fflush(stdout);
604: }
605: else
606: {
607: if (caractere == 1)
608: {
609: printf("[%d] Data acknowklegment "
610: "from thread %d\n", (int) getpid(),
611: (unsigned long long)
612: (*s_argument_thread).tid);
613: }
614: else
615: {
616: printf("[%d] Software interrupt "
617: "acknowklegment from "
618: "thread %d\n", (int) getpid(),
619: (unsigned long long)
620: (*s_argument_thread).tid);
621: }
622:
623: fflush(stdout);
624: }
625: }
626:
627: if (pthread_mutex_unlock(&((*s_etat_processus)
628: .mutex_pile_processus)) != 0)
629: {
630: (*s_etat_processus).erreur_systeme_processus_fils =
631: d_es_processus;
632: }
633:
634: envoi_signal_thread(NULL,
635: (*s_argument_thread).thread_pere,
636: rpl_siginject);
637:
638: if (pthread_mutex_lock(&((*s_etat_processus)
639: .mutex_pile_processus)) != 0)
640: {
641: (*s_etat_processus).erreur_systeme_processus_fils =
642: d_es_processus;
643: }
644:
645: break;
646: }
647:
648: case 0:
649: {
650: break;
651: }
652:
653: default:
654: {
655: (*s_etat_processus).erreur_systeme_processus_fils =
656: d_es_processus;
657: BUG(1, printf("Spurious interprocess data"));
658: }
659: }
660:
661: if (pthread_mutex_unlock(&((*s_etat_processus)
662: .mutex_pile_processus)) != 0)
663: {
664: (*s_etat_processus).erreur_systeme_processus_fils =
665: d_es_processus;
666: }
667: }
668: else
669: {
670: (*s_etat_processus).erreur_systeme = d_es_processus;
671: }
672:
673: if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0)
674: {
675: (*s_etat_processus).erreur_systeme = d_es_processus;
676: }
677:
678: if ((*s_argument_thread).thread_actif == d_faux)
679: {
680: if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
681: {
682: (*s_etat_processus).erreur_systeme = d_es_processus;
683: }
684:
685: pthread_join((*s_argument_thread).tid, NULL);
686: drapeau_fin_scrutation = (0 != 0);
687: }
688: else
689: {
690: if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
691: {
692: (*s_etat_processus).erreur_systeme = d_es_processus;
693: }
694:
695: drapeau_fin_scrutation = (0 == 0);
696: }
697: }
698: } while(drapeau_fin_scrutation);
699:
700: /*
701: * Le processus fils est terminé. On s'assure qu'il ne
702: * reste plus rien dans les tuyaux...
703: */
704:
705: if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)) != 0)
706: {
707: (*s_etat_processus).erreur_systeme_processus_fils =
708: d_es_processus;
709: }
710: else
711: {
712: if ((*s_etat_processus).debug == d_vrai)
713: if (((*s_etat_processus).type_debug &
714: d_debug_processus) != 0)
715: {
716: if ((*s_argument_thread).processus_detache == d_vrai)
717: {
718: if ((*s_etat_processus).langue == 'F')
719: {
720: printf("[%d] Surveillance des tuyaux du processus %d\n",
721: (int) getpid(), (int) (*s_argument_thread).pid);
722: fflush(stdout);
723: }
724: else
725: {
726: printf("[%d] Check remaining pipes of process %d\n",
727: (int) getpid(), (int) (*s_argument_thread).pid);
728: fflush(stdout);
729: }
730: }
731: else
732: {
733: if ((*s_etat_processus).langue == 'F')
734: {
735: printf("[%d] Surveillance des tuyaux du thread %llu\n",
736: (int) getpid(), (unsigned long long)
737: (*s_argument_thread).tid);
738: fflush(stdout);
739: }
740: else
741: {
742: printf("[%d] Check remaining pipes of thread %llu\n",
743: (int) getpid(), (unsigned long long)
744: (*s_argument_thread).tid);
745: fflush(stdout);
746: }
747: }
748: }
749:
750: l_element_courant = (struct_liste_chainee *)
751: (*s_etat_processus).l_base_pile_processus;
752:
753: if (drapeau_elements_traites == d_faux)
754: {
755: while(l_element_courant != NULL)
756: {
757: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
758: .donnee).objet)).thread).processus_detache
759: == d_vrai)
760: {
761: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
762: .donnee).objet)).thread).pid ==
763: (*s_argument_thread).pid)
764: {
765: while(read_atomic(s_etat_processus, (*s_argument_thread)
766: .pipe_nombre_elements_attente[0],
767: &caractere, sizeof(caractere)) ==
768: sizeof(caractere))
769: {
770: if (caractere == 0)
771: {
772: continue;
773: }
774:
775: if ((*s_etat_processus).debug == d_vrai)
776: if (((*s_etat_processus).type_debug &
777: d_debug_processus) != 0)
778: {
779: if ((*s_etat_processus).langue == 'F')
780: {
781: if (caractere == 1)
782: {
783: printf("[%d] Données en provenance du "
784: "processus %d (processus "
785: "arrêté)\n", (int) getpid(),
786: (int) (*s_argument_thread).pid);
787: }
788: else
789: {
790: printf("[%d] Interruption en "
791: "provenance du "
792: "processus %d (processus "
793: "arrêté)\n", (int) getpid(),
794: (int) (*s_argument_thread).pid);
795: }
796:
797: fflush(stdout);
798: }
799: else
800: {
801: if (caractere == 1)
802: {
803: printf("[%d] Data from process %d "
804: "(processus stopped)\n",
805: (int) getpid(),
806: (int) (*s_argument_thread).pid);
807: }
808: else
809: {
810: printf("[%d] Interrupt from process %d "
811: "(processus stopped)\n",
812: (int) getpid(),
813: (int) (*s_argument_thread).pid);
814: }
815:
816: fflush(stdout);
817: }
818: }
819:
820: if (pthread_mutex_lock(
821: &((*(*((struct_processus_fils *)
822: (*(*l_element_courant).donnee).objet))
823: .thread).mutex)) != 0)
824: {
825: (*s_etat_processus).erreur_systeme =
826: d_es_processus;
827: }
828:
829: if (caractere == 1)
830: {
831: (*(*((struct_processus_fils *)
832: (*(*l_element_courant).donnee).objet))
833: .thread).nombre_objets_dans_pipe++;
834: }
835: else
836: {
837: (*(*((struct_processus_fils *)
838: (*(*l_element_courant).donnee).objet))
839: .thread)
840: .nombre_interruptions_dans_pipe++;
841:
842: if (pthread_mutex_lock(&((*s_etat_processus)
843: .mutex_interruptions)) != 0)
844: {
845: (*s_etat_processus).erreur_systeme =
846: d_es_processus;
847: }
848:
849: (*s_etat_processus)
850: .nombre_interruptions_non_affectees++;
851:
852: if (pthread_mutex_unlock(&((*s_etat_processus)
853: .mutex_interruptions)) != 0)
854: {
855: (*s_etat_processus).erreur_systeme =
856: d_es_processus;
857: }
858: }
859:
860: if (pthread_mutex_unlock(
861: &((*(*((struct_processus_fils *)
862: (*(*l_element_courant).donnee).objet))
863: .thread).mutex)) != 0)
864: {
865: (*s_etat_processus).erreur_systeme =
866: d_es_processus;
867: }
868: }
869:
870: break;
871: }
872: }
873: else
874: {
875: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
876: .donnee).objet)).thread).tid ==
877: (*s_argument_thread).tid)
878: {
879: while(read_atomic(s_etat_processus, (*s_argument_thread)
880: .pipe_nombre_elements_attente[0],
881: &caractere, sizeof(caractere)) ==
882: sizeof(caractere))
883: {
884: if (caractere == 0)
885: {
886: continue;
887: }
888:
889: if ((*s_etat_processus).debug == d_vrai)
890: if (((*s_etat_processus).type_debug &
891: d_debug_processus) != 0)
892: {
893: if ((*s_etat_processus).langue == 'F')
894: {
895: if (caractere == 1)
896: {
897: printf("[%d] Données en provenance du "
898: "thread %llu (processus "
899: "arrêté)\n", (int) getpid(),
900: (unsigned long long)
901: (*s_argument_thread).tid);
902: }
903: else
904: {
905: printf("[%d] Interruption en "
906: "provenance du "
907: "thread %llu (processus "
908: "arrêté)\n", (int) getpid(),
909: (unsigned long long)
910: (*s_argument_thread).tid);
911: }
912:
913: fflush(stdout);
914: }
915: else
916: {
917: if (caractere == 1)
918: {
919: printf("[%d] Data from thread %llu "
920: "(processus stopped)\n",
921: (int) getpid(),
922: (unsigned long long)
923: (*s_argument_thread).pid);
924: }
925: else
926: {
927: printf("[%d] Interrupt from thread "
928: "%llu (processus stopped)\n",
929: (int) getpid(),
930: (unsigned long long)
931: (*s_argument_thread).pid);
932: }
933:
934: fflush(stdout);
935: }
936: }
937:
938: if (pthread_mutex_lock(
939: &((*(*((struct_processus_fils *)
940: (*(*l_element_courant).donnee).objet))
941: .thread).mutex)) != 0)
942: {
943: (*s_etat_processus).erreur_systeme =
944: d_es_processus;
945: }
946:
947: if (caractere == 1)
948: {
949: (*(*((struct_processus_fils *)
950: (*(*l_element_courant).donnee).objet))
951: .thread).nombre_objets_dans_pipe++;
952: }
953: else
954: {
955: (*(*((struct_processus_fils *)
956: (*(*l_element_courant).donnee).objet))
957: .thread)
958: .nombre_interruptions_dans_pipe++;
959:
960: if (pthread_mutex_lock(&((*s_etat_processus)
961: .mutex_interruptions)) != 0)
962: {
963: (*s_etat_processus).erreur_systeme =
964: d_es_processus;
965: }
966:
967: (*s_etat_processus)
968: .nombre_interruptions_non_affectees++;
969:
970: if (pthread_mutex_unlock(&((*s_etat_processus)
971: .mutex_interruptions)) != 0)
972: {
973: (*s_etat_processus).erreur_systeme =
974: d_es_processus;
975: }
976: }
977:
978: if (pthread_mutex_unlock(
979: &((*(*((struct_processus_fils *)
980: (*(*l_element_courant).donnee).objet))
981: .thread).mutex)) != 0)
982: {
983: (*s_etat_processus).erreur_systeme =
984: d_es_processus;
985: }
986: }
987:
988: break;
989: }
990: }
991:
992: l_element_courant = (*l_element_courant).suivant;
993: }
994: }
995:
996: if (pthread_mutex_unlock(&((*s_etat_processus).mutex_pile_processus))
997: != 0)
998: {
999: (*s_etat_processus).erreur_systeme_processus_fils =
1000: d_es_processus;
1001: }
1002: }
1003:
1004: /*
1005: * Traitement des interruptions et des erreurs.
1006: */
1007:
1008: if ((*s_etat_processus).debug == d_vrai)
1009: if (((*s_etat_processus).type_debug &
1010: d_debug_processus) != 0)
1011: {
1012: if ((*s_argument_thread).processus_detache == d_vrai)
1013: {
1014: if ((*s_etat_processus).langue == 'F')
1015: {
1016: printf("[%d] Récupération des erreurs du processus "
1017: "%d\n", (int) getpid(),
1018: (int) (*s_argument_thread).pid);
1019: fflush(stdout);
1020: }
1021: else
1022: {
1023: printf("[%d] Check errors from process %d\n", (int) getpid(),
1024: (int) (*s_argument_thread).pid);
1025: fflush(stdout);
1026: }
1027: }
1028: else
1029: {
1030: if ((*s_etat_processus).langue == 'F')
1031: {
1032: printf("[%d] Récupération des erreurs du thread "
1033: "%llu\n", (int) getpid(), (unsigned long long)
1034: (*s_argument_thread).tid);
1035: fflush(stdout);
1036: }
1037: else
1038: {
1039: printf("[%d] Check errors from process %llu\n", (int) getpid(),
1040: (unsigned long long) (*s_argument_thread).tid);
1041: fflush(stdout);
1042: }
1043: }
1044: }
1045:
1046: attente.tv_sec = 0;
1047: attente.tv_nsec = GRANULARITE_us * 1000;
1048:
1049: while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0],
1050: &tampon_erreur_execution,
1051: sizeof((*s_etat_processus).erreur_execution_processus_fils)) !=
1052: sizeof((*s_etat_processus).erreur_execution_processus_fils))
1053: {
1054: nanosleep(&attente, NULL);
1055: INCR_GRANULARITE(attente.tv_nsec);
1056: }
1057:
1058: attente.tv_sec = 0;
1059: attente.tv_nsec = GRANULARITE_us * 1000;
1060:
1061: while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0],
1062: &tampon_erreur_systeme,
1063: sizeof((*s_etat_processus).erreur_systeme_processus_fils)) !=
1064: sizeof((*s_etat_processus).erreur_systeme_processus_fils))
1065: {
1066: nanosleep(&attente, NULL);
1067: INCR_GRANULARITE(attente.tv_nsec);
1068: }
1069:
1070: attente.tv_sec = 0;
1071: attente.tv_nsec = GRANULARITE_us * 1000;
1072:
1073: while(read_atomic(s_etat_processus, (*s_argument_thread).pipe_erreurs[0],
1074: &pid_erreur,
1075: sizeof((*s_etat_processus).pid_erreur_processus_fils)) !=
1076: sizeof((*s_etat_processus).pid_erreur_processus_fils))
1077: {
1078: nanosleep(&attente, NULL);
1079: INCR_GRANULARITE(attente.tv_nsec);
1080: }
1081:
1082: /*
1083: * Retrait du processus de la pile des processus
1084: */
1085:
1086: if (close((*s_argument_thread).pipe_erreurs[0]) != 0)
1087: {
1088: (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus;
1089: }
1090:
1091: if (pthread_mutex_lock(&((*s_etat_processus).mutex_pile_processus)) != 0)
1092: {
1093: (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus;
1094: }
1095: else
1096: {
1097: (*s_etat_processus).erreur_execution_processus_fils =
1098: tampon_erreur_execution;
1099: (*s_etat_processus).erreur_systeme_processus_fils =
1100: tampon_erreur_systeme;
1101: (*s_etat_processus).pid_erreur_processus_fils = pid_erreur;
1102:
1103: /*
1104: * Si une erreur est déclarée dans le processus fils, le message
1105: * d'erreur a déjà été affiché.
1106: */
1107:
1108: if (((*s_etat_processus).erreur_systeme_processus_fils != d_es) ||
1109: ((*s_etat_processus).erreur_execution_processus_fils != d_ex))
1110: {
1111: (*s_etat_processus).erreur_processus_fils = d_vrai;
1112: (*s_etat_processus).invalidation_message_erreur = d_vrai;
1113: }
1114:
1115: do
1116: {
1117: drapeau_fin = d_faux;
1118: l_element_courant = (struct_liste_chainee *)
1119: (*s_etat_processus).l_base_pile_processus;
1120: nombre_donnees = -1;
1121:
1122: while(l_element_courant != NULL)
1123: {
1124: if ((*s_argument_thread).processus_detache == d_vrai)
1125: {
1126: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
1127: .donnee).objet)).thread).processus_detache
1128: == d_vrai)
1129: {
1130: if ((*s_argument_thread).pid ==
1131: (*(*((struct_processus_fils *)
1132: (*(*l_element_courant)
1133: .donnee).objet)).thread).pid)
1134: {
1135: if (pthread_mutex_lock(
1136: &((*(*((struct_processus_fils *)
1137: (*(*l_element_courant).donnee).objet))
1138: .thread).mutex)) != 0)
1139: {
1140: (*s_etat_processus).erreur_systeme =
1141: d_es_processus;
1142: }
1143:
1144: nombre_donnees = (*(*((struct_processus_fils *)
1145: (*(*l_element_courant).donnee).objet))
1146: .thread).nombre_objets_dans_pipe +
1147: (*(*((struct_processus_fils *)
1148: (*(*l_element_courant).donnee).objet))
1149: .thread).nombre_interruptions_dans_pipe;
1150:
1151: if (pthread_mutex_unlock(
1152: &((*(*((struct_processus_fils *)
1153: (*(*l_element_courant).donnee).objet))
1154: .thread).mutex)) != 0)
1155: {
1156: (*s_etat_processus).erreur_systeme =
1157: d_es_processus;
1158: }
1159:
1160: break;
1161: }
1162: }
1163: }
1164: else
1165: {
1166: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
1167: .donnee).objet)).thread).processus_detache
1168: == d_faux)
1169: {
1170: if (pthread_equal((*s_argument_thread).tid,
1171: (*(*((struct_processus_fils *)
1172: (*(*l_element_courant)
1173: .donnee).objet)).thread).tid) != 0)
1174: {
1175: if (pthread_mutex_lock(
1176: &((*(*((struct_processus_fils *)
1177: (*(*l_element_courant).donnee).objet))
1178: .thread).mutex)) != 0)
1179: {
1180: (*s_etat_processus).erreur_systeme =
1181: d_es_processus;
1182: }
1183:
1184: nombre_donnees = (*(*((struct_processus_fils *)
1185: (*(*l_element_courant).donnee).objet))
1186: .thread).nombre_objets_dans_pipe +
1187: (*(*((struct_processus_fils *)
1188: (*(*l_element_courant).donnee).objet))
1189: .thread).nombre_interruptions_dans_pipe;
1190:
1191: if (pthread_mutex_unlock(
1192: &((*(*((struct_processus_fils *)
1193: (*(*l_element_courant).donnee).objet))
1194: .thread).mutex)) != 0)
1195: {
1196: (*s_etat_processus).erreur_systeme =
1197: d_es_processus;
1198: }
1199:
1200: break;
1201: }
1202: }
1203: }
1204:
1205: l_element_courant = (*l_element_courant).suivant;
1206: }
1207:
1208: if (nombre_donnees == -1)
1209: {
1210: (*s_etat_processus).erreur_systeme_processus_fils =
1211: d_es_processus;
1212: drapeau_fin = d_vrai;
1213: BUG(1, printf("Process or thread not found"));
1214: }
1215: else if ((nombre_donnees == 0) ||
1216: ((*s_etat_processus).var_volatile_requete_arret == -1))
1217: {
1218: if ((*s_etat_processus).debug == d_vrai)
1219: if (((*s_etat_processus).type_debug &
1220: d_debug_processus) != 0)
1221: {
1222: if ((*s_argument_thread).processus_detache == d_vrai)
1223: {
1224: if ((*s_etat_processus).langue == 'F')
1225: {
1226: printf("[%d] Fermeture des tuyaux du processus "
1227: "%d\n", (int) getpid(), (int)
1228: (*s_argument_thread).pid);
1229: fflush(stdout);
1230: }
1231: else
1232: {
1233: printf("[%d] Close remaining pipes "
1234: "of process %d\n", (int) getpid(),
1235: (int) (*s_argument_thread).pid);
1236: fflush(stdout);
1237: }
1238: }
1239: else
1240: {
1241: if ((*s_etat_processus).langue == 'F')
1242: {
1243: printf("[%d] Fermeture des tuyaux du thread "
1244: "%llu\n", (int) getpid(),
1245: (unsigned long long)
1246: (*s_argument_thread).tid);
1247: fflush(stdout);
1248: }
1249: else
1250: {
1251: printf("[%d] Close remaining pipes "
1252: "of thread %llu\n", (int) getpid(),
1253: (unsigned long long) (*s_argument_thread)
1254: .tid);
1255: fflush(stdout);
1256: }
1257: }
1258: }
1259:
1260: if (close((*s_argument_thread).pipe_objets[0]) != 0)
1261: {
1262: (*s_etat_processus).erreur_systeme_processus_fils =
1263: d_es_processus;
1264: }
1265:
1266: if (close((*s_argument_thread).pipe_acquittement[1]) != 0)
1267: {
1268: (*s_etat_processus).erreur_systeme_processus_fils =
1269: d_es_processus;
1270: }
1271:
1272: if (close((*s_argument_thread).pipe_injections[1]) != 0)
1273: {
1274: (*s_etat_processus).erreur_systeme_processus_fils =
1275: d_es_processus;
1276: }
1277:
1278: if (close((*s_argument_thread).pipe_nombre_injections[1]) != 0)
1279: {
1280: (*s_etat_processus).erreur_systeme_processus_fils =
1281: d_es_processus;
1282: }
1283:
1284: if (close((*s_argument_thread)
1285: .pipe_nombre_elements_attente[0]) != 0)
1286: {
1287: (*s_etat_processus).erreur_systeme_processus_fils =
1288: d_es_processus;
1289: }
1290:
1291: if (close((*s_argument_thread)
1292: .pipe_interruptions[0]) != 0)
1293: {
1294: (*s_etat_processus).erreur_systeme_processus_fils =
1295: d_es_processus;
1296: }
1297:
1298: drapeau_fin = d_vrai;
1299: }
1300: else
1301: {
1302: if (pthread_mutex_unlock(&((*s_etat_processus)
1303: .mutex_pile_processus)) != 0)
1304: {
1305: (*s_etat_processus).erreur_systeme_processus_fils =
1306: d_es_processus;
1307: drapeau_fin = d_vrai;
1308: }
1309:
1310: nanosleep(&attente, NULL);
1311: INCR_GRANULARITE(attente.tv_nsec);
1312:
1313: if (pthread_mutex_lock(&((*s_etat_processus)
1314: .mutex_pile_processus)) != 0)
1315: {
1316: (*s_etat_processus).erreur_systeme_processus_fils =
1317: d_es_processus;
1318: drapeau_fin = d_vrai;
1319: }
1320: }
1321: } while(drapeau_fin == d_faux);
1322:
1323: l_element_courant = (struct_liste_chainee *)
1324: (*s_etat_processus).l_base_pile_processus;
1325: l_element_precedent = NULL;
1326:
1327: while(l_element_courant != NULL)
1328: {
1329: drapeau = d_faux;
1330:
1331: if ((*s_argument_thread).processus_detache ==
1332: (*(*((struct_processus_fils *) (*(*l_element_courant)
1333: .donnee).objet)).thread).processus_detache)
1334: {
1335: if ((*s_argument_thread).processus_detache == d_vrai)
1336: {
1337: if ((*(*((struct_processus_fils *)
1338: (*(*l_element_courant).donnee).objet))
1339: .thread).pid == (*s_argument_thread).pid)
1340: {
1341: drapeau = d_vrai;
1342: }
1343: else
1344: {
1345: drapeau = d_faux;
1346: }
1347: }
1348: else
1349: {
1350: if (pthread_equal((*(*((struct_processus_fils *)
1351: (*(*l_element_courant).donnee).objet))
1352: .thread).tid, (*s_argument_thread).tid) != 0)
1353: {
1354: drapeau = d_vrai;
1355: }
1356: else
1357: {
1358: drapeau = d_faux;
1359: }
1360: }
1361: }
1362: else
1363: {
1364: drapeau = d_faux;
1365: }
1366:
1367: if (drapeau == d_vrai)
1368: {
1369: if (l_element_precedent == NULL)
1370: {
1371: (*s_etat_processus).l_base_pile_processus =
1372: (*l_element_courant).suivant;
1373: }
1374: else
1375: {
1376: (*l_element_precedent).suivant =
1377: (*l_element_courant).suivant;
1378: }
1379:
1380: liberation(s_etat_processus, (*l_element_courant).donnee);
1381: free(l_element_courant);
1382:
1383: break;
1384: }
1385: else
1386: {
1387: l_element_precedent = l_element_courant;
1388: l_element_courant = (*l_element_courant).suivant;
1389: }
1390: }
1391:
1392: if ((*s_etat_processus).debug == d_vrai)
1393: if (((*s_etat_processus).type_debug &
1394: d_debug_processus) != 0)
1395: {
1396: if ((*s_argument_thread).processus_detache == d_vrai)
1397: {
1398: if ((*s_etat_processus).langue == 'F')
1399: {
1400: printf("[%d] Arrêt du thread de surveillance du"
1401: " processus %d\n", (int) getpid(),
1402: (int) (*s_argument_thread).pid);
1403: }
1404: else
1405: {
1406: printf("[%d] Stop monitoring of process %d", (int) getpid(),
1407: (int) (*s_argument_thread).pid);
1408: }
1409: }
1410: else
1411: {
1412: if ((*s_etat_processus).langue == 'F')
1413: {
1414: printf("[%d] Arrêt du thread de surveillance du"
1415: " thread %llu\n", (int) getpid(),
1416: (unsigned long long) (*s_argument_thread)
1417: .tid);
1418: }
1419: else
1420: {
1421: printf("[%d] Stop monitoring of thread %llu",
1422: (int) getpid(),
1423: (unsigned long long) (*s_argument_thread)
1424: .tid);
1425: }
1426: }
1427:
1428: fflush(stdout);
1429: }
1430:
1431: retrait_thread_surveillance(s_etat_processus, s_argument_thread);
1432: nombre_thread_surveillance_processus--;
1433:
1434: if (pthread_mutex_unlock(&((*s_etat_processus)
1435: .mutex_pile_processus)) != 0)
1436: {
1437: (*s_etat_processus).erreur_systeme_processus_fils = d_es_processus;
1438: }
1439: }
1440:
1441: pthread_exit(NULL);
1442: }
1443:
1444:
1445: /*
1446: ================================================================================
1447: Fonction d'écriture dans un pipe
1448: ================================================================================
1449: Entrées : pointeur sur une structure de description du processus,
1450: numéro du pipe et objet à écrire
1451: --------------------------------------------------------------------------------
1452: Sorties :
1453: --------------------------------------------------------------------------------
1454: Effets de bord : néant
1455: ================================================================================
1456: */
1457:
1458: logical1
1459: ecriture_pipe(struct_processus *s_etat_processus, int pipe,
1460: struct_objet *s_objet)
1461: {
1462: struct_liste_chainee *l_element_courant;
1463:
1464: struct timespec attente;
1465:
1466: integer8 i;
1467: integer8 j;
1468:
1469: size_t longueur;
1470: ssize_t longueur_ecriture;
1471:
1472: if ((*s_objet).type == INT)
1473: {
1474: attente.tv_sec = 0;
1475: attente.tv_nsec = GRANULARITE_us * 1000;
1476:
1477: while((longueur_ecriture = write_atomic(s_etat_processus,
1478: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
1479: sizeof((*s_objet).type))
1480: {
1481: if (longueur_ecriture == -1)
1482: {
1483: return(d_erreur);
1484: }
1485:
1486: nanosleep(&attente, NULL);
1487: INCR_GRANULARITE(attente.tv_nsec);
1488: }
1489:
1490: attente.tv_sec = 0;
1491: attente.tv_nsec = GRANULARITE_us * 1000;
1492:
1493: while((longueur_ecriture = write_atomic(s_etat_processus,
1494: pipe, (integer8 *)
1495: (*s_objet).objet, sizeof(integer8))) != sizeof(integer8))
1496: {
1497: if (longueur_ecriture == -1)
1498: {
1499: return(d_erreur);
1500: }
1501:
1502: nanosleep(&attente, NULL);
1503: INCR_GRANULARITE(attente.tv_nsec);
1504: }
1505: }
1506: else if ((*s_objet).type == REL)
1507: {
1508: attente.tv_sec = 0;
1509: attente.tv_nsec = GRANULARITE_us * 1000;
1510:
1511: while((longueur_ecriture = write_atomic(s_etat_processus,
1512: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
1513: sizeof((*s_objet).type))
1514: {
1515: if (longueur_ecriture == -1)
1516: {
1517: return(d_erreur);
1518: }
1519:
1520: nanosleep(&attente, NULL);
1521: INCR_GRANULARITE(attente.tv_nsec);
1522: }
1523:
1524: attente.tv_sec = 0;
1525: attente.tv_nsec = GRANULARITE_us * 1000;
1526:
1527: while((longueur_ecriture = write_atomic(s_etat_processus,
1528: pipe, (real8 *) (*s_objet).objet, sizeof(real8))) !=
1529: sizeof(real8))
1530: {
1531: if (longueur_ecriture == -1)
1532: {
1533: return(d_erreur);
1534: }
1535:
1536: nanosleep(&attente, NULL);
1537: INCR_GRANULARITE(attente.tv_nsec);
1538: }
1539: }
1540: else if ((*s_objet).type == CPL)
1541: {
1542: attente.tv_sec = 0;
1543: attente.tv_nsec = GRANULARITE_us * 1000;
1544:
1545: while((longueur_ecriture = write_atomic(s_etat_processus,
1546: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
1547: sizeof((*s_objet).type))
1548: {
1549: if (longueur_ecriture == -1)
1550: {
1551: return(d_erreur);
1552: }
1553:
1554: nanosleep(&attente, NULL);
1555: INCR_GRANULARITE(attente.tv_nsec);
1556: }
1557:
1558: attente.tv_sec = 0;
1559: attente.tv_nsec = GRANULARITE_us * 1000;
1560:
1561: while((longueur_ecriture = write_atomic(s_etat_processus,
1562: pipe, (real8 *) (*s_objet).objet, sizeof(complex16)))
1563: != sizeof(complex16))
1564: {
1565: if (longueur_ecriture == -1)
1566: {
1567: return(d_erreur);
1568: }
1569:
1570: nanosleep(&attente, NULL);
1571: INCR_GRANULARITE(attente.tv_nsec);
1572: }
1573: }
1574: else if ((*s_objet).type == VIN)
1575: {
1576: attente.tv_sec = 0;
1577: attente.tv_nsec = GRANULARITE_us * 1000;
1578:
1579: while((longueur_ecriture = write_atomic(s_etat_processus,
1580: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
1581: sizeof((*s_objet).type))
1582: {
1583: if (longueur_ecriture == -1)
1584: {
1585: return(d_erreur);
1586: }
1587:
1588: nanosleep(&attente, NULL);
1589: INCR_GRANULARITE(attente.tv_nsec);
1590: }
1591:
1592: attente.tv_sec = 0;
1593: attente.tv_nsec = GRANULARITE_us * 1000;
1594:
1595: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1596: &((*((struct_vecteur *) (*s_objet).objet))
1597: .taille), sizeof(integer8))) != sizeof(integer8))
1598: {
1599: if (longueur_ecriture == -1)
1600: {
1601: return(d_erreur);
1602: }
1603:
1604: nanosleep(&attente, NULL);
1605: INCR_GRANULARITE(attente.tv_nsec);
1606: }
1607:
1608: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
1609: {
1610: attente.tv_sec = 0;
1611: attente.tv_nsec = GRANULARITE_us * 1000;
1612:
1613: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1614: &(((integer8 *) (*((struct_vecteur *) (*s_objet).objet))
1615: .tableau)[i]), sizeof(integer8))) != sizeof(integer8))
1616: {
1617: if (longueur_ecriture == -1)
1618: {
1619: return(d_erreur);
1620: }
1621:
1622: nanosleep(&attente, NULL);
1623: INCR_GRANULARITE(attente.tv_nsec);
1624: }
1625: }
1626: }
1627: else if ((*s_objet).type == VRL)
1628: {
1629: attente.tv_sec = 0;
1630: attente.tv_nsec = GRANULARITE_us * 1000;
1631:
1632: while((longueur_ecriture = write_atomic(s_etat_processus,
1633: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
1634: sizeof((*s_objet).type))
1635: {
1636: if (longueur_ecriture == -1)
1637: {
1638: return(d_erreur);
1639: }
1640:
1641: nanosleep(&attente, NULL);
1642: INCR_GRANULARITE(attente.tv_nsec);
1643: }
1644:
1645: attente.tv_sec = 0;
1646: attente.tv_nsec = GRANULARITE_us * 1000;
1647:
1648: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1649: &((*((struct_vecteur *) (*s_objet).objet))
1650: .taille), sizeof(integer8))) != sizeof(integer8))
1651: {
1652: if (longueur_ecriture == -1)
1653: {
1654: return(d_erreur);
1655: }
1656:
1657: nanosleep(&attente, NULL);
1658: INCR_GRANULARITE(attente.tv_nsec);
1659: }
1660:
1661: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
1662: {
1663: attente.tv_sec = 0;
1664: attente.tv_nsec = GRANULARITE_us * 1000;
1665:
1666: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1667: &(((real8 *) (*((struct_vecteur *) (*s_objet).objet))
1668: .tableau)[i]), sizeof(real8))) != sizeof(real8))
1669: {
1670: if (longueur_ecriture == -1)
1671: {
1672: return(d_erreur);
1673: }
1674:
1675: nanosleep(&attente, NULL);
1676: INCR_GRANULARITE(attente.tv_nsec);
1677: }
1678: }
1679: }
1680: else if ((*s_objet).type == VCX)
1681: {
1682: attente.tv_sec = 0;
1683: attente.tv_nsec = GRANULARITE_us * 1000;
1684:
1685: while((longueur_ecriture = write_atomic(s_etat_processus,
1686: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
1687: sizeof((*s_objet).type))
1688: {
1689: if (longueur_ecriture == -1)
1690: {
1691: return(d_erreur);
1692: }
1693:
1694: nanosleep(&attente, NULL);
1695: INCR_GRANULARITE(attente.tv_nsec);
1696: }
1697:
1698: attente.tv_sec = 0;
1699: attente.tv_nsec = GRANULARITE_us * 1000;
1700:
1701: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1702: &((*((struct_vecteur *) (*s_objet).objet))
1703: .taille), sizeof(integer8))) != sizeof(integer8))
1704: {
1705: if (longueur_ecriture == -1)
1706: {
1707: return(d_erreur);
1708: }
1709:
1710: nanosleep(&attente, NULL);
1711: INCR_GRANULARITE(attente.tv_nsec);
1712: }
1713:
1714: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
1715: {
1716: attente.tv_sec = 0;
1717: attente.tv_nsec = GRANULARITE_us * 1000;
1718:
1719: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1720: &(((complex16 *) (*((struct_vecteur *) (*s_objet).objet))
1721: .tableau)[i]), sizeof(complex16))) != sizeof(complex16))
1722: {
1723: if (longueur_ecriture == -1)
1724: {
1725: return(d_erreur);
1726: }
1727:
1728: nanosleep(&attente, NULL);
1729: INCR_GRANULARITE(attente.tv_nsec);
1730: }
1731: }
1732: }
1733: else if ((*s_objet).type == MIN)
1734: {
1735: attente.tv_sec = 0;
1736: attente.tv_nsec = GRANULARITE_us * 1000;
1737:
1738: while((longueur_ecriture = write_atomic(s_etat_processus,
1739: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
1740: sizeof((*s_objet).type))
1741: {
1742: if (longueur_ecriture == -1)
1743: {
1744: return(d_erreur);
1745: }
1746:
1747: nanosleep(&attente, NULL);
1748: INCR_GRANULARITE(attente.tv_nsec);
1749: }
1750:
1751: attente.tv_sec = 0;
1752: attente.tv_nsec = GRANULARITE_us * 1000;
1753:
1754: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1755: &((*((struct_matrice *) (*s_objet).objet)).nombre_lignes),
1756: sizeof(integer8))) != sizeof(integer8))
1757: {
1758: if (longueur_ecriture == -1)
1759: {
1760: return(d_erreur);
1761: }
1762:
1763: nanosleep(&attente, NULL);
1764: INCR_GRANULARITE(attente.tv_nsec);
1765: }
1766:
1767: attente.tv_sec = 0;
1768: attente.tv_nsec = GRANULARITE_us * 1000;
1769:
1770: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1771: &((*((struct_matrice *) (*s_objet).objet)).nombre_colonnes),
1772: sizeof(integer8))) != sizeof(integer8))
1773: {
1774: if (longueur_ecriture == -1)
1775: {
1776: return(d_erreur);
1777: }
1778:
1779: nanosleep(&attente, NULL);
1780: INCR_GRANULARITE(attente.tv_nsec);
1781: }
1782:
1783: for(i = 0; i < (*((struct_matrice *)
1784: (*s_objet).objet)).nombre_lignes; i++)
1785: {
1786: for(j = 0; j < (*((struct_matrice *)
1787: (*s_objet).objet)).nombre_colonnes; j++)
1788: {
1789: attente.tv_sec = 0;
1790: attente.tv_nsec = GRANULARITE_us * 1000;
1791:
1792: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1793: &(((integer8 **) (*((struct_matrice *)
1794: (*s_objet).objet)).tableau)[i][j]),
1795: sizeof(integer8))) != sizeof(integer8))
1796: {
1797: if (longueur_ecriture == -1)
1798: {
1799: return(d_erreur);
1800: }
1801:
1802: nanosleep(&attente, NULL);
1803: INCR_GRANULARITE(attente.tv_nsec);
1804: }
1805: }
1806: }
1807: }
1808: else if ((*s_objet).type == MRL)
1809: {
1810: attente.tv_sec = 0;
1811: attente.tv_nsec = GRANULARITE_us * 1000;
1812:
1813: while((longueur_ecriture = write_atomic(s_etat_processus,
1814: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
1815: sizeof((*s_objet).type))
1816: {
1817: if (longueur_ecriture == -1)
1818: {
1819: return(d_erreur);
1820: }
1821:
1822: nanosleep(&attente, NULL);
1823: INCR_GRANULARITE(attente.tv_nsec);
1824: }
1825:
1826: attente.tv_sec = 0;
1827: attente.tv_nsec = GRANULARITE_us * 1000;
1828:
1829: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1830: &((*((struct_matrice *) (*s_objet).objet)).nombre_lignes),
1831: sizeof(integer8))) != sizeof(integer8))
1832: {
1833: if (longueur_ecriture == -1)
1834: {
1835: return(d_erreur);
1836: }
1837:
1838: nanosleep(&attente, NULL);
1839: INCR_GRANULARITE(attente.tv_nsec);
1840: }
1841:
1842: attente.tv_sec = 0;
1843: attente.tv_nsec = GRANULARITE_us * 1000;
1844:
1845: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1846: &((*((struct_matrice *) (*s_objet).objet)).nombre_colonnes),
1847: sizeof(integer8))) != sizeof(integer8))
1848: {
1849: if (longueur_ecriture == -1)
1850: {
1851: return(d_erreur);
1852: }
1853:
1854: nanosleep(&attente, NULL);
1855: INCR_GRANULARITE(attente.tv_nsec);
1856: }
1857:
1858: for(i = 0; i < (*((struct_matrice *)
1859: (*s_objet).objet)).nombre_lignes; i++)
1860: {
1861: for(j = 0; j < (*((struct_matrice *)
1862: (*s_objet).objet)).nombre_colonnes; j++)
1863: {
1864: attente.tv_sec = 0;
1865: attente.tv_nsec = GRANULARITE_us * 1000;
1866:
1867: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1868: &(((real8 **) (*((struct_matrice *)
1869: (*s_objet).objet)).tableau)[i][j]),
1870: sizeof(real8))) != sizeof(real8))
1871: {
1872: if (longueur_ecriture == -1)
1873: {
1874: return(d_erreur);
1875: }
1876:
1877: nanosleep(&attente, NULL);
1878: INCR_GRANULARITE(attente.tv_nsec);
1879: }
1880: }
1881: }
1882: }
1883: else if ((*s_objet).type == MCX)
1884: {
1885: attente.tv_sec = 0;
1886: attente.tv_nsec = GRANULARITE_us * 1000;
1887:
1888: while((longueur_ecriture = write_atomic(s_etat_processus,
1889: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
1890: sizeof((*s_objet).type))
1891: {
1892: if (longueur_ecriture == -1)
1893: {
1894: return(d_erreur);
1895: }
1896:
1897: nanosleep(&attente, NULL);
1898: INCR_GRANULARITE(attente.tv_nsec);
1899: }
1900:
1901: attente.tv_sec = 0;
1902: attente.tv_nsec = GRANULARITE_us * 1000;
1903:
1904: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1905: &((*((struct_matrice *) (*s_objet).objet)).nombre_lignes),
1906: sizeof(integer8))) != sizeof(integer8))
1907: {
1908: if (longueur_ecriture == -1)
1909: {
1910: return(d_erreur);
1911: }
1912:
1913: nanosleep(&attente, NULL);
1914: INCR_GRANULARITE(attente.tv_nsec);
1915: }
1916:
1917: attente.tv_sec = 0;
1918: attente.tv_nsec = GRANULARITE_us * 1000;
1919:
1920: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1921: &((*((struct_matrice *) (*s_objet).objet)).nombre_colonnes),
1922: sizeof(integer8))) != sizeof(integer8))
1923: {
1924: if (longueur_ecriture == -1)
1925: {
1926: return(d_erreur);
1927: }
1928:
1929: nanosleep(&attente, NULL);
1930: INCR_GRANULARITE(attente.tv_nsec);
1931: }
1932:
1933: for(i = 0; i < (*((struct_matrice *)
1934: (*s_objet).objet)).nombre_lignes; i++)
1935: {
1936: for(j = 0; j < (*((struct_matrice *)
1937: (*s_objet).objet)).nombre_colonnes; j++)
1938: {
1939: attente.tv_sec = 0;
1940: attente.tv_nsec = GRANULARITE_us * 1000;
1941:
1942: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1943: &(((complex16 **) (*((struct_matrice *)
1944: (*s_objet).objet)).tableau)[i][j]),
1945: sizeof(complex16))) != sizeof(complex16))
1946: {
1947: if (longueur_ecriture == -1)
1948: {
1949: return(d_erreur);
1950: }
1951:
1952: nanosleep(&attente, NULL);
1953: INCR_GRANULARITE(attente.tv_nsec);
1954: }
1955: }
1956: }
1957: }
1958: else if ((*s_objet).type == BIN)
1959: {
1960: attente.tv_sec = 0;
1961: attente.tv_nsec = GRANULARITE_us * 1000;
1962:
1963: while((longueur_ecriture = write_atomic(s_etat_processus,
1964: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
1965: sizeof((*s_objet).type))
1966: {
1967: if (longueur_ecriture == -1)
1968: {
1969: return(d_erreur);
1970: }
1971:
1972: nanosleep(&attente, NULL);
1973: INCR_GRANULARITE(attente.tv_nsec);
1974: }
1975:
1976: attente.tv_sec = 0;
1977: attente.tv_nsec = GRANULARITE_us * 1000;
1978:
1979: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
1980: (integer8 *) (*s_objet).objet,
1981: sizeof(integer8))) != sizeof(integer8))
1982: {
1983: if (longueur_ecriture == -1)
1984: {
1985: return(d_erreur);
1986: }
1987:
1988: nanosleep(&attente, NULL);
1989: INCR_GRANULARITE(attente.tv_nsec);
1990: }
1991: }
1992: else if ((*s_objet).type == NOM)
1993: {
1994: attente.tv_sec = 0;
1995: attente.tv_nsec = GRANULARITE_us * 1000;
1996:
1997: while((longueur_ecriture = write_atomic(s_etat_processus,
1998: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
1999: sizeof((*s_objet).type))
2000: {
2001: if (longueur_ecriture == -1)
2002: {
2003: return(d_erreur);
2004: }
2005:
2006: nanosleep(&attente, NULL);
2007: INCR_GRANULARITE(attente.tv_nsec);
2008: }
2009:
2010: longueur = strlen((*((struct_nom *) (*s_objet).objet)).nom) + 1;
2011:
2012: attente.tv_sec = 0;
2013: attente.tv_nsec = GRANULARITE_us * 1000;
2014:
2015: while((longueur_ecriture = write_atomic(s_etat_processus,
2016: pipe, &longueur, sizeof(size_t))) != sizeof(size_t))
2017: {
2018: if (longueur_ecriture == -1)
2019: {
2020: return(d_erreur);
2021: }
2022:
2023: nanosleep(&attente, NULL);
2024: INCR_GRANULARITE(attente.tv_nsec);
2025: }
2026:
2027: attente.tv_sec = 0;
2028: attente.tv_nsec = GRANULARITE_us * 1000;
2029:
2030: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
2031: (*((struct_nom *) (*s_objet).objet)).nom,
2032: longueur)) != (ssize_t) longueur)
2033: {
2034: if (longueur_ecriture == -1)
2035: {
2036: return(d_erreur);
2037: }
2038:
2039: nanosleep(&attente, NULL);
2040: INCR_GRANULARITE(attente.tv_nsec);
2041: }
2042:
2043: attente.tv_sec = 0;
2044: attente.tv_nsec = GRANULARITE_us * 1000;
2045:
2046: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
2047: &((*((struct_nom *) (*s_objet).objet))
2048: .symbole), sizeof(logical1))) != sizeof(logical1))
2049: {
2050: if (longueur_ecriture == -1)
2051: {
2052: return(d_erreur);
2053: }
2054:
2055: nanosleep(&attente, NULL);
2056: INCR_GRANULARITE(attente.tv_nsec);
2057: }
2058: }
2059: else if ((*s_objet).type == FCT)
2060: {
2061: attente.tv_sec = 0;
2062: attente.tv_nsec = GRANULARITE_us * 1000;
2063:
2064: while((longueur_ecriture = write_atomic(s_etat_processus,
2065: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
2066: sizeof((*s_objet).type))
2067: {
2068: if (longueur_ecriture == -1)
2069: {
2070: return(d_erreur);
2071: }
2072:
2073: nanosleep(&attente, NULL);
2074: INCR_GRANULARITE(attente.tv_nsec);
2075: }
2076:
2077: longueur = strlen((*((struct_fonction *)
2078: (*s_objet).objet)).nom_fonction) + 1;
2079:
2080: attente.tv_sec = 0;
2081: attente.tv_nsec = GRANULARITE_us * 1000;
2082:
2083: while((longueur_ecriture = write_atomic(s_etat_processus,
2084: pipe, &longueur, sizeof(size_t))) != sizeof(size_t))
2085: {
2086: if (longueur_ecriture == -1)
2087: {
2088: return(d_erreur);
2089: }
2090:
2091: nanosleep(&attente, NULL);
2092: INCR_GRANULARITE(attente.tv_nsec);
2093: }
2094:
2095: attente.tv_sec = 0;
2096: attente.tv_nsec = GRANULARITE_us * 1000;
2097:
2098: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
2099: (*((struct_fonction *) (*s_objet).objet))
2100: .nom_fonction, longueur)) != (ssize_t) longueur)
2101: {
2102: if (longueur_ecriture == -1)
2103: {
2104: return(d_erreur);
2105: }
2106:
2107: nanosleep(&attente, NULL);
2108: INCR_GRANULARITE(attente.tv_nsec);
2109: }
2110:
2111: attente.tv_sec = 0;
2112: attente.tv_nsec = GRANULARITE_us * 1000;
2113:
2114: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
2115: &((*((struct_fonction *) (*s_objet).objet)).nombre_arguments),
2116: sizeof(integer8))) != sizeof(integer8))
2117: {
2118: if (longueur_ecriture == -1)
2119: {
2120: return(d_erreur);
2121: }
2122:
2123: nanosleep(&attente, NULL);
2124: INCR_GRANULARITE(attente.tv_nsec);
2125: }
2126: }
2127: else if ((*s_objet).type == CHN)
2128: {
2129: attente.tv_sec = 0;
2130: attente.tv_nsec = GRANULARITE_us * 1000;
2131:
2132: while((longueur_ecriture = write_atomic(s_etat_processus,
2133: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
2134: sizeof((*s_objet).type))
2135: {
2136: if (longueur_ecriture == -1)
2137: {
2138: return(d_erreur);
2139: }
2140:
2141: nanosleep(&attente, NULL);
2142: INCR_GRANULARITE(attente.tv_nsec);
2143: }
2144:
2145: longueur = strlen((unsigned char *) (*s_objet).objet) + 1;
2146:
2147: attente.tv_sec = 0;
2148: attente.tv_nsec = GRANULARITE_us * 1000;
2149:
2150: while((longueur_ecriture = write_atomic(s_etat_processus,
2151: pipe, &longueur, sizeof(size_t))) != sizeof(size_t))
2152: {
2153: if (longueur_ecriture == -1)
2154: {
2155: return(d_erreur);
2156: }
2157:
2158: nanosleep(&attente, NULL);
2159: INCR_GRANULARITE(attente.tv_nsec);
2160: }
2161:
2162: attente.tv_sec = 0;
2163: attente.tv_nsec = GRANULARITE_us * 1000;
2164:
2165: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
2166: (unsigned char *) (*s_objet).objet,
2167: longueur)) != (ssize_t) longueur)
2168: {
2169: if (longueur_ecriture == -1)
2170: {
2171: return(d_erreur);
2172: }
2173:
2174: nanosleep(&attente, NULL);
2175: INCR_GRANULARITE(attente.tv_nsec);
2176: }
2177: }
2178: else if (((*s_objet).type == LST) ||
2179: ((*s_objet).type == ALG) ||
2180: ((*s_objet).type == RPN))
2181: {
2182: attente.tv_sec = 0;
2183: attente.tv_nsec = GRANULARITE_us * 1000;
2184:
2185: while((longueur_ecriture = write_atomic(s_etat_processus,
2186: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
2187: sizeof((*s_objet).type))
2188: {
2189: if (longueur_ecriture == -1)
2190: {
2191: return(d_erreur);
2192: }
2193:
2194: nanosleep(&attente, NULL);
2195: INCR_GRANULARITE(attente.tv_nsec);
2196: }
2197:
2198: l_element_courant = (*s_objet).objet;
2199: i = 0;
2200:
2201: while(l_element_courant != NULL)
2202: {
2203: i++;
2204: l_element_courant = (*l_element_courant).suivant;
2205: }
2206:
2207: attente.tv_sec = 0;
2208: attente.tv_nsec = GRANULARITE_us * 1000;
2209:
2210: while((longueur_ecriture = write_atomic(s_etat_processus,
2211: pipe, &i, sizeof(i))) != sizeof(i))
2212: {
2213: if (longueur_ecriture == -1)
2214: {
2215: return(d_erreur);
2216: }
2217:
2218: nanosleep(&attente, NULL);
2219: INCR_GRANULARITE(attente.tv_nsec);
2220: }
2221:
2222: l_element_courant = (*s_objet).objet;
2223:
2224: while(l_element_courant != NULL)
2225: {
2226: if (ecriture_pipe(s_etat_processus, pipe,
2227: (*l_element_courant).donnee) == d_erreur)
2228: {
2229: return(d_erreur);
2230: }
2231:
2232: l_element_courant = (*l_element_courant).suivant;
2233: }
2234: }
2235: else if ((*s_objet).type == TBL)
2236: {
2237: attente.tv_sec = 0;
2238: attente.tv_nsec = GRANULARITE_us * 1000;
2239:
2240: while((longueur_ecriture = write_atomic(s_etat_processus,
2241: pipe, &((*s_objet).type), sizeof((*s_objet).type))) !=
2242: sizeof((*s_objet).type))
2243: {
2244: if (longueur_ecriture == -1)
2245: {
2246: return(d_erreur);
2247: }
2248:
2249: nanosleep(&attente, NULL);
2250: INCR_GRANULARITE(attente.tv_nsec);
2251: }
2252:
2253: attente.tv_sec = 0;
2254: attente.tv_nsec = GRANULARITE_us * 1000;
2255:
2256: while((longueur_ecriture = write_atomic(s_etat_processus, pipe,
2257: &((*((struct_tableau *) (*s_objet).objet)).nombre_elements),
2258: sizeof(integer8))) != sizeof(integer8))
2259: {
2260: if (longueur_ecriture == -1)
2261: {
2262: return(d_erreur);
2263: }
2264:
2265: nanosleep(&attente, NULL);
2266: INCR_GRANULARITE(attente.tv_nsec);
2267: }
2268:
2269: for(i = 0; i < (*((struct_tableau *)
2270: (*s_objet).objet)).nombre_elements; i++)
2271: {
2272: if (ecriture_pipe(s_etat_processus, pipe,
2273: (*((struct_tableau *) (*s_objet).objet)).elements[i])
2274: == d_erreur)
2275: {
2276: return(d_erreur);
2277: }
2278: }
2279: }
2280: else
2281: {
2282: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2283: return(d_erreur);
2284: }
2285:
2286: return(d_absence_erreur);
2287: }
2288:
2289:
2290: /*
2291: ================================================================================
2292: Fonction de lecture dans un pipe
2293: ================================================================================
2294: Entrées : pointeur sur une structure de description du processus,
2295: numéro du pipe et objet à écrire
2296: --------------------------------------------------------------------------------
2297: Sorties :
2298: --------------------------------------------------------------------------------
2299: Effets de bord : néant
2300: ================================================================================
2301: */
2302:
2303: struct_objet *
2304: lecture_pipe(struct_processus *s_etat_processus, int pipe)
2305: {
2306: size_t longueur;
2307:
2308: struct_liste_chainee *l_element_courant;
2309:
2310: struct_objet *s_objet;
2311:
2312: struct timespec attente;
2313:
2314: integer8 i;
2315: integer8 j;
2316:
2317: if ((s_objet = allocation(s_etat_processus, NON)) == NULL)
2318: {
2319: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2320: return(NULL);
2321: }
2322:
2323: attente.tv_sec = 0;
2324: attente.tv_nsec = GRANULARITE_us * 1000;
2325:
2326: while(read_atomic(s_etat_processus, pipe, &((*s_objet).type),
2327: sizeof((*s_objet).type)) != sizeof((*s_objet).type))
2328: {
2329: nanosleep(&attente, NULL);
2330: INCR_GRANULARITE(attente.tv_nsec);
2331: }
2332:
2333: if ((*s_objet).type == INT)
2334: {
2335: if (((*s_objet).objet = malloc(sizeof(integer8))) == NULL)
2336: {
2337: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2338: return(NULL);
2339: }
2340:
2341: attente.tv_sec = 0;
2342: attente.tv_nsec = GRANULARITE_us * 1000;
2343:
2344: while(read_atomic(s_etat_processus, pipe,
2345: (*s_objet).objet, sizeof(integer8)) != sizeof(integer8))
2346: {
2347: nanosleep(&attente, NULL);
2348: INCR_GRANULARITE(attente.tv_nsec);
2349: }
2350: }
2351: else if ((*s_objet).type == REL)
2352: {
2353: if (((*s_objet).objet = malloc(sizeof(real8))) == NULL)
2354: {
2355: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2356: return(NULL);
2357: }
2358:
2359: attente.tv_sec = 0;
2360: attente.tv_nsec = GRANULARITE_us * 1000;
2361:
2362: while(read_atomic(s_etat_processus, pipe,
2363: (*s_objet).objet, sizeof(real8)) != sizeof(real8))
2364: {
2365: nanosleep(&attente, NULL);
2366: INCR_GRANULARITE(attente.tv_nsec);
2367: }
2368: }
2369: else if ((*s_objet).type == CPL)
2370: {
2371: if (((*s_objet).objet = malloc(sizeof(complex16))) == NULL)
2372: {
2373: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2374: return(NULL);
2375: }
2376:
2377: attente.tv_sec = 0;
2378: attente.tv_nsec = GRANULARITE_us * 1000;
2379:
2380: while(read_atomic(s_etat_processus, pipe,
2381: (*s_objet).objet, sizeof(complex16)) != sizeof(complex16))
2382: {
2383: nanosleep(&attente, NULL);
2384: INCR_GRANULARITE(attente.tv_nsec);
2385: }
2386: }
2387: else if ((*s_objet).type == VIN)
2388: {
2389: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
2390: {
2391: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2392: return(NULL);
2393: }
2394:
2395: (*((struct_vecteur *) (*s_objet).objet)).type = 'I';
2396:
2397: attente.tv_sec = 0;
2398: attente.tv_nsec = GRANULARITE_us * 1000;
2399:
2400: while(read_atomic(s_etat_processus, pipe, &((*((struct_vecteur *)
2401: (*s_objet).objet)).taille),
2402: sizeof(integer8)) != sizeof(integer8))
2403: {
2404: nanosleep(&attente, NULL);
2405: INCR_GRANULARITE(attente.tv_nsec);
2406: }
2407:
2408: if (((*((struct_vecteur *) (*s_objet).objet)).tableau =
2409: malloc(((size_t) (*((struct_vecteur *) (*s_objet).objet))
2410: .taille) * sizeof(integer8))) == NULL)
2411: {
2412: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2413: return(NULL);
2414: }
2415:
2416: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
2417: {
2418: attente.tv_sec = 0;
2419: attente.tv_nsec = GRANULARITE_us * 1000;
2420:
2421: while(read_atomic(s_etat_processus, pipe,
2422: &(((integer8 *) (*((struct_vecteur *)
2423: (*s_objet).objet)).tableau)[i]), sizeof(integer8)) !=
2424: sizeof(integer8))
2425: {
2426: nanosleep(&attente, NULL);
2427: INCR_GRANULARITE(attente.tv_nsec);
2428: }
2429: }
2430: }
2431: else if ((*s_objet).type == VRL)
2432: {
2433: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
2434: {
2435: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2436: return(NULL);
2437: }
2438:
2439: (*((struct_vecteur *) (*s_objet).objet)).type = 'R';
2440:
2441: attente.tv_sec = 0;
2442: attente.tv_nsec = GRANULARITE_us * 1000;
2443:
2444: while(read_atomic(s_etat_processus, pipe, &((*((struct_vecteur *)
2445: (*s_objet).objet)).taille),
2446: sizeof(integer8)) != sizeof(integer8))
2447: {
2448: nanosleep(&attente, NULL);
2449: INCR_GRANULARITE(attente.tv_nsec);
2450: }
2451:
2452: if (((*((struct_vecteur *) (*s_objet).objet)).tableau =
2453: malloc(((size_t) (*((struct_vecteur *) (*s_objet).objet))
2454: .taille) * sizeof(real8))) == NULL)
2455: {
2456: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2457: return(NULL);
2458: }
2459:
2460: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
2461: {
2462: attente.tv_sec = 0;
2463: attente.tv_nsec = GRANULARITE_us * 1000;
2464:
2465: while(read_atomic(s_etat_processus, pipe,
2466: &(((real8 *) (*((struct_vecteur *)
2467: (*s_objet).objet)).tableau)[i]), sizeof(real8)) !=
2468: sizeof(real8))
2469: {
2470: nanosleep(&attente, NULL);
2471: INCR_GRANULARITE(attente.tv_nsec);
2472: }
2473: }
2474: }
2475: else if ((*s_objet).type == VCX)
2476: {
2477: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
2478: {
2479: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2480: return(NULL);
2481: }
2482:
2483: (*((struct_vecteur *) (*s_objet).objet)).type = 'C';
2484:
2485: attente.tv_sec = 0;
2486: attente.tv_nsec = GRANULARITE_us * 1000;
2487:
2488: while(read_atomic(s_etat_processus, pipe, &((*((struct_vecteur *)
2489: (*s_objet).objet)).taille),
2490: sizeof(integer8)) != sizeof(integer8))
2491: {
2492: nanosleep(&attente, NULL);
2493: INCR_GRANULARITE(attente.tv_nsec);
2494: }
2495:
2496: if (((*((struct_vecteur *) (*s_objet).objet)).tableau =
2497: malloc(((size_t) (*((struct_vecteur *) (*s_objet).objet))
2498: .taille) * sizeof(complex16))) == NULL)
2499: {
2500: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2501: return(NULL);
2502: }
2503:
2504: for(i = 0; i < (*((struct_vecteur *) (*s_objet).objet)).taille; i++)
2505: {
2506: attente.tv_sec = 0;
2507: attente.tv_nsec = GRANULARITE_us * 1000;
2508:
2509: while(read_atomic(s_etat_processus, pipe,
2510: &(((complex16 *) (*((struct_vecteur *)
2511: (*s_objet).objet)).tableau)[i]), sizeof(complex16)) !=
2512: sizeof(complex16))
2513: {
2514: nanosleep(&attente, NULL);
2515: INCR_GRANULARITE(attente.tv_nsec);
2516: }
2517: }
2518: }
2519: else if ((*s_objet).type == MIN)
2520: {
2521: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
2522: {
2523: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2524: return(NULL);
2525: }
2526:
2527: (*((struct_matrice *) (*s_objet).objet)).type = 'I';
2528:
2529: attente.tv_sec = 0;
2530: attente.tv_nsec = GRANULARITE_us * 1000;
2531:
2532: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
2533: (*s_objet).objet)).nombre_lignes),
2534: sizeof(integer8)) != sizeof(integer8))
2535: {
2536: nanosleep(&attente, NULL);
2537: INCR_GRANULARITE(attente.tv_nsec);
2538: }
2539:
2540: attente.tv_sec = 0;
2541: attente.tv_nsec = GRANULARITE_us * 1000;
2542:
2543: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
2544: (*s_objet).objet)).nombre_colonnes),
2545: sizeof(integer8)) != sizeof(integer8))
2546: {
2547: nanosleep(&attente, NULL);
2548: INCR_GRANULARITE(attente.tv_nsec);
2549: }
2550:
2551: if (((*((struct_matrice *) (*s_objet).objet)).tableau =
2552: malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
2553: .nombre_lignes) * sizeof(integer8 *))) == NULL)
2554: {
2555: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2556: return(NULL);
2557: }
2558:
2559: for(i = 0; i < (*((struct_matrice *)
2560: (*s_objet).objet)).nombre_lignes; i++)
2561: {
2562: if ((((*((struct_matrice *) (*s_objet).objet)).tableau)[i] =
2563: malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
2564: .nombre_colonnes) * sizeof(integer8))) == NULL)
2565: {
2566: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2567: return(NULL);
2568: }
2569:
2570: for(j = 0; j < (*((struct_matrice *)
2571: (*s_objet).objet)).nombre_colonnes; j++)
2572: {
2573: attente.tv_sec = 0;
2574: attente.tv_nsec = GRANULARITE_us * 1000;
2575:
2576: while(read_atomic(s_etat_processus,
2577: pipe, &(((integer8 **) (*((struct_matrice *)
2578: (*s_objet).objet)).tableau)[i][j]),
2579: sizeof(integer8)) != sizeof(integer8))
2580: {
2581: nanosleep(&attente, NULL);
2582: INCR_GRANULARITE(attente.tv_nsec);
2583: }
2584: }
2585: }
2586: }
2587: else if ((*s_objet).type == MRL)
2588: {
2589: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
2590: {
2591: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2592: return(NULL);
2593: }
2594:
2595: (*((struct_matrice *) (*s_objet).objet)).type = 'R';
2596:
2597: attente.tv_sec = 0;
2598: attente.tv_nsec = GRANULARITE_us * 1000;
2599:
2600: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
2601: (*s_objet).objet)).nombre_lignes),
2602: sizeof(integer8)) != sizeof(integer8))
2603: {
2604: nanosleep(&attente, NULL);
2605: INCR_GRANULARITE(attente.tv_nsec);
2606: }
2607:
2608: attente.tv_sec = 0;
2609: attente.tv_nsec = GRANULARITE_us * 1000;
2610:
2611: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
2612: (*s_objet).objet)).nombre_colonnes),
2613: sizeof(integer8)) != sizeof(integer8))
2614: {
2615: nanosleep(&attente, NULL);
2616: INCR_GRANULARITE(attente.tv_nsec);
2617: }
2618:
2619: if (((*((struct_matrice *) (*s_objet).objet)).tableau =
2620: malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
2621: .nombre_lignes) * sizeof(real8 *))) == NULL)
2622: {
2623: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2624: return(NULL);
2625: }
2626:
2627: for(i = 0; i < (*((struct_matrice *)
2628: (*s_objet).objet)).nombre_lignes; i++)
2629: {
2630: if ((((*((struct_matrice *) (*s_objet).objet)).tableau)[i] =
2631: malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
2632: .nombre_colonnes) * sizeof(real8))) == NULL)
2633: {
2634: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2635: return(NULL);
2636: }
2637:
2638: for(j = 0; j < (*((struct_matrice *)
2639: (*s_objet).objet)).nombre_colonnes; j++)
2640: {
2641: attente.tv_sec = 0;
2642: attente.tv_nsec = GRANULARITE_us * 1000;
2643:
2644: while(read_atomic(s_etat_processus,
2645: pipe, &(((real8 **) (*((struct_matrice *)
2646: (*s_objet).objet)).tableau)[i][j]),
2647: sizeof(real8)) != sizeof(real8))
2648: {
2649: nanosleep(&attente, NULL);
2650: INCR_GRANULARITE(attente.tv_nsec);
2651: }
2652: }
2653: }
2654: }
2655: else if ((*s_objet).type == MCX)
2656: {
2657: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
2658: {
2659: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2660: return(NULL);
2661: }
2662:
2663: (*((struct_matrice *) (*s_objet).objet)).type = 'C';
2664:
2665: attente.tv_sec = 0;
2666: attente.tv_nsec = GRANULARITE_us * 1000;
2667:
2668: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
2669: (*s_objet).objet)).nombre_lignes),
2670: sizeof(integer8)) != sizeof(integer8))
2671: {
2672: nanosleep(&attente, NULL);
2673: INCR_GRANULARITE(attente.tv_nsec);
2674: }
2675:
2676: attente.tv_sec = 0;
2677: attente.tv_nsec = GRANULARITE_us * 1000;
2678:
2679: while(read_atomic(s_etat_processus, pipe, &((*((struct_matrice *)
2680: (*s_objet).objet)).nombre_colonnes),
2681: sizeof(integer8)) != sizeof(integer8))
2682: {
2683: nanosleep(&attente, NULL);
2684: INCR_GRANULARITE(attente.tv_nsec);
2685: }
2686:
2687: if (((*((struct_matrice *) (*s_objet).objet)).tableau =
2688: malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
2689: .nombre_lignes) * sizeof(complex16 *))) == NULL)
2690: {
2691: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2692: return(NULL);
2693: }
2694:
2695: for(i = 0; i < (*((struct_matrice *)
2696: (*s_objet).objet)).nombre_lignes; i++)
2697: {
2698: if ((((*((struct_matrice *) (*s_objet).objet)).tableau)[i] =
2699: malloc(((size_t) (*((struct_matrice *) (*s_objet).objet))
2700: .nombre_colonnes) * sizeof(complex16))) == NULL)
2701: {
2702: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2703: return(NULL);
2704: }
2705:
2706: for(j = 0; j < (*((struct_matrice *)
2707: (*s_objet).objet)).nombre_colonnes; j++)
2708: {
2709: attente.tv_sec = 0;
2710: attente.tv_nsec = GRANULARITE_us * 1000;
2711:
2712: while(read_atomic(s_etat_processus, pipe,
2713: &(((complex16 **) (*((struct_matrice *)
2714: (*s_objet).objet)).tableau)[i][j]),
2715: sizeof(complex16)) != sizeof(complex16))
2716: {
2717: nanosleep(&attente, NULL);
2718: INCR_GRANULARITE(attente.tv_nsec);
2719: }
2720: }
2721: }
2722: }
2723: else if ((*s_objet).type == BIN)
2724: {
2725: if (((*s_objet).objet = malloc(sizeof(integer8))) == NULL)
2726: {
2727: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2728: return(NULL);
2729: }
2730:
2731: attente.tv_sec = 0;
2732: attente.tv_nsec = GRANULARITE_us * 1000;
2733:
2734: while(read_atomic(s_etat_processus, pipe,
2735: (*s_objet).objet, sizeof(integer8)) != sizeof(integer8))
2736: {
2737: nanosleep(&attente, NULL);
2738: INCR_GRANULARITE(attente.tv_nsec);
2739: }
2740: }
2741: else if ((*s_objet).type == NOM)
2742: {
2743: if (((*s_objet).objet = malloc(sizeof(struct_nom))) == NULL)
2744: {
2745: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2746: return(NULL);
2747: }
2748:
2749: attente.tv_sec = 0;
2750: attente.tv_nsec = GRANULARITE_us * 1000;
2751:
2752: while(read_atomic(s_etat_processus,
2753: pipe, &longueur, sizeof(size_t)) != sizeof(size_t))
2754: {
2755: nanosleep(&attente, NULL);
2756: INCR_GRANULARITE(attente.tv_nsec);
2757: }
2758:
2759: if (((*((struct_nom *) (*s_objet).objet)).nom = malloc(longueur *
2760: sizeof(unsigned char))) == NULL)
2761: {
2762: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2763: return(NULL);
2764: }
2765:
2766: attente.tv_sec = 0;
2767: attente.tv_nsec = GRANULARITE_us * 1000;
2768:
2769: while(read_atomic(s_etat_processus, pipe, (*((struct_nom *)
2770: (*s_objet).objet)).nom, longueur) != (ssize_t) longueur)
2771: {
2772: nanosleep(&attente, NULL);
2773: INCR_GRANULARITE(attente.tv_nsec);
2774: }
2775:
2776: attente.tv_sec = 0;
2777: attente.tv_nsec = GRANULARITE_us * 1000;
2778:
2779: while(read_atomic(s_etat_processus, pipe,
2780: &((*((struct_nom *) (*s_objet).objet)).symbole),
2781: sizeof(logical1)) != sizeof(logical1))
2782: {
2783: nanosleep(&attente, NULL);
2784: INCR_GRANULARITE(attente.tv_nsec);
2785: }
2786: }
2787: else if ((*s_objet).type == FCT)
2788: {
2789: if (((*s_objet).objet = allocation(s_etat_processus, FCT)) == NULL)
2790: {
2791: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2792: return(NULL);
2793: }
2794:
2795: attente.tv_sec = 0;
2796: attente.tv_nsec = GRANULARITE_us * 1000;
2797:
2798: while(read_atomic(s_etat_processus, pipe,
2799: &longueur, sizeof(size_t)) != sizeof(size_t))
2800: {
2801: nanosleep(&attente, NULL);
2802: INCR_GRANULARITE(attente.tv_nsec);
2803: }
2804:
2805: if (((*((struct_fonction *) (*s_objet).objet)).nom_fonction =
2806: malloc(longueur * sizeof(unsigned char))) == NULL)
2807: {
2808: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2809: return(NULL);
2810: }
2811:
2812: attente.tv_sec = 0;
2813: attente.tv_nsec = GRANULARITE_us * 1000;
2814:
2815: while(read_atomic(s_etat_processus, pipe,
2816: (*((struct_fonction *) (*s_objet).objet))
2817: .nom_fonction, longueur) != (ssize_t) longueur)
2818: {
2819: nanosleep(&attente, NULL);
2820: INCR_GRANULARITE(attente.tv_nsec);
2821: }
2822:
2823: attente.tv_sec = 0;
2824: attente.tv_nsec = GRANULARITE_us * 1000;
2825:
2826: while(read_atomic(s_etat_processus, pipe,
2827: &((*((struct_fonction *) (*s_objet).objet))
2828: .nombre_arguments), sizeof(integer8)) !=
2829: sizeof(integer8))
2830: {
2831: nanosleep(&attente, NULL);
2832: INCR_GRANULARITE(attente.tv_nsec);
2833: }
2834:
2835: (*((struct_fonction *) (*s_objet).objet)).fonction = NULL;
2836: (*((struct_fonction *) (*s_objet).objet)).prediction_saut = NULL;
2837: (*((struct_fonction *) (*s_objet).objet)).prediction_execution = d_faux;
2838: }
2839: else if ((*s_objet).type == CHN)
2840: {
2841: attente.tv_sec = 0;
2842: attente.tv_nsec = GRANULARITE_us * 1000;
2843:
2844: while(read_atomic(s_etat_processus, pipe,
2845: &longueur, sizeof(size_t)) != sizeof(size_t))
2846: {
2847: nanosleep(&attente, NULL);
2848: INCR_GRANULARITE(attente.tv_nsec);
2849: }
2850:
2851: if (((*s_objet).objet = malloc(longueur *
2852: sizeof(unsigned char))) == NULL)
2853: {
2854: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2855: return(NULL);
2856: }
2857:
2858: attente.tv_sec = 0;
2859: attente.tv_nsec = GRANULARITE_us * 1000;
2860:
2861: while(read_atomic(s_etat_processus, pipe, (unsigned char *)
2862: (*s_objet).objet, longueur) != (ssize_t) longueur)
2863: {
2864: nanosleep(&attente, NULL);
2865: INCR_GRANULARITE(attente.tv_nsec);
2866: }
2867: }
2868: else if (((*s_objet).type == LST) ||
2869: ((*s_objet).type == ALG) ||
2870: ((*s_objet).type == RPN))
2871: {
2872: attente.tv_sec = 0;
2873: attente.tv_nsec = GRANULARITE_us * 1000;
2874:
2875: while(read_atomic(s_etat_processus, pipe, &j, sizeof(j)) != sizeof(j))
2876: {
2877: nanosleep(&attente, NULL);
2878: INCR_GRANULARITE(attente.tv_nsec);
2879: }
2880:
2881: l_element_courant = NULL;
2882:
2883: for(i = 0; i < j; i++)
2884: {
2885: if (l_element_courant == NULL)
2886: {
2887: if ((l_element_courant =
2888: malloc(sizeof(struct_liste_chainee))) == NULL)
2889: {
2890: (*s_etat_processus).erreur_systeme =
2891: d_es_allocation_memoire;
2892: return(NULL);
2893: }
2894:
2895: (*s_objet).objet = l_element_courant;
2896: }
2897: else
2898: {
2899: if (((*l_element_courant).suivant =
2900: malloc(sizeof(struct_liste_chainee))) == NULL)
2901: {
2902: (*s_etat_processus).erreur_systeme =
2903: d_es_allocation_memoire;
2904: return(NULL);
2905: }
2906:
2907: l_element_courant = (*l_element_courant).suivant;
2908: (*l_element_courant).suivant = NULL;
2909: }
2910:
2911: attente.tv_sec = 0;
2912: attente.tv_nsec = GRANULARITE_us * 1000;
2913:
2914: while(((*l_element_courant).donnee = lecture_pipe(s_etat_processus,
2915: pipe)) == NULL)
2916: {
2917: if ((*s_etat_processus).erreur_systeme != d_es)
2918: {
2919: return(NULL);
2920: }
2921:
2922: nanosleep(&attente, NULL);
2923: INCR_GRANULARITE(attente.tv_nsec);
2924: }
2925: }
2926:
2927: if (l_element_courant == NULL)
2928: {
2929: (*s_objet).objet = NULL;
2930: }
2931: else
2932: {
2933: (*l_element_courant).suivant = NULL;
2934: }
2935: }
2936: else if ((*s_objet).type == TBL)
2937: {
2938: if (((*s_objet).objet = malloc(sizeof(struct_tableau))) == NULL)
2939: {
2940: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2941: return(NULL);
2942: }
2943:
2944: attente.tv_sec = 0;
2945: attente.tv_nsec = GRANULARITE_us * 1000;
2946:
2947: while(read_atomic(s_etat_processus, pipe, &((*((struct_tableau *)
2948: (*s_objet).objet)).nombre_elements),
2949: sizeof(integer8)) != sizeof(integer8))
2950: {
2951: nanosleep(&attente, NULL);
2952: INCR_GRANULARITE(attente.tv_nsec);
2953: }
2954:
2955: if (((*((struct_tableau *) (*s_objet).objet)).elements = malloc(
2956: ((size_t) (*((struct_tableau *) (*s_objet).objet))
2957: .nombre_elements) * sizeof(struct_objet *))) == NULL)
2958: {
2959: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2960: return(NULL);
2961: }
2962:
2963: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet)).nombre_elements;
2964: i++)
2965: {
2966: attente.tv_sec = 0;
2967: attente.tv_nsec = GRANULARITE_us * 1000;
2968:
2969: while(((*((struct_tableau *) (*s_objet).objet)).elements[i] =
2970: lecture_pipe(s_etat_processus, pipe)) == NULL)
2971: {
2972: if ((*s_etat_processus).erreur_systeme != d_es)
2973: {
2974: return(NULL);
2975: }
2976:
2977: nanosleep(&attente, NULL);
2978: INCR_GRANULARITE(attente.tv_nsec);
2979: }
2980: }
2981: }
2982:
2983: return(s_objet);
2984: }
2985:
2986:
2987: /*
2988: ================================================================================
2989: Fonction de scrutation des données injectées par le processus père
2990: ================================================================================
2991: Entrées : pointeur sur une structure
2992: --------------------------------------------------------------------------------
2993: Sorties :
2994: --------------------------------------------------------------------------------
2995: Effets de bord : néant
2996: ================================================================================
2997: */
2998:
2999: void
3000: scrutation_injection(struct_processus *s_etat_processus)
3001: {
3002: logical1 drapeau_erreur;
3003: logical1 registre_arret_si_exception;
3004:
3005: struct pollfd fds;
3006:
3007: unsigned char tampon;
3008: unsigned char tampon_profilage[20];
3009:
3010: scrutation_interruptions(s_etat_processus);
3011:
3012: // Si on est dans le processus père, il n'y a rien à surveiller.
3013:
3014: if ((*s_etat_processus).var_volatile_processus_racine == 0)
3015: {
3016: fds.fd = (*s_etat_processus).pipe_nombre_injections;
3017: fds.events = POLLIN;
3018: fds.revents = 0;
3019:
3020: if (poll(&fds, 1, 0) > 0)
3021: {
3022: if (read_atomic(s_etat_processus,
3023: (*s_etat_processus).pipe_nombre_injections,
3024: &tampon, sizeof(unsigned char)) == sizeof(unsigned char))
3025: {
3026: if (tampon == '-')
3027: {
3028: (*s_etat_processus).nombre_objets_injectes++;
3029: }
3030: else if (tampon == '+')
3031: {
3032: (*s_etat_processus).nombre_objets_envoyes_non_lus--;
3033:
3034: BUG((*s_etat_processus).nombre_objets_envoyes_non_lus < 0,
3035: printf("(*s_etat_processus).nombre_objets_envoyes_"
3036: "non_lus=%d\n", (*s_etat_processus)
3037: .nombre_objets_envoyes_non_lus));
3038: }
3039: else
3040: {
3041: BUG(1, printf("tampon='%c' (%d)\n", tampon, tampon));
3042: }
3043: }
3044: }
3045:
3046: /*
3047: * Traitement de l'interruption d'injection
3048: */
3049:
3050: if (((*s_etat_processus).nombre_objets_injectes != 0) &&
3051: ((*s_etat_processus).traitement_at_poke == 'N'))
3052: {
3053: if ((*s_etat_processus).at_poke != NULL)
3054: {
3055: registre_arret_si_exception =
3056: (*s_etat_processus).arret_si_exception;
3057: (*s_etat_processus).arret_si_exception = d_vrai;
3058:
3059: if ((*s_etat_processus).debug == d_vrai)
3060: if (((*s_etat_processus).type_debug &
3061: d_traitement_interruption) != 0)
3062: {
3063: if ((*s_etat_processus).langue == 'F')
3064: {
3065: printf("[%d] Traitement de l'interruption "
3066: "d'injection\n", (int) getpid());
3067: }
3068: else
3069: {
3070: printf("[%d] Start injection interrupt\n",
3071: (int) getpid());
3072: }
3073:
3074: fflush(stdout);
3075: }
3076:
3077: if ((*s_etat_processus).profilage == d_vrai)
3078: {
3079: sprintf(tampon_profilage, "Injection interrupt");
3080: profilage(s_etat_processus, tampon_profilage);
3081:
3082: if ((*s_etat_processus).erreur_systeme != d_es)
3083: {
3084: return;
3085: }
3086: }
3087:
3088: (*s_etat_processus).traitement_at_poke = 'Y';
3089: drapeau_erreur = evaluation(s_etat_processus,
3090: (*s_etat_processus).at_poke, 'E');
3091: (*s_etat_processus).traitement_at_poke = 'N';
3092:
3093: if ((*s_etat_processus).profilage == d_vrai)
3094: {
3095: profilage(s_etat_processus, NULL);
3096: }
3097:
3098: if (drapeau_erreur == d_absence_erreur)
3099: {
3100: (*s_etat_processus).arret_si_exception =
3101: registre_arret_si_exception;
3102: }
3103: else
3104: {
3105: if ((((*s_etat_processus).erreur_execution != d_ex) ||
3106: ((*s_etat_processus).exception != d_ep) ||
3107: ((*s_etat_processus).erreur_systeme != d_es)) &&
3108: ((*s_etat_processus).core == d_vrai) &&
3109: ((*s_etat_processus)
3110: .var_volatile_traitement_sigint == 0))
3111: {
3112: printf("\n");
3113:
3114: if ((*s_etat_processus).langue == 'F')
3115: {
3116: printf("+++Information : "
3117: "Génération du fichier rpl-core "
3118: "[%d]\n", (int) getpid());
3119: }
3120: else
3121: {
3122: printf("+++Information : "
3123: "Writing rpl-core file [%d]\n",
3124: (int) getpid());
3125: }
3126:
3127: rplcore(s_etat_processus);
3128:
3129: if ((*s_etat_processus).langue == 'F')
3130: {
3131: printf("+++Information : "
3132: "Processus tracé [%d]\n",
3133: (int) getpid());
3134: }
3135: else
3136: {
3137: printf("+++Information : Done [%d]\n",
3138: (int) getpid());
3139: }
3140:
3141: printf("\n");
3142: fflush(stdout);
3143: }
3144:
3145: }
3146:
3147: if ((*s_etat_processus).debug == d_vrai)
3148: if (((*s_etat_processus).type_debug &
3149: d_traitement_interruption) != 0)
3150: {
3151: if ((*s_etat_processus).langue == 'F')
3152: {
3153: printf("[%d] Fin de l'interruption d'injection\n",
3154: (int) getpid());
3155: }
3156: else
3157: {
3158: printf("[%d] Stop injection interrupt\n",
3159: (int) getpid());
3160: }
3161:
3162: fflush(stdout);
3163: }
3164:
3165: if ((drapeau_erreur == d_erreur) &&
3166: ((*s_etat_processus).erreur_execution == d_ex))
3167: {
3168: if (((*s_etat_processus).erreur_execution == d_ex) &&
3169: ((*s_etat_processus).erreur_systeme == d_es))
3170: {
3171: (*s_etat_processus).erreur_execution =
3172: d_ex_erreur_evaluation;
3173: }
3174: }
3175: }
3176: }
3177: }
3178:
3179: return;
3180: }
3181:
3182:
3183: /*
3184: ================================================================================
3185: Fonction de test du drapeau d'arrêt
3186: ================================================================================
3187: Entrées : pointeur sur une structure
3188: --------------------------------------------------------------------------------
3189: Sorties :
3190: --------------------------------------------------------------------------------
3191: Effets de bord : néant
3192: ================================================================================
3193: */
3194:
3195: int
3196: test_arret(struct_processus *s_etat_processus)
3197: {
3198: return((int) (*s_etat_processus).var_volatile_requete_arret);
3199: }
3200:
3201: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>