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