1: /*
2: ================================================================================
3: RPL/2 (R) version 4.0.12
4: Copyright (C) 1989-2010 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl.conv.h"
24:
25:
26: /*
27: ================================================================================
28: Fonction 'while'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_while(struct_processus *s_etat_processus)
40: {
41: (*s_etat_processus).erreur_execution = d_ex;
42:
43: if ((*s_etat_processus).affichage_arguments == 'Y')
44: {
45: printf("\n WHILE ");
46:
47: if ((*s_etat_processus).langue == 'F')
48: {
49: printf("(structure de contrôle)\n\n");
50: printf(" Utilisation :\n\n");
51: }
52: else
53: {
54: printf("(control statement)\n\n");
55: printf(" Usage:\n\n");
56: }
57:
58: printf(" WHILE\n");
59: printf(" (clause)\n");
60: printf(" REPEAT\n");
61: printf(" (expression 1)\n");
62: printf(" EXIT\n");
63: printf(" (expression 2)\n");
64: printf(" END\n\n");
65:
66: printf(" WHILE\n");
67: printf(" (clause)\n");
68: printf(" REPEAT\n");
69: printf(" (expression)\n");
70: printf(" END\n");
71:
72: return;
73: }
74: else if ((*s_etat_processus).test_instruction == 'Y')
75: {
76: (*s_etat_processus).nombre_arguments = -1;
77: return;
78: }
79:
80: empilement_pile_systeme(s_etat_processus);
81:
82: if ((*s_etat_processus).erreur_systeme != d_es)
83: {
84: return;
85: }
86:
87: (*(*s_etat_processus).l_base_pile_systeme).type_cloture = 'W';
88: (*(*s_etat_processus).l_base_pile_systeme).clause = 'W';
89:
90: if ((*s_etat_processus).mode_execution_programme == 'Y')
91: {
92: (*(*s_etat_processus).l_base_pile_systeme).adresse_retour =
93: (*s_etat_processus).position_courante;
94: }
95: else
96: {
97: if ((*s_etat_processus).expression_courante == NULL)
98: {
99: (*s_etat_processus).erreur_execution =
100: d_ex_erreur_traitement_boucle;
101: return;
102: }
103:
104: (*(*s_etat_processus).l_base_pile_systeme).pointeur_objet_retour =
105: (*s_etat_processus).expression_courante;
106: }
107:
108: return;
109: }
110:
111:
112: /*
113: ================================================================================
114: Fonction 'warranty'
115: ================================================================================
116: Entrées :
117: --------------------------------------------------------------------------------
118: Sorties :
119: --------------------------------------------------------------------------------
120: Effets de bord : néant
121: ================================================================================
122: */
123:
124: void
125: instruction_warranty(struct_processus *s_etat_processus)
126: {
127: # include "garanties.conv.h"
128:
129: (*s_etat_processus).erreur_execution = d_ex;
130:
131: if ((*s_etat_processus).affichage_arguments == 'Y')
132: {
133: printf("\n WARRANTY ");
134:
135: if ((*s_etat_processus).langue == 'F')
136: {
137: printf("(garantie)\n\n");
138: printf(" Aucun argument\n");
139: }
140: else
141: {
142: printf("(warranty)\n\n");
143: printf(" No argument\n");
144: }
145:
146: return;
147: }
148: else if ((*s_etat_processus).test_instruction == 'Y')
149: {
150: (*s_etat_processus).nombre_arguments = -1;
151: return;
152: }
153:
154: printf("%s\n", warranty);
155:
156: if ((*s_etat_processus).hauteur_pile_operationnelle == 0)
157: {
158: printf("\n");
159: }
160:
161: return;
162: }
163:
164:
165: /*
166: ================================================================================
167: Fonction 'wait'
168: ================================================================================
169: Entrées :
170: --------------------------------------------------------------------------------
171: Sorties :
172: --------------------------------------------------------------------------------
173: Effets de bord : néant
174: ================================================================================
175: */
176:
177: void
178: instruction_wait(struct_processus *s_etat_processus)
179: {
180: int code_retour;
181: int erreur;
182:
183: real8 attente;
184:
185: struct_objet *s_objet;
186:
187: struct timespec temporisation;
188:
189: (*s_etat_processus).erreur_execution = d_ex;
190:
191: if ((*s_etat_processus).affichage_arguments == 'Y')
192: {
193: printf("\n WAIT ");
194:
195: if ((*s_etat_processus).langue == 'F')
196: {
197: printf("(attente exprimée en secondes)\n\n");
198: }
199: else
200: {
201: printf("(wait a number of seconds)\n\n");
202: }
203:
204: printf(" 1: %s, %s\n", d_INT, d_REL);
205:
206: return;
207: }
208: else if ((*s_etat_processus).test_instruction == 'Y')
209: {
210: (*s_etat_processus).nombre_arguments = -1;
211: return;
212: }
213:
214: if (test_cfsf(s_etat_processus, 31) == d_vrai)
215: {
216: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
217: {
218: return;
219: }
220: }
221:
222: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
223: &s_objet) == d_erreur)
224: {
225: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
226: return;
227: }
228:
229: if (((*s_objet).type == INT) ||
230: ((*s_objet).type == REL))
231: {
232: if ((*s_objet).type == INT)
233: {
234: attente = (real8) (*((integer8 *) (*s_objet).objet));
235: }
236: else
237: {
238: attente = (*((real8 *) (*s_objet).objet));
239: }
240:
241: if (attente < 0)
242: {
243: liberation(s_etat_processus, s_objet);
244:
245: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
246: return;
247: }
248:
249: temporisation.tv_sec = (long) floor((double) attente);
250: temporisation.tv_nsec = (attente - temporisation.tv_sec) *
251: (long) 1000000000;
252:
253: if ((*s_etat_processus).profilage == d_vrai)
254: {
255: profilage(s_etat_processus, "Sleep function (WAIT)");
256:
257: if ((*s_etat_processus).erreur_systeme != d_es)
258: {
259: return;
260: }
261: }
262:
263: do
264: {
265: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
266: {
267: (*s_etat_processus).erreur_systeme = d_es_processus;
268: return;
269: }
270:
271: code_retour = nanosleep(&temporisation, &temporisation);
272: erreur = errno;
273:
274: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
275: {
276: if (errno != EINTR)
277: {
278: (*s_etat_processus).erreur_systeme = d_es_processus;
279: return;
280: }
281: }
282:
283: scrutation_injection(s_etat_processus);
284:
285: if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
286: {
287: affectation_interruptions_logicielles(s_etat_processus);
288: }
289:
290: if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
291: {
292: traitement_interruptions_logicielles(s_etat_processus);
293: }
294: } while(((code_retour == -1) && (erreur == EINTR))
295: && ((*s_etat_processus).var_volatile_requete_arret == 0));
296:
297: if ((*s_etat_processus).profilage == d_vrai)
298: {
299: profilage(s_etat_processus, NULL);
300: }
301: }
302: else
303: {
304: liberation(s_etat_processus, s_objet);
305:
306: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
307: return;
308: }
309:
310: liberation(s_etat_processus, s_objet);
311:
312: return;
313: }
314:
315:
316: /*
317: ================================================================================
318: Fonction 'wireframe' (passe en mode d'affichage échantillonné)
319: ================================================================================
320: Entrées : structure processus
321: --------------------------------------------------------------------------------
322: Sorties :
323: --------------------------------------------------------------------------------
324: Effets de bord : néant
325: ================================================================================
326: */
327:
328: void
329: instruction_wireframe(struct_processus *s_etat_processus)
330: {
331: (*s_etat_processus).erreur_execution = d_ex;
332:
333: if ((*s_etat_processus).affichage_arguments == 'Y')
334: {
335: printf("\n WIREFRAME ");
336:
337: if ((*s_etat_processus).langue == 'F')
338: {
339: printf("(graphique tridimensionnel grillagé)\n\n");
340: printf(" Aucun argument\n");
341: }
342: else
343: {
344: printf("(wireframe 3D graph)\n\n");
345: printf(" No argument\n");
346: }
347:
348: return;
349: }
350: else if ((*s_etat_processus).test_instruction == 'Y')
351: {
352: (*s_etat_processus).nombre_arguments = -1;
353: return;
354: }
355:
356: strcpy((*s_etat_processus).type_trace_eq, "GRILLE 3D");
357:
358: return;
359: }
360:
361:
362: /*
363: ================================================================================
364: Fonction 'write'
365: ================================================================================
366: Entrées : structure processus
367: --------------------------------------------------------------------------------
368: Sorties :
369: --------------------------------------------------------------------------------
370: Effets de bord : néant
371: ================================================================================
372: */
373:
374: void
375: instruction_write(struct_processus *s_etat_processus)
376: {
377: file *descripteur;
378:
379: int adresse[16];
380: int port;
381:
382: long longueur_effective;
383: long recursivite;
384:
385: ssize_t ios;
386:
387: struct_objet *s_objet_argument_2;
388: struct_objet *s_objet_argument_1;
389:
390: struct sigaction action;
391: struct sigaction registre;
392:
393: struct sockaddr_in adresse_ipv4;
394: struct sockaddr_in6 adresse_ipv6;
395: struct sockaddr_un adresse_unix;
396:
397: struct flock lock;
398:
399: uint32_t calcul_adresse;
400:
401: unsigned char *chaine;
402:
403: unsigned long i;
404:
405: (*s_etat_processus).erreur_execution = d_ex;
406:
407: if ((*s_etat_processus).affichage_arguments == 'Y')
408: {
409: printf("\n WRITE ");
410:
411: if ((*s_etat_processus).langue == 'F')
412: {
413: printf("(écriture d'un enregistrement d'un fichier)\n\n");
414: }
415: else
416: {
417: printf("(write a record of a file)\n\n");
418: }
419:
420: printf(" 2: %s\n", d_LST);
421: printf(" 1: %s, %s\n", d_FCH, d_SCK);
422:
423: return;
424: }
425: else if ((*s_etat_processus).test_instruction == 'Y')
426: {
427: (*s_etat_processus).nombre_arguments = -1;
428: return;
429: }
430:
431: if (test_cfsf(s_etat_processus, 31) == d_vrai)
432: {
433: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
434: {
435: return;
436: }
437: }
438:
439: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
440: &s_objet_argument_1) == d_erreur)
441: {
442: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
443: return;
444: }
445:
446: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
447: &s_objet_argument_2) == d_erreur)
448: {
449: liberation(s_etat_processus, s_objet_argument_1);
450:
451: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
452: return;
453: }
454:
455: if (((*s_objet_argument_2).type == LST) &&
456: ((*s_objet_argument_1).type == FCH))
457: {
458: /*
459: * Vérification des verrous
460: */
461:
462: lock.l_type = F_WRLCK;
463: lock.l_whence = SEEK_SET;
464: lock.l_start = 0;
465: lock.l_len = 0;
466: lock.l_pid = getpid();
467: recursivite = 0;
468:
469: if ((descripteur = descripteur_fichier(s_etat_processus,
470: (struct_fichier *) (*s_objet_argument_1).objet)) == NULL)
471: {
472: return;
473: }
474:
475: if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1)
476: {
477: liberation(s_etat_processus, s_objet_argument_2);
478: liberation(s_etat_processus, s_objet_argument_1);
479:
480: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
481: return;
482: }
483:
484: if (lock.l_type != F_UNLCK)
485: {
486: liberation(s_etat_processus, s_objet_argument_2);
487: liberation(s_etat_processus, s_objet_argument_1);
488:
489: (*s_etat_processus).erreur_execution =
490: d_ex_fichier_verrouille;
491: return;
492: }
493:
494: /*
495: * Vérification de l'autorisation d'écriture
496: */
497:
498: if ((*((struct_fichier *) (*s_objet_argument_1).objet))
499: .protection == 'R')
500: {
501: liberation(s_etat_processus, s_objet_argument_2);
502: liberation(s_etat_processus, s_objet_argument_1);
503:
504: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
505: return;
506: }
507:
508: if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire == 'N')
509: {
510: /*
511: * Fichiers formatés
512: */
513:
514: if ((chaine = formateur_fichier(s_etat_processus,
515: s_objet_argument_2, (*((struct_fichier *)
516: (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'F',
517: &longueur_effective, &recursivite)) == NULL)
518: {
519: liberation(s_etat_processus, s_objet_argument_2);
520: liberation(s_etat_processus, s_objet_argument_1);
521:
522: return;
523: }
524:
525: if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
526: == 'S')
527: {
528: if (fseek(descripteur, (long) 0, SEEK_END) != 0)
529: {
530: liberation(s_etat_processus, s_objet_argument_2);
531: liberation(s_etat_processus, s_objet_argument_1);
532:
533: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
534: return;
535: }
536:
537: if (fprintf(descripteur, "%s\n", chaine) < 0)
538: {
539: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
540: return;
541: }
542: }
543: else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
544: == 'D')
545: {
546: }
547: else
548: {
549: /* Fichiers indexés : panique totale ! */
550: }
551:
552: free(chaine);
553: }
554: else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire
555: == 'Y')
556: {
557: /*
558: * Fichiers non formatés
559: */
560:
561: if ((chaine = formateur_fichier(s_etat_processus,
562: s_objet_argument_2, (*((struct_fichier *)
563: (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'U',
564: &longueur_effective, &recursivite)) == NULL)
565: {
566: liberation(s_etat_processus, s_objet_argument_2);
567: liberation(s_etat_processus, s_objet_argument_1);
568:
569: return;
570: }
571:
572: if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
573: == 'S')
574: {
575: if (fseek(descripteur, (long) 0, SEEK_END) != 0)
576: {
577: liberation(s_etat_processus, s_objet_argument_2);
578: liberation(s_etat_processus, s_objet_argument_1);
579:
580: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
581: return;
582: }
583:
584: if (fwrite(chaine, sizeof(unsigned char), longueur_effective,
585: descripteur) != (size_t) longueur_effective)
586: {
587: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
588: return;
589: }
590: }
591: else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).acces
592: == 'D')
593: {
594: }
595: else
596: {
597: /* Fichiers indexés : panique totale ! */
598: }
599:
600: free(chaine);
601: }
602: else
603: {
604: /*
605: * Fichiers de type FLOW
606: */
607: }
608: }
609: else if (((*s_objet_argument_2).type == LST) &&
610: ((*s_objet_argument_1).type == SCK))
611: {
612: /*
613: * Vérification de l'autorisation d'écriture
614: */
615:
616: if ((*((struct_socket *) (*s_objet_argument_1).objet))
617: .protection == 'R')
618: {
619: liberation(s_etat_processus, s_objet_argument_2);
620: liberation(s_etat_processus, s_objet_argument_1);
621:
622: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
623: return;
624: }
625:
626: if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire == 'N')
627: {
628: /*
629: * Sockets formatées
630: */
631:
632: if ((chaine = formateur_fichier(s_etat_processus,
633: s_objet_argument_2, (*((struct_socket *)
634: (*s_objet_argument_1).objet)).format, 0, 0, ' ', 'F',
635: &longueur_effective, &recursivite)) == NULL)
636: {
637: liberation(s_etat_processus, s_objet_argument_2);
638: liberation(s_etat_processus, s_objet_argument_1);
639:
640: return;
641: }
642:
643: if ((strcmp((*((struct_socket *) (*s_objet_argument_1).objet)).type,
644: "STREAM") == 0) || (strcmp((*((struct_socket *)
645: (*s_objet_argument_1).objet)).type,
646: "SEQUENTIAL DATAGRAM") == 0))
647: { // Sockets connectées
648:
649: action.sa_handler = SIG_IGN;
650: action.sa_flags = SA_ONSTACK;
651:
652: if (sigaction(SIGPIPE, &action, ®istre) != 0)
653: {
654: (*s_etat_processus).erreur_systeme = d_es_signal;
655: return;
656: }
657:
658: if (sem_post(&((*s_etat_processus).semaphore_fork))
659: != 0)
660: {
661: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
662: {
663: (*s_etat_processus).erreur_systeme = d_es_signal;
664: return;
665: }
666:
667: (*s_etat_processus).erreur_systeme = d_es_processus;
668: return;
669: }
670:
671: if (send((*((struct_socket *) (*s_objet_argument_1).objet))
672: .socket, chaine, strlen(chaine), 0) < 0)
673: {
674: ios = errno;
675:
676: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
677: {
678: (*s_etat_processus).erreur_systeme = d_es_signal;
679: return;
680: }
681:
682: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
683: {
684: if (errno != EINTR)
685: {
686: (*s_etat_processus).erreur_systeme = d_es_processus;
687: return;
688: }
689: }
690:
691: if (ios == EPIPE)
692: {
693: (*s_etat_processus).erreur_execution =
694: d_ex_erreur_acces_fichier;
695: return;
696: }
697:
698: (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
699: return;
700: }
701:
702: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
703: {
704: if (errno != EINTR)
705: {
706: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
707: {
708: (*s_etat_processus).erreur_systeme = d_es_signal;
709: return;
710: }
711:
712: (*s_etat_processus).erreur_systeme = d_es_processus;
713: return;
714: }
715: }
716:
717: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
718: {
719: (*s_etat_processus).erreur_systeme = d_es_signal;
720: return;
721: }
722: }
723: else
724: { // Sockets non connectées
725:
726: /*
727: * Vérification de l'adresse distante
728: */
729:
730: if (strcmp((*((struct_socket *) (*s_objet_argument_1).objet))
731: .adresse_distante, "") == 0)
732: {
733: liberation(s_etat_processus, s_objet_argument_1);
734: liberation(s_etat_processus, s_objet_argument_2);
735:
736: (*s_etat_processus).erreur_execution =
737: d_ex_erreur_acces_fichier;
738: return;
739: }
740:
741: /*
742: * Création de l'adresse logique
743: */
744:
745: if ((*((struct_socket *) (*s_objet_argument_1).objet))
746: .domaine == PF_UNIX)
747: {
748: adresse_unix.sun_family = AF_UNIX;
749: strncpy(adresse_unix.sun_path, (*((struct_socket *)
750: (*s_objet_argument_1).objet)).adresse_distante,
751: 108);
752: adresse_unix.sun_path[108 - 1] = d_code_fin_chaine;
753:
754: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
755: {
756: (*s_etat_processus).erreur_systeme = d_es_processus;
757: return;
758: }
759:
760: if (sendto((*((struct_socket *)
761: (*s_objet_argument_1).objet)).socket, chaine,
762: strlen(chaine), 0, (struct sockaddr *)
763: &adresse_unix, sizeof(adresse_unix)) < 0)
764: {
765: while(sem_wait(&((*s_etat_processus)
766: .semaphore_fork)) == -1)
767: {
768: if (errno != EINTR)
769: {
770: (*s_etat_processus).erreur_systeme =
771: d_es_processus;
772: return;
773: }
774: }
775:
776: (*s_etat_processus).erreur_systeme =
777: d_es_erreur_fichier;
778: return;
779: }
780:
781: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
782: {
783: if (errno != EINTR)
784: {
785: (*s_etat_processus).erreur_systeme = d_es_processus;
786: return;
787: }
788: }
789: }
790: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
791: .domaine == PF_INET)
792: {
793: if (sscanf((*((struct_socket *)
794: (*s_objet_argument_1).objet))
795: .adresse_distante, "%d.%d.%d.%d(%d)",
796: &(adresse[0]), &(adresse[1]), &(adresse[2]),
797: &(adresse[3]), &port) == 5)
798: { // Adresse IPv4
799: calcul_adresse = 0;
800: for(i = 0; i < 4; calcul_adresse =
801: (256 * calcul_adresse) + adresse[i++]);
802:
803: memset(&adresse_ipv4, 0, sizeof(adresse_ipv4));
804: adresse_ipv4.sin_family = AF_INET;
805: adresse_ipv4.sin_port = htons(port);
806: adresse_ipv4.sin_addr.s_addr = htonl(calcul_adresse);
807:
808: if (sem_post(&((*s_etat_processus)
809: .semaphore_fork)) != 0)
810: {
811: (*s_etat_processus).erreur_systeme = d_es_processus;
812: return;
813: }
814:
815: if (sendto((*((struct_socket *)
816: (*s_objet_argument_1).objet)).socket, chaine,
817: strlen(chaine), 0, (struct sockaddr *)
818: &adresse_ipv4, sizeof(adresse_ipv4)) < 0)
819: {
820: while(sem_wait(&((*s_etat_processus)
821: .semaphore_fork)) == -1)
822: {
823: if (errno != EINTR)
824: {
825: (*s_etat_processus).erreur_systeme =
826: d_es_processus;
827: return;
828: }
829: }
830:
831: (*s_etat_processus).erreur_systeme =
832: d_es_erreur_fichier;
833: return;
834: }
835:
836: while(sem_wait(&((*s_etat_processus)
837: .semaphore_fork)) == -1)
838: {
839: if (errno != EINTR)
840: {
841: (*s_etat_processus).erreur_systeme =
842: d_es_processus;
843: return;
844: }
845: }
846: }
847: else
848: {
849: liberation(s_etat_processus, s_objet_argument_1);
850: liberation(s_etat_processus, s_objet_argument_2);
851:
852: (*s_etat_processus).erreur_execution =
853: d_ex_erreur_parametre_fichier;
854: return;
855: }
856: }
857: else if ((*((struct_socket *) (*s_objet_argument_1).objet))
858: .domaine == PF_INET6)
859: {
860: if (sscanf((*((struct_socket *) (*s_objet_argument_1)
861: .objet)).adresse_distante, "%X:%X:%X:%X:%X:"
862: "%X:%X:%X:%X:%X:%X:%X:%X:%X:%X:%X(%d)",
863: &(adresse[0]), &(adresse[1]), &(adresse[2]),
864: &(adresse[3]), &(adresse[4]), &(adresse[5]),
865: &(adresse[6]), &(adresse[7]), &(adresse[8]),
866: &(adresse[9]), &(adresse[10]), &(adresse[11]),
867: &(adresse[12]), &(adresse[13]), &(adresse[14]),
868: &(adresse[15]), &port)== 17)
869: { // Adresse IPv6
870: memset(&adresse_ipv6, 0, sizeof(adresse_ipv6));
871: adresse_ipv6.sin6_family = AF_INET6;
872: adresse_ipv6.sin6_port = htons((uint16_t) port);
873:
874: for(i = 0; i < 16;
875: adresse_ipv6.sin6_addr.s6_addr[i] =
876: adresse[i], i++);
877:
878: if (sem_post(&((*s_etat_processus)
879: .semaphore_fork)) != 0)
880: {
881: (*s_etat_processus).erreur_systeme = d_es_processus;
882: return;
883: }
884:
885: if (sendto((*((struct_socket *)
886: (*s_objet_argument_1).objet)).socket, chaine,
887: strlen(chaine), 0, (struct sockaddr *)
888: &adresse_ipv6, sizeof(adresse_ipv6)) < 0)
889: {
890: while(sem_wait(&((*s_etat_processus)
891: .semaphore_fork)) == -1)
892: {
893: if (errno != EINTR)
894: {
895: (*s_etat_processus).erreur_systeme =
896: d_es_processus;
897: return;
898: }
899: }
900:
901: (*s_etat_processus).erreur_systeme =
902: d_es_erreur_fichier;
903: return;
904: }
905:
906: while(sem_wait(&((*s_etat_processus)
907: .semaphore_fork)) == -1)
908: {
909: if (errno != EINTR)
910: {
911: (*s_etat_processus).erreur_systeme =
912: d_es_processus;
913: return;
914: }
915: }
916: }
917: else
918: {
919: liberation(s_etat_processus, s_objet_argument_1);
920: liberation(s_etat_processus, s_objet_argument_2);
921:
922: (*s_etat_processus).erreur_execution =
923: d_ex_erreur_parametre_fichier;
924: return;
925: }
926: }
927: else
928: {
929: liberation(s_etat_processus, s_objet_argument_1);
930: liberation(s_etat_processus, s_objet_argument_2);
931:
932: (*s_etat_processus).erreur_execution =
933: d_ex_erreur_parametre_fichier;
934: return;
935: }
936: }
937:
938: free(chaine);
939: }
940: else if ((*((struct_socket *) (*s_objet_argument_1).objet)).binaire
941: == 'Y')
942: {
943: /*
944: * Sockets non formatées
945: */
946: }
947: else
948: {
949: /*
950: * Sockets de type FLOW
951: */
952: }
953: }
954: else
955: {
956: liberation(s_etat_processus, s_objet_argument_2);
957: liberation(s_etat_processus, s_objet_argument_1);
958:
959: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
960: return;
961: }
962:
963: liberation(s_etat_processus, s_objet_argument_2);
964: liberation(s_etat_processus, s_objet_argument_1);
965:
966: return;
967: }
968:
969:
970: /*
971: ================================================================================
972: Fonction 'wflock'
973: ================================================================================
974: Entrées : pointeur sur une structure struct_processus
975: --------------------------------------------------------------------------------
976: Sorties :
977: --------------------------------------------------------------------------------
978: Effets de bord : néant
979: ================================================================================
980: */
981:
982: void
983: instruction_wflock(struct_processus *s_etat_processus)
984: {
985: file *descripteur;
986:
987: logical1 drapeau;
988:
989: struct flock lock;
990:
991: struct timespec attente;
992:
993: struct_objet *s_objet_argument_1;
994: struct_objet *s_objet_argument_2;
995:
996: unsigned char *chaine;
997: unsigned char registre_instruction_valide;
998:
999: attente.tv_sec = 0;
1000: attente.tv_nsec = GRANULARITE_us * 1000;
1001:
1002: (*s_etat_processus).erreur_execution = d_ex;
1003:
1004: if ((*s_etat_processus).affichage_arguments == 'Y')
1005: {
1006: printf("\n WFLOCK ");
1007:
1008: if ((*s_etat_processus).langue == 'F')
1009: {
1010: printf("(attente du positionnement d'un verrou sur un fichier)"
1011: "\n\n");
1012: }
1013: else
1014: {
1015: printf("(wait for file lock)\n\n");
1016: }
1017:
1018: printf(" 2: %s\n", d_FCH);
1019: printf(" 1: %s (READ/WRITE/NONE)\n", d_CHN);
1020:
1021: return;
1022: }
1023: else if ((*s_etat_processus).test_instruction == 'Y')
1024: {
1025: (*s_etat_processus).nombre_arguments = -1;
1026: return;
1027: }
1028:
1029: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1030: {
1031: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1032: {
1033: return;
1034: }
1035: }
1036:
1037: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1038: &s_objet_argument_1) == d_erreur)
1039: {
1040: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1041: return;
1042: }
1043:
1044: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1045: &s_objet_argument_2) == d_erreur)
1046: {
1047: liberation(s_etat_processus, s_objet_argument_1);
1048:
1049: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1050: return;
1051: }
1052:
1053: if (((*s_objet_argument_2).type == FCH) &&
1054: ((*s_objet_argument_1).type == CHN))
1055: {
1056: drapeau = d_faux;
1057:
1058: do
1059: {
1060: if ((chaine = conversion_majuscule((unsigned char *)
1061: (*s_objet_argument_1).objet)) == NULL)
1062: {
1063: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1064: return;
1065: }
1066:
1067: if (strcmp(chaine, "WRITE") == 0)
1068: {
1069: lock.l_type = F_WRLCK;
1070: }
1071: else if (strcmp(chaine, "READ") == 0)
1072: {
1073: lock.l_type = F_RDLCK;
1074: }
1075: else if (strcmp(chaine, "NONE") == 0)
1076: {
1077: lock.l_type = F_UNLCK;
1078: }
1079: else
1080: {
1081: free(chaine);
1082:
1083: liberation(s_etat_processus, s_objet_argument_1);
1084: liberation(s_etat_processus, s_objet_argument_2);
1085:
1086: (*s_etat_processus).erreur_execution = d_ex_verrou_indefini;
1087: return;
1088: }
1089:
1090: free(chaine);
1091:
1092: lock.l_whence = SEEK_SET;
1093: lock.l_start = 0;
1094: lock.l_len = 0;
1095: lock.l_pid = getpid();
1096:
1097: if ((descripteur = descripteur_fichier(s_etat_processus,
1098: (struct_fichier *) (*s_objet_argument_2).objet)) == NULL)
1099: {
1100: return;
1101: }
1102:
1103: if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1)
1104: {
1105: liberation(s_etat_processus, s_objet_argument_1);
1106: liberation(s_etat_processus, s_objet_argument_2);
1107:
1108: (*s_etat_processus).erreur_execution = d_ex_fichier_verrouille;
1109: return;
1110: }
1111:
1112: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1113: {
1114: (*s_etat_processus).erreur_systeme = d_es_processus;
1115: return;
1116: }
1117:
1118: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1119: {
1120: if (errno != EINTR)
1121: {
1122: (*s_etat_processus).erreur_systeme = d_es_processus;
1123: return;
1124: }
1125: }
1126:
1127: if (lock.l_type == F_UNLCK)
1128: {
1129: drapeau = d_vrai;
1130: }
1131: else
1132: {
1133: if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
1134: {
1135: affectation_interruptions_logicielles(s_etat_processus);
1136: }
1137:
1138: if ((*s_etat_processus).nombre_interruptions_en_queue
1139: != 0)
1140: {
1141: registre_instruction_valide =
1142: (*s_etat_processus).instruction_valide;
1143: traitement_interruptions_logicielles(
1144: s_etat_processus);
1145: (*s_etat_processus).instruction_valide =
1146: registre_instruction_valide;
1147: }
1148:
1149: nanosleep(&attente, NULL);
1150: scrutation_injection(s_etat_processus);
1151:
1152: INCR_GRANULARITE(attente.tv_nsec);
1153: }
1154: } while((drapeau == d_faux) && ((*s_etat_processus)
1155: .var_volatile_requete_arret != -1));
1156: }
1157: else
1158: {
1159: liberation(s_etat_processus, s_objet_argument_1);
1160: liberation(s_etat_processus, s_objet_argument_2);
1161:
1162: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1163: return;
1164: }
1165:
1166: return;
1167: }
1168:
1169:
1170: /*
1171: ================================================================================
1172: Fonction 'wfproc'
1173: ================================================================================
1174: Entrées : pointeur sur une structure struct_processus
1175: --------------------------------------------------------------------------------
1176: Sorties :
1177: --------------------------------------------------------------------------------
1178: Effets de bord : néant
1179: ================================================================================
1180: */
1181:
1182: void
1183: instruction_wfproc(struct_processus *s_etat_processus)
1184: {
1185: logical1 drapeau_fin;
1186:
1187: struct_liste_chainee *l_element_courant;
1188:
1189: struct_objet *s_objet_argument;
1190:
1191: struct timespec attente;
1192:
1193: unsigned char registre_instruction_valide;
1194:
1195: (*s_etat_processus).erreur_execution = d_ex;
1196:
1197: attente.tv_sec = 0;
1198: attente.tv_nsec = GRANULARITE_us * 1000;
1199:
1200: if ((*s_etat_processus).affichage_arguments == 'Y')
1201: {
1202: printf("\n WFPROC ");
1203:
1204: if ((*s_etat_processus).langue == 'F')
1205: {
1206: printf("(attente de la fin d'un processus fils)\n\n");
1207: }
1208: else
1209: {
1210: printf("(wait for child process end)\n\n");
1211: }
1212:
1213: printf(" 1: %s\n", d_PRC);
1214:
1215: return;
1216: }
1217: else if ((*s_etat_processus).test_instruction == 'Y')
1218: {
1219: (*s_etat_processus).nombre_arguments = -1;
1220: return;
1221: }
1222:
1223: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1224: {
1225: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1226: {
1227: return;
1228: }
1229: }
1230:
1231: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1232: &s_objet_argument) == d_erreur)
1233: {
1234: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1235: return;
1236: }
1237:
1238: if ((*s_objet_argument).type == PRC)
1239: {
1240: drapeau_fin = d_faux;
1241:
1242: if ((*s_etat_processus).profilage == d_vrai)
1243: {
1244: profilage(s_etat_processus, "Interprocess or interthread "
1245: "communications (WFPROC)");
1246:
1247: if ((*s_etat_processus).erreur_systeme != d_es)
1248: {
1249: return;
1250: }
1251: }
1252:
1253: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
1254: {
1255: if ((*s_etat_processus).profilage == d_vrai)
1256: {
1257: profilage(s_etat_processus, NULL);
1258: }
1259:
1260: (*s_etat_processus).erreur_systeme = d_es_processus;
1261: return;
1262: }
1263:
1264: while(drapeau_fin == d_faux)
1265: {
1266: l_element_courant = (struct_liste_chainee *)
1267: (*s_etat_processus).l_base_pile_processus;
1268:
1269: while(l_element_courant != NULL)
1270: {
1271: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
1272: .donnee).objet)).thread).processus_detache == d_vrai)
1273: {
1274: if ((*(*((struct_processus_fils *)
1275: (*s_objet_argument).objet)).thread)
1276: .processus_detache == d_vrai)
1277: {
1278: if ((*(*((struct_processus_fils *)
1279: (*(*l_element_courant)
1280: .donnee).objet)).thread).pid ==
1281: (*(*((struct_processus_fils *)
1282: (*s_objet_argument).objet)).thread).pid)
1283: {
1284: break;
1285: }
1286: }
1287: }
1288: else
1289: {
1290: if ((*(*((struct_processus_fils *)
1291: (*s_objet_argument).objet)).thread)
1292: .processus_detache == d_faux)
1293: {
1294: if ((pthread_equal((*(*((struct_processus_fils *)
1295: (*(*l_element_courant).donnee).objet)).thread)
1296: .tid, (*(*((struct_processus_fils *)
1297: (*s_objet_argument).objet)).thread).tid) != 0)
1298: && ((*(*((struct_processus_fils *)
1299: (*(*l_element_courant).donnee).objet)).thread)
1300: .pid == (*(*((struct_processus_fils *)
1301: (*s_objet_argument).objet)).thread).pid))
1302: {
1303: break;
1304: }
1305: }
1306: }
1307:
1308: l_element_courant = (*l_element_courant).suivant;
1309: }
1310:
1311: if ((*s_etat_processus).var_volatile_requete_arret != 0)
1312: {
1313: if ((*s_etat_processus).profilage == d_vrai)
1314: {
1315: profilage(s_etat_processus, NULL);
1316: }
1317:
1318: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
1319: {
1320: (*s_etat_processus).erreur_systeme = d_es_processus;
1321: return;
1322: }
1323:
1324: liberation(s_etat_processus, s_objet_argument);
1325: return;
1326: }
1327:
1328: if (l_element_courant == NULL)
1329: {
1330: /*
1331: * Si l_element_courant vaut NULL, le processus n'existe plus.
1332: */
1333:
1334: drapeau_fin = d_vrai;
1335: }
1336: else
1337: {
1338: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
1339: .donnee).objet)).thread).processus_detache == d_vrai)
1340: {
1341: if (kill((*(*((struct_processus_fils *)
1342: (*(*l_element_courant).donnee).objet)).thread).pid,
1343: 0) != 0)
1344: {
1345: drapeau_fin = d_vrai;
1346: }
1347: else
1348: {
1349: drapeau_fin = d_faux;
1350: }
1351: }
1352: else
1353: {
1354: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
1355: (*(*l_element_courant).donnee).objet)).thread)
1356: .mutex)) != 0)
1357: {
1358: if ((*s_etat_processus).profilage == d_vrai)
1359: {
1360: profilage(s_etat_processus, NULL);
1361: }
1362:
1363: (*s_etat_processus).erreur_systeme = d_es_processus;
1364: return;
1365: }
1366:
1367: if ((*(*((struct_processus_fils *)
1368: (*(*l_element_courant).donnee).objet)).thread)
1369: .thread_actif == d_faux)
1370: {
1371: drapeau_fin = d_vrai;
1372: }
1373: else
1374: {
1375: drapeau_fin = d_faux;
1376: }
1377:
1378: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
1379: (*(*l_element_courant).donnee).objet)).thread)
1380: .mutex)) != 0)
1381: {
1382: if ((*s_etat_processus).profilage == d_vrai)
1383: {
1384: profilage(s_etat_processus, NULL);
1385: }
1386:
1387: (*s_etat_processus).erreur_systeme = d_es_processus;
1388: return;
1389: }
1390: }
1391:
1392: if (drapeau_fin == d_faux)
1393: {
1394: /*
1395: * Le processus n'est pas terminé
1396: */
1397:
1398: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
1399: {
1400: if ((*s_etat_processus).profilage == d_vrai)
1401: {
1402: profilage(s_etat_processus, NULL);
1403: }
1404:
1405: (*s_etat_processus).erreur_systeme =
1406: d_es_processus;
1407: return;
1408: }
1409:
1410: if ((*s_etat_processus).nombre_interruptions_non_affectees
1411: != 0)
1412: {
1413: affectation_interruptions_logicielles(s_etat_processus);
1414: }
1415:
1416: if ((*s_etat_processus).nombre_interruptions_en_queue
1417: != 0)
1418: {
1419: registre_instruction_valide =
1420: (*s_etat_processus).instruction_valide;
1421: traitement_interruptions_logicielles(
1422: s_etat_processus);
1423: (*s_etat_processus).instruction_valide =
1424: registre_instruction_valide;
1425: }
1426:
1427: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1428: {
1429: (*s_etat_processus).erreur_systeme = d_es_processus;
1430: return;
1431: }
1432:
1433: nanosleep(&attente, NULL);
1434:
1435: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1436: {
1437: if (errno != EINTR)
1438: {
1439: (*s_etat_processus).erreur_systeme = d_es_processus;
1440: return;
1441: }
1442: }
1443:
1444: scrutation_injection(s_etat_processus);
1445:
1446: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
1447: {
1448: if ((*s_etat_processus).profilage == d_vrai)
1449: {
1450: profilage(s_etat_processus, NULL);
1451: }
1452:
1453: (*s_etat_processus).erreur_systeme =
1454: d_es_processus;
1455: return;
1456: }
1457: }
1458: }
1459:
1460: INCR_GRANULARITE(attente.tv_nsec);
1461: }
1462:
1463: if ((*s_etat_processus).profilage == d_vrai)
1464: {
1465: profilage(s_etat_processus, NULL);
1466: }
1467:
1468: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
1469: {
1470: (*s_etat_processus).erreur_systeme = d_es_processus;
1471: return;
1472: }
1473: }
1474: else
1475: {
1476: liberation(s_etat_processus, s_objet_argument);
1477:
1478: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1479: return;
1480: }
1481:
1482: liberation(s_etat_processus, s_objet_argument);
1483:
1484: return;
1485: }
1486:
1487:
1488: /*
1489: ================================================================================
1490: Fonction 'wfdata'
1491: ================================================================================
1492: Entrées : pointeur sur une structure struct_processus
1493: --------------------------------------------------------------------------------
1494: Sorties :
1495: --------------------------------------------------------------------------------
1496: Effets de bord : néant
1497: ================================================================================
1498: */
1499:
1500: void
1501: instruction_wfdata(struct_processus *s_etat_processus)
1502: {
1503: logical1 drapeau_fin;
1504:
1505: struct_liste_chainee *l_element_courant;
1506:
1507: struct_objet *s_objet_argument;
1508:
1509: struct timespec attente;
1510:
1511: unsigned char registre_instruction_valide;
1512:
1513: (*s_etat_processus).erreur_execution = d_ex;
1514:
1515: attente.tv_sec = 0;
1516: attente.tv_nsec = GRANULARITE_us * 1000;
1517:
1518: if ((*s_etat_processus).affichage_arguments == 'Y')
1519: {
1520: printf("\n WFDATA ");
1521:
1522: if ((*s_etat_processus).langue == 'F')
1523: {
1524: printf("(attente de données d'un processus fils)\n\n");
1525: }
1526: else
1527: {
1528: printf("(wait for data from child process)\n\n");
1529: }
1530:
1531: printf(" 1: %s\n", d_PRC);
1532:
1533: return;
1534: }
1535: else if ((*s_etat_processus).test_instruction == 'Y')
1536: {
1537: (*s_etat_processus).nombre_arguments = -1;
1538: return;
1539: }
1540:
1541: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1542: {
1543: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1544: {
1545: return;
1546: }
1547: }
1548:
1549: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1550: &s_objet_argument) == d_erreur)
1551: {
1552: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1553: return;
1554: }
1555:
1556: if ((*s_objet_argument).type == PRC)
1557: {
1558: drapeau_fin = d_faux;
1559:
1560: if ((*s_etat_processus).profilage == d_vrai)
1561: {
1562: profilage(s_etat_processus, "Interprocess or interthread "
1563: "communications (WFDATA)");
1564:
1565: if ((*s_etat_processus).erreur_systeme != d_es)
1566: {
1567: return;
1568: }
1569: }
1570:
1571: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
1572: {
1573: if ((*s_etat_processus).profilage == d_vrai)
1574: {
1575: profilage(s_etat_processus, NULL);
1576: }
1577:
1578: (*s_etat_processus).erreur_systeme = d_es_processus;
1579: return;
1580: }
1581:
1582: while(drapeau_fin == d_faux)
1583: {
1584: l_element_courant = (struct_liste_chainee *)
1585: (*s_etat_processus).l_base_pile_processus;
1586:
1587: while(l_element_courant != NULL)
1588: {
1589: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
1590: .donnee).objet)).thread).processus_detache == d_vrai)
1591: {
1592: if (((*(*((struct_processus_fils *) (*(*l_element_courant)
1593: .donnee).objet)).thread).pid ==
1594: (*(*((struct_processus_fils *)
1595: (*s_objet_argument).objet)).thread).pid)
1596: && ((*(*((struct_processus_fils *)
1597: (*s_objet_argument).objet)).thread)
1598: .processus_detache == d_vrai))
1599: {
1600: break;
1601: }
1602: }
1603: else
1604: {
1605: if ((pthread_equal((*(*((struct_processus_fils *)
1606: (*(*l_element_courant).donnee).objet)).thread).tid,
1607: (*(*((struct_processus_fils *) (*s_objet_argument)
1608: .objet)).thread).tid) != 0) &&
1609: ((*(*((struct_processus_fils *)
1610: (*(*l_element_courant).donnee).objet)).thread).pid
1611: == (*(*((struct_processus_fils *)
1612: (*s_objet_argument).objet)).thread).pid) &&
1613: ((*(*((struct_processus_fils *)
1614: (*s_objet_argument).objet)).thread)
1615: .processus_detache == d_faux))
1616: {
1617: break;
1618: }
1619: }
1620:
1621: l_element_courant = (*l_element_courant).suivant;
1622: }
1623:
1624: if ((*s_etat_processus).var_volatile_requete_arret != 0)
1625: {
1626: if ((*s_etat_processus).profilage == d_vrai)
1627: {
1628: profilage(s_etat_processus, NULL);
1629: }
1630:
1631: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
1632: {
1633: (*s_etat_processus).erreur_systeme = d_es_processus;
1634: return;
1635: }
1636:
1637: liberation(s_etat_processus, s_objet_argument);
1638: return;
1639: }
1640:
1641: if (l_element_courant != NULL)
1642: {
1643: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
1644: (*(*l_element_courant).donnee).objet)).thread).mutex))
1645: != 0)
1646: {
1647: (*s_etat_processus).erreur_systeme = d_es_processus;
1648: return;
1649: }
1650:
1651: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
1652: .donnee).objet)).thread).nombre_objets_dans_pipe != 0)
1653: {
1654: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
1655: (*(*l_element_courant).donnee).objet)).thread)
1656: .mutex)) != 0)
1657: {
1658: (*s_etat_processus).erreur_systeme = d_es_processus;
1659: return;
1660: }
1661:
1662: drapeau_fin = d_vrai;
1663: }
1664: else
1665: {
1666: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
1667: (*(*l_element_courant).donnee).objet)).thread)
1668: .mutex)) != 0)
1669: {
1670: (*s_etat_processus).erreur_systeme = d_es_processus;
1671: return;
1672: }
1673:
1674: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
1675: {
1676: if ((*s_etat_processus).profilage == d_vrai)
1677: {
1678: profilage(s_etat_processus, NULL);
1679: }
1680:
1681: (*s_etat_processus).erreur_systeme =
1682: d_es_processus;
1683: return;
1684: }
1685:
1686: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1687: {
1688: (*s_etat_processus).erreur_systeme = d_es_processus;
1689: return;
1690: }
1691:
1692: nanosleep(&attente, NULL);
1693:
1694: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1695: {
1696: if (errno != EINTR)
1697: {
1698: (*s_etat_processus).erreur_systeme = d_es_processus;
1699: return;
1700: }
1701: }
1702:
1703: scrutation_injection(s_etat_processus);
1704:
1705: if ((*s_etat_processus).nombre_interruptions_non_affectees
1706: != 0)
1707: {
1708: affectation_interruptions_logicielles(s_etat_processus);
1709: }
1710:
1711: if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
1712: {
1713: registre_instruction_valide =
1714: (*s_etat_processus).instruction_valide;
1715: traitement_interruptions_logicielles(s_etat_processus);
1716: (*s_etat_processus).instruction_valide =
1717: registre_instruction_valide;
1718: }
1719:
1720: if ((*s_etat_processus).var_volatile_requete_arret != 0)
1721: {
1722: if ((*s_etat_processus).profilage == d_vrai)
1723: {
1724: profilage(s_etat_processus, NULL);
1725: }
1726:
1727: return;
1728: }
1729:
1730: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
1731: {
1732: if ((*s_etat_processus).profilage == d_vrai)
1733: {
1734: profilage(s_etat_processus, NULL);
1735: }
1736:
1737: (*s_etat_processus).erreur_systeme =
1738: d_es_processus;
1739: return;
1740: }
1741: }
1742: }
1743: else
1744: {
1745: drapeau_fin = d_vrai;
1746: (*s_etat_processus).erreur_execution = d_ex_processus;
1747: }
1748:
1749: INCR_GRANULARITE(attente.tv_nsec);
1750: }
1751:
1752: if ((*s_etat_processus).profilage == d_vrai)
1753: {
1754: profilage(s_etat_processus, NULL);
1755: }
1756:
1757: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
1758: {
1759: (*s_etat_processus).erreur_systeme = d_es_processus;
1760: return;
1761: }
1762: }
1763: else
1764: {
1765: liberation(s_etat_processus, s_objet_argument);
1766:
1767: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1768: return;
1769: }
1770:
1771: liberation(s_etat_processus, s_objet_argument);
1772:
1773: return;
1774: }
1775:
1776:
1777: /*
1778: ================================================================================
1779: Fonction 'wfsock'
1780: ================================================================================
1781: Entrées : pointeur sur une structure struct_processus
1782: --------------------------------------------------------------------------------
1783: Sorties :
1784: --------------------------------------------------------------------------------
1785: Effets de bord : néant
1786: ================================================================================
1787: */
1788:
1789: void
1790: instruction_wfsock(struct_processus *s_etat_processus)
1791: {
1792: int erreur;
1793:
1794: logical1 drapeau;
1795:
1796: socklen_t longueur;
1797:
1798: struct_liste_chainee *l_element_courant;
1799:
1800: struct_objet *s_objet_argument;
1801: struct_objet *s_objet_resultat;
1802:
1803: struct sockaddr_in adresse_ipv4;
1804: struct sockaddr_in6 adresse_ipv6;
1805:
1806: unsigned long i;
1807:
1808: if ((*s_etat_processus).affichage_arguments == 'Y')
1809: {
1810: printf("\n WFSOCK ");
1811:
1812: if ((*s_etat_processus).langue == 'F')
1813: {
1814: printf("(attente d'une connexion sur une socket)\n\n");
1815: }
1816: else
1817: {
1818: printf("(wait for connection on a socket)\n\n");
1819: }
1820:
1821: printf(" 1: %s\n", d_SCK);
1822: printf("-> 2: %s\n", d_SCK);
1823: printf(" 1: %s\n", d_SCK);
1824:
1825: return;
1826: }
1827: else if ((*s_etat_processus).test_instruction == 'Y')
1828: {
1829: (*s_etat_processus).nombre_arguments = -1;
1830: return;
1831: }
1832:
1833: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1834: {
1835: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1836: {
1837: return;
1838: }
1839: }
1840:
1841: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1842: &s_objet_argument) == d_erreur)
1843: {
1844: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1845: return;
1846: }
1847:
1848: if ((*s_objet_argument).type == SCK)
1849: {
1850: if ((strcmp((*((struct_socket *) (*s_objet_argument).objet)).type,
1851: "STREAM") != 0) && (strcmp((*((struct_socket *)
1852: (*s_objet_argument).objet)).type, "SEQUENTIAL DATAGRAM") != 0))
1853: {
1854: liberation(s_etat_processus, s_objet_argument);
1855:
1856: (*s_etat_processus).erreur_execution = d_ex_erreur_acces_fichier;
1857: return;
1858: }
1859:
1860: if ((s_objet_resultat = copie_objet(s_etat_processus, s_objet_argument,
1861: 'O')) == NULL)
1862: {
1863: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1864: return;
1865: }
1866:
1867: (*((struct_socket *) (*s_objet_resultat).objet)).socket_en_ecoute = 'N';
1868: (*((struct_socket *) (*s_objet_resultat).objet)).effacement = 'N';
1869:
1870: if ((*((struct_socket *) (*s_objet_resultat).objet)).domaine == PF_INET)
1871: {
1872: longueur = sizeof(adresse_ipv4);
1873:
1874: do
1875: {
1876: drapeau = d_vrai;
1877:
1878: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1879: {
1880: (*s_etat_processus).erreur_systeme = d_es_processus;
1881: return;
1882: }
1883:
1884: if (((*((struct_socket *) (*s_objet_resultat).objet)).socket =
1885: accept((*((struct_socket *) (*s_objet_argument).objet))
1886: .socket, (struct sockaddr *) &adresse_ipv4, &longueur))
1887: < 0)
1888: {
1889: erreur = errno;
1890:
1891: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1892: {
1893: if (errno != EINTR)
1894: {
1895: (*s_etat_processus).erreur_systeme = d_es_processus;
1896: return;
1897: }
1898: }
1899:
1900: if (erreur != EINTR)
1901: {
1902: liberation(s_etat_processus, s_objet_argument);
1903: liberation(s_etat_processus, s_objet_resultat);
1904:
1905: (*s_etat_processus).erreur_execution =
1906: d_ex_erreur_acces_fichier;
1907: return;
1908: }
1909:
1910: scrutation_injection(s_etat_processus);
1911:
1912: if ((*s_etat_processus).var_volatile_requete_arret != 0)
1913: {
1914: drapeau = d_vrai;
1915: }
1916: else
1917: {
1918: drapeau = d_faux;
1919: }
1920: }
1921: else
1922: {
1923: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1924: {
1925: if (errno != EINTR)
1926: {
1927: (*s_etat_processus).erreur_systeme = d_es_processus;
1928: return;
1929: }
1930: }
1931: }
1932: } while(drapeau == d_faux);
1933:
1934: if (((*((struct_socket *) (*s_objet_resultat).objet))
1935: .adresse_distante = malloc(22 *
1936: sizeof(unsigned char))) == NULL)
1937: {
1938: (*s_etat_processus).erreur_systeme =
1939: d_es_allocation_memoire;
1940: return;
1941: }
1942:
1943: sprintf((*((struct_socket *) (*s_objet_resultat).objet))
1944: .adresse_distante, "%d.%d.%d.%d(%d)",
1945: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 24) & 0xFF,
1946: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 16) & 0xFF,
1947: (ntohl(adresse_ipv4.sin_addr.s_addr) >> 8) & 0xFF,
1948: ntohl(adresse_ipv4.sin_addr.s_addr) & 0xFF,
1949: ntohs(adresse_ipv4.sin_port));
1950: }
1951: else if ((*((struct_socket *) (*s_objet_resultat).objet)).domaine ==
1952: PF_INET6)
1953: {
1954: longueur = sizeof(adresse_ipv6);
1955:
1956: do
1957: {
1958: drapeau = d_vrai;
1959:
1960: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
1961: {
1962: (*s_etat_processus).erreur_systeme = d_es_processus;
1963: return;
1964: }
1965:
1966: if (((*((struct_socket *) (*s_objet_resultat).objet)).socket =
1967: accept((*((struct_socket *) (*s_objet_argument).objet))
1968: .socket, (struct sockaddr *) &adresse_ipv6, &longueur))
1969: < 0)
1970: {
1971: erreur = errno;
1972:
1973: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
1974: {
1975: if (errno != EINTR)
1976: {
1977: (*s_etat_processus).erreur_systeme = d_es_processus;
1978: return;
1979: }
1980: }
1981:
1982: if (erreur != EINTR)
1983: {
1984: liberation(s_etat_processus, s_objet_argument);
1985: liberation(s_etat_processus, s_objet_resultat);
1986:
1987: (*s_etat_processus).erreur_execution =
1988: d_ex_erreur_acces_fichier;
1989: return;
1990: }
1991:
1992: scrutation_injection(s_etat_processus);
1993:
1994: if ((*s_etat_processus).var_volatile_requete_arret != 0)
1995: {
1996: drapeau = d_vrai;
1997: }
1998: else
1999: {
2000: drapeau = d_faux;
2001: }
2002: }
2003: else
2004: {
2005: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
2006: {
2007: if (errno != EINTR)
2008: {
2009: (*s_etat_processus).erreur_systeme = d_es_processus;
2010: return;
2011: }
2012: }
2013: }
2014: } while(drapeau == d_faux);
2015:
2016: if (((*((struct_socket *) (*s_objet_resultat).objet))
2017: .adresse_distante = malloc(55 *
2018: sizeof(unsigned char))) == NULL)
2019: {
2020: (*s_etat_processus).erreur_systeme =
2021: d_es_allocation_memoire;
2022: return;
2023: }
2024:
2025: (*((struct_socket *) (*s_objet_resultat).objet))
2026: .adresse_distante = d_code_fin_chaine;
2027:
2028: for(i = 0; i < 16; i++)
2029: {
2030: sprintf((*((struct_socket *) (*s_objet_resultat)
2031: .objet)).adresse_distante, (i == 0) ? "%s%X" : "%s:%X",
2032: (*((struct_socket *) (*s_objet_resultat)
2033: .objet)).adresse_distante,
2034: adresse_ipv6.sin6_addr.s6_addr[i]);
2035: }
2036:
2037: sprintf((*((struct_socket *) (*s_objet_resultat)
2038: .objet)).adresse_distante, "%s(%u)",
2039: (*((struct_socket *) (*s_objet_resultat)
2040: .objet)).adresse_distante, ntohs(adresse_ipv6.sin6_port));
2041: }
2042: else
2043: {
2044: longueur = 0;
2045:
2046: do
2047: {
2048: drapeau = d_vrai;
2049:
2050: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
2051: {
2052: (*s_etat_processus).erreur_systeme = d_es_processus;
2053: return;
2054: }
2055:
2056: if (((*((struct_socket *) (*s_objet_resultat).objet)).socket =
2057: accept((*((struct_socket *) (*s_objet_argument).objet))
2058: .socket, NULL, &longueur)) < 0)
2059: {
2060: erreur = errno;
2061:
2062: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
2063: {
2064: if (errno != EINTR)
2065: {
2066: (*s_etat_processus).erreur_systeme = d_es_processus;
2067: return;
2068: }
2069: }
2070:
2071: if (erreur != EINTR)
2072: {
2073: liberation(s_etat_processus, s_objet_argument);
2074: liberation(s_etat_processus, s_objet_resultat);
2075:
2076: (*s_etat_processus).erreur_execution =
2077: d_ex_erreur_acces_fichier;
2078: return;
2079: }
2080:
2081: scrutation_injection(s_etat_processus);
2082:
2083: if ((*s_etat_processus).var_volatile_requete_arret != 0)
2084: {
2085: drapeau = d_vrai;
2086: }
2087: else
2088: {
2089: drapeau = d_faux;
2090: }
2091: }
2092: else
2093: {
2094: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
2095: {
2096: if (errno != EINTR)
2097: {
2098: (*s_etat_processus).erreur_systeme = d_es_processus;
2099: return;
2100: }
2101: }
2102: }
2103: } while(drapeau == d_faux);
2104: }
2105:
2106: // Si accept() renvoie une erreur non récupérée, il ne peut s'agir
2107: // que de EINTR sachant qu'une requête d'arrêt est en court de
2108: // traitement.
2109:
2110: if ((*((struct_socket *) (*s_objet_resultat).objet)).socket >= 0)
2111: {
2112: l_element_courant = (*s_etat_processus).s_sockets;
2113:
2114: if (l_element_courant == NULL)
2115: {
2116: if (((*s_etat_processus).s_sockets =
2117: allocation_maillon(s_etat_processus)) == NULL)
2118: {
2119: (*s_etat_processus).erreur_systeme =
2120: d_es_allocation_memoire;
2121: return;
2122: }
2123:
2124: (*(*s_etat_processus).s_sockets).suivant = NULL;
2125: l_element_courant = (*s_etat_processus).s_sockets;
2126: }
2127: else
2128: {
2129: /*
2130: * Ajout d'un élément à la fin de la liste chaînée
2131: */
2132:
2133: while((*l_element_courant).suivant != NULL)
2134: {
2135: l_element_courant = (*l_element_courant).suivant;
2136: }
2137:
2138: if (((*l_element_courant).suivant =
2139: allocation_maillon(s_etat_processus)) == NULL)
2140: {
2141: (*s_etat_processus).erreur_systeme =
2142: d_es_allocation_memoire;
2143: return;
2144: }
2145:
2146: l_element_courant = (*l_element_courant).suivant;
2147: (*l_element_courant).suivant = NULL;
2148: }
2149:
2150: if (((*l_element_courant).donnee = copie_objet(s_etat_processus,
2151: s_objet_resultat, 'O')) == NULL)
2152: {
2153: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
2154: return;
2155: }
2156: }
2157:
2158: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2159: s_objet_argument) == d_erreur)
2160: {
2161: return;
2162: }
2163:
2164: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2165: s_objet_resultat) == d_erreur)
2166: {
2167: return;
2168: }
2169: }
2170: else
2171: {
2172: liberation(s_etat_processus, s_objet_argument);
2173:
2174: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2175: return;
2176: }
2177:
2178: return;
2179: }
2180:
2181:
2182: /*
2183: ================================================================================
2184: Fonction 'wfswi'
2185: ================================================================================
2186: Entrées : pointeur sur une structure struct_processus
2187: --------------------------------------------------------------------------------
2188: Sorties :
2189: --------------------------------------------------------------------------------
2190: Effets de bord : néant
2191: ================================================================================
2192: */
2193:
2194: void
2195: instruction_wfswi(struct_processus *s_etat_processus)
2196: {
2197: integer8 interruption;
2198:
2199: logical1 drapeau_fin;
2200:
2201: struct_objet *s_objet_argument;
2202:
2203: struct timespec attente;
2204:
2205: (*s_etat_processus).erreur_execution = d_ex;
2206:
2207: attente.tv_sec = 0;
2208: attente.tv_nsec = GRANULARITE_us * 1000;
2209:
2210: if ((*s_etat_processus).affichage_arguments == 'Y')
2211: {
2212: printf("\n WFSWI ");
2213:
2214: if ((*s_etat_processus).langue == 'F')
2215: {
2216: printf("(attente d'une interruption)\n\n");
2217: }
2218: else
2219: {
2220: printf("(wait for interrupt)\n\n");
2221: }
2222:
2223: printf(" 1: %s\n", d_INT);
2224:
2225: return;
2226: }
2227: else if ((*s_etat_processus).test_instruction == 'Y')
2228: {
2229: (*s_etat_processus).nombre_arguments = -1;
2230: return;
2231: }
2232:
2233: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2234: {
2235: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
2236: {
2237: return;
2238: }
2239: }
2240:
2241: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
2242: &s_objet_argument) == d_erreur)
2243: {
2244: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
2245: return;
2246: }
2247:
2248: if ((*s_objet_argument).type == INT)
2249: {
2250: drapeau_fin = d_faux;
2251:
2252: interruption = (*((integer8 *) (*s_objet_argument).objet));
2253:
2254: if ((interruption < 1) || (interruption > d_NOMBRE_INTERRUPTIONS))
2255: {
2256: liberation(s_etat_processus, s_objet_argument);
2257:
2258: (*s_etat_processus).erreur_execution = d_ex_interruption_invalide;
2259: return;
2260: }
2261:
2262: while(drapeau_fin == d_faux)
2263: {
2264: if ((*s_etat_processus).var_volatile_requete_arret != 0)
2265: {
2266: liberation(s_etat_processus, s_objet_argument);
2267: return;
2268: }
2269:
2270: if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
2271: {
2272: affectation_interruptions_logicielles(s_etat_processus);
2273: }
2274:
2275: if ((*s_etat_processus).queue_interruptions[interruption - 1] > 0)
2276: {
2277: drapeau_fin = d_vrai;
2278: }
2279: else
2280: {
2281: nanosleep(&attente, NULL);
2282: scrutation_injection(s_etat_processus);
2283: INCR_GRANULARITE(attente.tv_nsec);
2284: }
2285: }
2286: }
2287: else
2288: {
2289: liberation(s_etat_processus, s_objet_argument);
2290:
2291: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
2292: return;
2293: }
2294:
2295: liberation(s_etat_processus, s_objet_argument);
2296:
2297: return;
2298: }
2299:
2300:
2301: /*
2302: ================================================================================
2303: Fonction 'wfpoke'
2304: ================================================================================
2305: Entrées : pointeur sur une structure struct_processus
2306: --------------------------------------------------------------------------------
2307: Sorties :
2308: --------------------------------------------------------------------------------
2309: Effets de bord : néant
2310: ================================================================================
2311: */
2312:
2313: void
2314: instruction_wfpoke(struct_processus *s_etat_processus)
2315: {
2316: struct timespec attente;
2317:
2318: unsigned char registre_instruction_valide;
2319:
2320: (*s_etat_processus).erreur_execution = d_ex;
2321:
2322: attente.tv_sec = 0;
2323: attente.tv_nsec = GRANULARITE_us * 1000;
2324:
2325: if ((*s_etat_processus).affichage_arguments == 'Y')
2326: {
2327: printf("\n WFPOKE ");
2328:
2329: if ((*s_etat_processus).langue == 'F')
2330: {
2331: printf("(attente de données en provenance du processus père)\n\n");
2332: printf(" Aucun argument\n");
2333: }
2334: else
2335: {
2336: printf("(wait for data from parent process)\n\n");
2337: printf(" No argument\n");
2338: }
2339:
2340: return;
2341: }
2342: else if ((*s_etat_processus).test_instruction == 'Y')
2343: {
2344: (*s_etat_processus).nombre_arguments = -1;
2345: return;
2346: }
2347:
2348: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2349: {
2350: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2351: {
2352: return;
2353: }
2354: }
2355:
2356: if ((*s_etat_processus).presence_pipes == d_faux)
2357: {
2358: (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere;
2359: return;
2360: }
2361:
2362: if ((*s_etat_processus).nombre_objets_injectes > 0)
2363: {
2364: return;
2365: }
2366:
2367: if ((*s_etat_processus).profilage == d_vrai)
2368: {
2369: profilage(s_etat_processus, "Interprocess or interthread "
2370: "communications (WFPOKE)");
2371:
2372: if ((*s_etat_processus).erreur_systeme != d_es)
2373: {
2374: return;
2375: }
2376: }
2377:
2378: do
2379: {
2380: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
2381: {
2382: (*s_etat_processus).erreur_systeme = d_es_processus;
2383: return;
2384: }
2385:
2386: nanosleep(&attente, NULL);
2387:
2388: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
2389: {
2390: if (errno != EINTR)
2391: {
2392: (*s_etat_processus).erreur_systeme = d_es_processus;
2393: return;
2394: }
2395: }
2396:
2397: scrutation_injection(s_etat_processus);
2398:
2399: if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
2400: {
2401: affectation_interruptions_logicielles(s_etat_processus);
2402: }
2403:
2404: if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
2405: {
2406: registre_instruction_valide =
2407: (*s_etat_processus).instruction_valide;
2408: traitement_interruptions_logicielles(s_etat_processus);
2409: (*s_etat_processus).instruction_valide =
2410: registre_instruction_valide;
2411: }
2412:
2413: if ((*s_etat_processus).var_volatile_requete_arret != 0)
2414: {
2415: if ((*s_etat_processus).profilage == d_vrai)
2416: {
2417: profilage(s_etat_processus, NULL);
2418: }
2419:
2420: return;
2421: }
2422:
2423: INCR_GRANULARITE(attente.tv_nsec);
2424: } while((*s_etat_processus).nombre_objets_injectes == 0);
2425:
2426: return;
2427: }
2428:
2429:
2430: /*
2431: ================================================================================
2432: Fonction 'wfack'
2433: ================================================================================
2434: Entrées : pointeur sur une structure struct_processus
2435: --------------------------------------------------------------------------------
2436: Sorties :
2437: --------------------------------------------------------------------------------
2438: Effets de bord : néant
2439: ================================================================================
2440: */
2441:
2442: void
2443: instruction_wfack(struct_processus *s_etat_processus)
2444: {
2445: struct timespec attente;
2446:
2447: unsigned char registre_instruction_valide;
2448:
2449: (*s_etat_processus).erreur_execution = d_ex;
2450:
2451: attente.tv_sec = 0;
2452: attente.tv_nsec = GRANULARITE_us * 1000;
2453:
2454: if ((*s_etat_processus).affichage_arguments == 'Y')
2455: {
2456: printf("\n WFACK ");
2457:
2458: if ((*s_etat_processus).langue == 'F')
2459: {
2460: printf("(attente des acquittements de lecture)\n\n");
2461: printf(" Aucun argument\n");
2462: }
2463: else
2464: {
2465: printf("(wait for reading of data acknowledgement)\n\n");
2466: printf(" No argument\n");
2467: }
2468:
2469: return;
2470: }
2471: else if ((*s_etat_processus).test_instruction == 'Y')
2472: {
2473: (*s_etat_processus).nombre_arguments = -1;
2474: return;
2475: }
2476:
2477: if (test_cfsf(s_etat_processus, 31) == d_vrai)
2478: {
2479: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
2480: {
2481: return;
2482: }
2483: }
2484:
2485: if ((*s_etat_processus).presence_pipes == d_faux)
2486: {
2487: (*s_etat_processus).erreur_execution = d_ex_absence_processus_pere;
2488: return;
2489: }
2490:
2491: if ((*s_etat_processus).profilage == d_vrai)
2492: {
2493: profilage(s_etat_processus, "Interprocess or interthread communications"
2494: " (WFACK)");
2495:
2496: if ((*s_etat_processus).erreur_systeme != d_es)
2497: {
2498: return;
2499: }
2500: }
2501:
2502: while((*s_etat_processus).nombre_objets_envoyes_non_lus != 0)
2503: {
2504: scrutation_injection(s_etat_processus);
2505:
2506: if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
2507: {
2508: affectation_interruptions_logicielles(s_etat_processus);
2509: }
2510:
2511: if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
2512: {
2513: registre_instruction_valide =
2514: (*s_etat_processus).instruction_valide;
2515: traitement_interruptions_logicielles(s_etat_processus);
2516: (*s_etat_processus).instruction_valide =
2517: registre_instruction_valide;
2518: }
2519:
2520: if ((*s_etat_processus).var_volatile_requete_arret != 0)
2521: {
2522: if ((*s_etat_processus).profilage == d_vrai)
2523: {
2524: profilage(s_etat_processus, NULL);
2525: }
2526:
2527: return;
2528: }
2529:
2530: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
2531: {
2532: (*s_etat_processus).erreur_systeme = d_es_processus;
2533: return;
2534: }
2535:
2536: nanosleep(&attente, NULL);
2537: INCR_GRANULARITE(attente.tv_nsec);
2538:
2539: while(sem_wait(&((*s_etat_processus).semaphore_fork)) == -1)
2540: {
2541: if (errno != EINTR)
2542: {
2543: (*s_etat_processus).erreur_systeme = d_es_processus;
2544: return;
2545: }
2546: }
2547: }
2548:
2549: if ((*s_etat_processus).profilage == d_vrai)
2550: {
2551: profilage(s_etat_processus, NULL);
2552: }
2553:
2554: return;
2555: }
2556:
2557: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>