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