1: /*
2: ================================================================================
3: RPL/2 (R) version 4.1.3
4: Copyright (C) 1989-2011 Dr. BERTRAND Joël
5:
6: This file is part of RPL/2.
7:
8: RPL/2 is free software; you can redistribute it and/or modify it
9: under the terms of the CeCILL V2 License as published by the french
10: CEA, CNRS and INRIA.
11:
12: RPL/2 is distributed in the hope that it will be useful, but WITHOUT
13: ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14: FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License
15: for more details.
16:
17: You should have received a copy of the CeCILL License
18: along with RPL/2. If not, write to info@cecill.info.
19: ================================================================================
20: */
21:
22:
23: #include "rpl-conv.h"
24:
25:
26: /*
27: ================================================================================
28: Fonction 'protect'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_protect(struct_processus *s_etat_processus)
40: {
41: struct_liste_chainee *l_element_courant;
42:
43: struct_objet *s_objet;
44:
45: (*s_etat_processus).erreur_execution = d_ex;
46:
47: if ((*s_etat_processus).affichage_arguments == 'Y')
48: {
49: printf("\n PROTECT ");
50:
51: if ((*s_etat_processus).langue == 'F')
52: {
53: printf("(verrouille une variable)\n\n");
54: }
55: else
56: {
57: printf("(lock a variable)\n\n");
58: }
59:
60: printf(" 1: %s, %s\n", d_NOM, d_LST);
61:
62: return;
63: }
64: else if ((*s_etat_processus).test_instruction == 'Y')
65: {
66: (*s_etat_processus).nombre_arguments = -1;
67: return;
68: }
69:
70: if (test_cfsf(s_etat_processus, 31) == d_vrai)
71: {
72: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
73: {
74: return;
75: }
76: }
77:
78: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
79: &s_objet) == d_erreur)
80: {
81: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
82: return;
83: }
84:
85: if ((*s_objet).type == NOM)
86: {
87: if (recherche_variable(s_etat_processus, ((*((struct_nom *)
88: (*s_objet).objet)).nom)) == d_faux)
89: {
90: liberation(s_etat_processus, s_objet);
91:
92: (*s_etat_processus).erreur_systeme = d_es;
93: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
94: return;
95: }
96:
97: (*(*s_etat_processus).pointeur_variable_courante)
98: .variable_verrouillee = d_vrai;
99: }
100: else if ((*s_objet).type == LST)
101: {
102: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
103:
104: while(l_element_courant != NULL)
105: {
106: if ((*(*l_element_courant).donnee).type != NOM)
107: {
108: liberation(s_etat_processus, s_objet);
109:
110: (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
111: return;
112: }
113:
114: if (recherche_variable(s_etat_processus, (*((struct_nom *)
115: (*(*l_element_courant).donnee).objet)).nom) == d_faux)
116: {
117: liberation(s_etat_processus, s_objet);
118:
119: (*s_etat_processus).erreur_systeme = d_es;
120: (*s_etat_processus).erreur_execution =
121: d_ex_variable_non_definie;
122: return;
123: }
124:
125: (*(*s_etat_processus).pointeur_variable_courante)
126: .variable_verrouillee = d_vrai;
127:
128: l_element_courant = (*l_element_courant).suivant;
129: }
130: }
131: else
132: {
133: liberation(s_etat_processus, s_objet);
134:
135: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
136: return;
137: }
138:
139: liberation(s_etat_processus, s_objet);
140:
141: return;
142: }
143:
144:
145: /*
146: ================================================================================
147: Fonction 'parameter'
148: ================================================================================
149: Entrées :
150: --------------------------------------------------------------------------------
151: Sorties :
152: --------------------------------------------------------------------------------
153: Effets de bord : néant
154: ================================================================================
155: */
156:
157: void
158: instruction_parameter(struct_processus *s_etat_processus)
159: {
160: struct_liste_chainee *l_element_courant;
161:
162: struct_objet *s_objet;
163:
164: (*s_etat_processus).erreur_execution = d_ex;
165:
166: if ((*s_etat_processus).affichage_arguments == 'Y')
167: {
168: printf("\n PARAMETER ");
169:
170: if ((*s_etat_processus).langue == 'F')
171: {
172: printf("(verrouille une variable globale)\n\n");
173: }
174: else
175: {
176: printf("(lock a global variable)\n\n");
177: }
178:
179: printf(" 1: %s, %s\n", d_NOM, d_LST);
180:
181: return;
182: }
183: else if ((*s_etat_processus).test_instruction == 'Y')
184: {
185: (*s_etat_processus).nombre_arguments = -1;
186: return;
187: }
188:
189: if (test_cfsf(s_etat_processus, 31) == d_vrai)
190: {
191: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
192: {
193: return;
194: }
195: }
196:
197: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
198: &s_objet) == d_erreur)
199: {
200: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
201: return;
202: }
203:
204: if ((*s_objet).type == NOM)
205: {
206: if (recherche_variable_globale(s_etat_processus, ((*((struct_nom *)
207: (*s_objet).objet)).nom)) == d_faux)
208: {
209: liberation(s_etat_processus, s_objet);
210:
211: (*s_etat_processus).erreur_systeme = d_es;
212: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
213: return;
214: }
215:
216: (*(*s_etat_processus).pointeur_variable_courante)
217: .variable_verrouillee = d_vrai;
218: }
219: else if ((*s_objet).type == LST)
220: {
221: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
222:
223: while(l_element_courant != NULL)
224: {
225: if ((*(*l_element_courant).donnee).type != NOM)
226: {
227: liberation(s_etat_processus, s_objet);
228:
229: (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
230: return;
231: }
232:
233: if (recherche_variable_globale(s_etat_processus, (*((struct_nom *)
234: (*(*l_element_courant).donnee).objet)).nom) == d_faux)
235: {
236: liberation(s_etat_processus, s_objet);
237:
238: (*s_etat_processus).erreur_systeme = d_es;
239: (*s_etat_processus).erreur_execution =
240: d_ex_variable_non_definie;
241: return;
242: }
243:
244: (*(*s_etat_processus).pointeur_variable_courante)
245: .variable_verrouillee = d_vrai;
246:
247: l_element_courant = (*l_element_courant).suivant;
248: }
249: }
250: else
251: {
252: liberation(s_etat_processus, s_objet);
253:
254: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
255: return;
256: }
257:
258: liberation(s_etat_processus, s_objet);
259:
260: return;
261: }
262:
263:
264: /*
265: ================================================================================
266: Fonction 'pshcntxt'
267: ================================================================================
268: Entrées :
269: --------------------------------------------------------------------------------
270: Sorties :
271: --------------------------------------------------------------------------------
272: Effets de bord : néant
273: ================================================================================
274: */
275:
276: void
277: instruction_pshcntxt(struct_processus *s_etat_processus)
278: {
279: struct_objet *s_objet;
280:
281: (*s_etat_processus).erreur_execution = d_ex;
282:
283: if ((*s_etat_processus).affichage_arguments == 'Y')
284: {
285: printf("\n PSHCNTXT ");
286:
287: if ((*s_etat_processus).langue == 'F')
288: {
289: printf("(sauvegarde de contexte)\n\n");
290: printf(" Aucun argument\n");
291: }
292: else
293: {
294: printf("(pushes context)\n\n");
295: printf(" No argument\n");
296: }
297:
298: return;
299: }
300: else if ((*s_etat_processus).test_instruction == 'Y')
301: {
302: (*s_etat_processus).nombre_arguments = -1;
303: return;
304: }
305:
306: if (test_cfsf(s_etat_processus, 31) == d_vrai)
307: {
308: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
309: {
310: return;
311: }
312: }
313:
314: if ((s_objet = allocation(s_etat_processus, LST)) == NULL)
315: {
316: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
317: return;
318: }
319:
320: (*s_objet).objet = (*s_etat_processus).l_base_pile;
321:
322: if (empilement(s_etat_processus, &((*s_etat_processus).
323: l_base_pile_contextes), s_objet) == d_erreur)
324: {
325: return;
326: }
327:
328: if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
329: {
330: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
331: return;
332: }
333:
334: (*((integer8 *) (*s_objet).objet)) = (*s_etat_processus)
335: .hauteur_pile_operationnelle;
336:
337: if (empilement(s_etat_processus, &((*s_etat_processus)
338: .l_base_pile_taille_contextes), s_objet) == d_erreur)
339: {
340: return;
341: }
342:
343: /*
344: * Vidage de la pile opérationnelle
345: */
346:
347: (*s_etat_processus).l_base_pile = NULL;
348: (*s_etat_processus).hauteur_pile_operationnelle = 0;
349:
350: return;
351: }
352:
353:
354: /*
355: ================================================================================
356: Fonction 'pulcntxt'
357: ================================================================================
358: Entrées :
359: --------------------------------------------------------------------------------
360: Sorties :
361: --------------------------------------------------------------------------------
362: Effets de bord : néant
363: ================================================================================
364: */
365:
366: void
367: instruction_pulcntxt(struct_processus *s_etat_processus)
368: {
369: struct_objet *s_objet;
370:
371: (*s_etat_processus).erreur_execution = d_ex;
372:
373: if ((*s_etat_processus).affichage_arguments == 'Y')
374: {
375: printf("\n PULCNTXT ");
376:
377: if ((*s_etat_processus).langue == 'F')
378: {
379: printf("(restauration de contexte)\n\n");
380: printf(" Aucun argument\n");
381: }
382: else
383: {
384: printf("(pulls context)\n\n");
385: printf(" No argument\n");
386: }
387:
388: return;
389: }
390: else if ((*s_etat_processus).test_instruction == 'Y')
391: {
392: (*s_etat_processus).nombre_arguments = -1;
393: return;
394: }
395:
396: if (test_cfsf(s_etat_processus, 31) == d_vrai)
397: {
398: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
399: {
400: return;
401: }
402: }
403:
404: if (((*s_etat_processus).l_base_pile_contextes == NULL) ||
405: ((*s_etat_processus).l_base_pile_taille_contextes == NULL))
406: {
407: (*s_etat_processus).erreur_execution = d_ex_contexte;
408: return;
409: }
410:
411: instruction_clear(s_etat_processus);
412:
413: if (depilement(s_etat_processus, &((*s_etat_processus)
414: .l_base_pile_contextes), &s_objet) == d_erreur)
415: {
416: return;
417: }
418:
419: if ((*s_objet).type != LST)
420: {
421: (*s_etat_processus).erreur_systeme = d_es_contexte;
422: return;
423: }
424:
425: (*s_etat_processus).l_base_pile = (*s_objet).objet;
426:
427: BUG((*s_objet).nombre_occurrences != 1,
428: printf("(*s_objet).nombre_occurrences=%ld\n",
429: (*s_objet).nombre_occurrences));
430: free(s_objet);
431:
432: if (depilement(s_etat_processus, &((*s_etat_processus)
433: .l_base_pile_taille_contextes), &s_objet) == d_erreur)
434: {
435: return;
436: }
437:
438: if ((*s_objet).type != INT)
439: {
440: (*s_etat_processus).erreur_systeme = d_es_contexte;
441: return;
442: }
443:
444: if ((*((integer8 *) (*s_objet).objet)) < 0)
445: {
446: (*s_etat_processus).erreur_systeme = d_es_contexte;
447: return;
448: }
449:
450: (*s_etat_processus).hauteur_pile_operationnelle =
451: (*((integer8 *) (*s_objet).objet));
452: liberation(s_etat_processus, s_objet);
453:
454: return;
455: }
456:
457:
458: /*
459: ================================================================================
460: Fonction 'peek'
461: ================================================================================
462: Entrées :
463: --------------------------------------------------------------------------------
464: Sorties :
465: --------------------------------------------------------------------------------
466: Effets de bord : néant
467: ================================================================================
468: */
469:
470: void
471: instruction_peek(struct_processus *s_etat_processus)
472: {
473: sig_atomic_t registre;
474:
475: struct_objet *s_objet;
476: struct_objet *s_objet_drapeau;
477:
478: (*s_etat_processus).erreur_execution = d_ex;
479:
480: if ((*s_etat_processus).affichage_arguments == 'Y')
481: {
482: printf("\n PEEK ");
483:
484: if ((*s_etat_processus).langue == 'F')
485: {
486: printf("(réception de données d'un processus père)\n\n");
487: }
488: else
489: {
490: printf("(data reception from parent process)\n\n");
491: }
492:
493: printf("-> 1: %s (0)\n\n", d_INT);
494:
495: printf("-> 2: %s, %s, %s, %s, %s, %s,\n"
496: " %s, %s, %s, %s, %s,\n"
497: " %s, %s, %s, %s\n",
498: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
499: d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN);
500: printf(" 1: %s (-1)\n", d_INT);
501:
502: return;
503: }
504: else if ((*s_etat_processus).test_instruction == 'Y')
505: {
506: (*s_etat_processus).nombre_arguments = -1;
507: return;
508: }
509:
510: if (test_cfsf(s_etat_processus, 31) == d_vrai)
511: {
512: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
513: {
514: return;
515: }
516: }
517:
518: if ((*s_etat_processus).presence_pipes == d_faux)
519: {
520: (*s_etat_processus).erreur_execution =
521: d_ex_absence_processus_pere;
522: return;
523: }
524:
525: if ((s_objet_drapeau = allocation(s_etat_processus, INT)) == NULL)
526: {
527: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
528: return;
529: }
530:
531: if ((*s_etat_processus).nombre_objets_injectes > 0)
532: {
533: registre = (*s_etat_processus).var_volatile_traitement_retarde_stop;
534: (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
535:
536: if ((*s_etat_processus).profilage == d_vrai)
537: {
538: profilage(s_etat_processus, "Interprocess or interthread "
539: "communications (PEEK)");
540:
541: if ((*s_etat_processus).erreur_systeme != d_es)
542: {
543: return;
544: }
545: }
546:
547: if ((s_objet = lecture_pipe(s_etat_processus,
548: (*s_etat_processus).pipe_injections)) == NULL)
549: {
550: if (registre == 0)
551: {
552: if ((*s_etat_processus).var_volatile_traitement_retarde_stop
553: == -1)
554: {
555: (*s_etat_processus).var_volatile_requete_arret = -1;
556: }
557:
558: (*s_etat_processus).var_volatile_traitement_retarde_stop
559: = registre;
560: }
561:
562: if ((*s_etat_processus).profilage == d_vrai)
563: {
564: profilage(s_etat_processus, NULL);
565: }
566:
567: return;
568: }
569:
570: if ((*s_etat_processus).profilage == d_vrai)
571: {
572: profilage(s_etat_processus, NULL);
573: }
574:
575: if (registre == 0)
576: {
577: if ((*s_etat_processus).var_volatile_traitement_retarde_stop == -1)
578: {
579: (*s_etat_processus).var_volatile_requete_arret = -1;
580: }
581:
582: (*s_etat_processus).var_volatile_traitement_retarde_stop = registre;
583: }
584:
585: (*s_etat_processus).nombre_objets_injectes--;
586:
587: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
588: s_objet) == d_erreur)
589: {
590: return;
591: }
592:
593: (*((integer8 *) (*s_objet_drapeau).objet)) = -1;
594: }
595: else
596: {
597: (*((integer8 *) (*s_objet_drapeau).objet)) = 0;
598: }
599:
600: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
601: s_objet_drapeau) == d_erreur)
602: {
603: return;
604: }
605:
606: return;
607: }
608:
609:
610: /*
611: ================================================================================
612: Fonction 'poke'
613: ================================================================================
614: Entrées :
615: --------------------------------------------------------------------------------
616: Sorties :
617: --------------------------------------------------------------------------------
618: Effets de bord : néant
619: ================================================================================
620: */
621:
622: void
623: instruction_poke(struct_processus *s_etat_processus)
624: {
625: sig_atomic_t registre_stop;
626:
627: ssize_t longueur_ecriture;
628:
629: struct sigaction action;
630: struct sigaction registre;
631:
632: struct_liste_chainee *l_element_courant;
633:
634: struct_objet *s_objet_argument_1;
635: struct_objet *s_objet_argument_2;
636:
637: (*s_etat_processus).erreur_execution = d_ex;
638:
639: if ((*s_etat_processus).affichage_arguments == 'Y')
640: {
641: printf("\n POKE ");
642:
643: if ((*s_etat_processus).langue == 'F')
644: {
645: printf("(envoi d'une donnée à un processus fils)\n\n");
646: }
647: else
648: {
649: printf("(send data to child process)\n\n");
650: }
651:
652: printf(" 2: %s, %s, %s, %s, %s, %s,\n"
653: " %s, %s, %s, %s, %s,\n"
654: " %s, %s, %s, %s, %s\n",
655: d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX,
656: d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_TAB);
657: printf(" 1: %s\n", d_PRC);
658:
659: return;
660: }
661: else if ((*s_etat_processus).test_instruction == 'Y')
662: {
663: (*s_etat_processus).nombre_arguments = -1;
664: return;
665: }
666:
667: if (test_cfsf(s_etat_processus, 31) == d_vrai)
668: {
669: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
670: {
671: return;
672: }
673: }
674:
675: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
676: &s_objet_argument_1) == d_erreur)
677: {
678: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
679: return;
680: }
681:
682: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
683: &s_objet_argument_2) == d_erreur)
684: {
685: liberation(s_etat_processus, s_objet_argument_1);
686:
687: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
688: return;
689: }
690:
691: if ((*s_objet_argument_1).type == PRC)
692: {
693: /*
694: * Vérification du type de la donnée transmise
695: */
696:
697: if (((*s_objet_argument_2).type != INT) &&
698: ((*s_objet_argument_2).type != REL) &&
699: ((*s_objet_argument_2).type != CPL) &&
700: ((*s_objet_argument_2).type != VIN) &&
701: ((*s_objet_argument_2).type != VRL) &&
702: ((*s_objet_argument_2).type != VCX) &&
703: ((*s_objet_argument_2).type != MIN) &&
704: ((*s_objet_argument_2).type != MRL) &&
705: ((*s_objet_argument_2).type != MCX) &&
706: ((*s_objet_argument_2).type != BIN) &&
707: ((*s_objet_argument_2).type != NOM) &&
708: ((*s_objet_argument_2).type != CHN) &&
709: ((*s_objet_argument_2).type != LST) &&
710: ((*s_objet_argument_2).type != ALG) &&
711: ((*s_objet_argument_2).type != RPN) &&
712: ((*s_objet_argument_2).type != TBL))
713: {
714: liberation(s_etat_processus, s_objet_argument_1);
715: liberation(s_etat_processus, s_objet_argument_2);
716:
717: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
718: return;
719: }
720:
721: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
722: {
723: (*s_etat_processus).erreur_systeme = d_es_processus;
724: return;
725: }
726:
727: l_element_courant = (struct_liste_chainee *)
728: (*s_etat_processus).l_base_pile_processus;
729:
730: while(l_element_courant != NULL)
731: {
732: if ((*(*((struct_processus_fils *) (*s_objet_argument_1).objet))
733: .thread).processus_detache == d_vrai)
734: {
735: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
736: .donnee).objet)).thread).processus_detache == d_faux)
737: {
738: l_element_courant = (*l_element_courant).suivant;
739: continue;
740: }
741:
742: if ((*(*((struct_processus_fils *) (*s_objet_argument_1).objet))
743: .thread).pid == (*(*((struct_processus_fils *)
744: (*(*l_element_courant).donnee).objet)).thread).pid)
745: {
746: // Envoi des données
747: // Attention : si le processus n'existe plus, il n'y a plus
748: // de lecteur et on peut se prendre un SIGPIPE dans la
749: // figure !
750:
751: action.sa_handler = SIG_IGN;
752: action.sa_flags = SA_ONSTACK;
753:
754: if (sigaction(SIGPIPE, &action, ®istre) != 0)
755: {
756: pthread_mutex_unlock(&((*s_etat_processus).mutex));
757:
758: (*s_etat_processus).erreur_systeme = d_es_signal;
759: return;
760: }
761:
762: // Validation des données. On envoie un signal pour
763: // débloquer les instructions de type WF* pour les
764: // lectures bloquantes.
765:
766: if (envoi_signal_processus((*(*((struct_processus_fils *)
767: (*(*l_element_courant).donnee).objet))
768: .thread).pid, rpl_siginject) != 0)
769: {
770: // Le processus fils peut s'être terminé.
771: break;
772: }
773:
774: registre_stop = (*s_etat_processus)
775: .var_volatile_traitement_retarde_stop;
776: (*s_etat_processus).var_volatile_traitement_retarde_stop
777: = 1;
778:
779: if ((*s_etat_processus).profilage == d_vrai)
780: {
781: profilage(s_etat_processus,
782: "Interprocess communications (POKE)");
783:
784: if ((*s_etat_processus).erreur_systeme != d_es)
785: {
786: pthread_mutex_unlock(&((*s_etat_processus).mutex));
787: return;
788: }
789: }
790:
791: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
792: {
793: (*s_etat_processus).erreur_systeme = d_es_processus;
794: return;
795: }
796:
797: while((longueur_ecriture = write_atomic(s_etat_processus,
798: (*(*((struct_processus_fils *)
799: (*(*l_element_courant).donnee).objet)).thread)
800: .pipe_nombre_injections[1], "-",
801: sizeof(unsigned char))) != sizeof(unsigned char))
802: {
803: while(sem_wait(
804: &((*s_etat_processus).semaphore_fork)) != 0)
805: {
806: if (errno != EINTR)
807: {
808: (*s_etat_processus).erreur_systeme =
809: d_es_processus;
810: return;
811: }
812: }
813:
814: if (longueur_ecriture == -1)
815: {
816: pthread_mutex_unlock(&((*s_etat_processus).mutex));
817:
818: liberation(s_etat_processus, s_objet_argument_1);
819: liberation(s_etat_processus, s_objet_argument_2);
820:
821: if (registre_stop == 0)
822: {
823: if ((*s_etat_processus)
824: .var_volatile_traitement_retarde_stop
825: == -1)
826: {
827: (*s_etat_processus)
828: .var_volatile_requete_arret = -1;
829: }
830:
831: (*s_etat_processus)
832: .var_volatile_traitement_retarde_stop
833: = registre_stop;
834: }
835:
836: if ((*s_etat_processus).profilage == d_vrai)
837: {
838: profilage(s_etat_processus, NULL);
839: }
840:
841: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
842: {
843: (*s_etat_processus).erreur_systeme =
844: d_es_signal;
845: return;
846: }
847:
848: return;
849: }
850:
851: if (sem_post(
852: &((*s_etat_processus).semaphore_fork)) != 0)
853: {
854: (*s_etat_processus).erreur_systeme = d_es_processus;
855: return;
856: }
857: }
858:
859: if (ecriture_pipe(s_etat_processus,
860: (*(*((struct_processus_fils *)
861: (*(*l_element_courant).donnee).objet)).thread)
862: .pipe_injections[1], s_objet_argument_2)
863: == d_erreur)
864: {
865: // Le processus fils peut s'être terminé.
866:
867: if ((*s_etat_processus).erreur_systeme != d_es)
868: {
869: (*s_etat_processus).erreur_systeme = d_es;
870: }
871: }
872:
873: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
874: {
875: if (errno != EINTR)
876: {
877: (*s_etat_processus).erreur_systeme = d_es_processus;
878: return;
879: }
880: }
881:
882: if (registre_stop == 0)
883: {
884: if ((*s_etat_processus)
885: .var_volatile_traitement_retarde_stop
886: == -1)
887: {
888: (*s_etat_processus).var_volatile_requete_arret = -1;
889: }
890:
891: (*s_etat_processus).var_volatile_traitement_retarde_stop
892: = registre_stop;
893: }
894:
895: if ((*s_etat_processus).profilage == d_vrai)
896: {
897: profilage(s_etat_processus, NULL);
898: }
899:
900: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
901: {
902: pthread_mutex_unlock(&((*s_etat_processus).mutex));
903:
904: (*s_etat_processus).erreur_systeme = d_es_signal;
905: return;
906: }
907:
908: break;
909: }
910: }
911: else
912: {
913: if ((*(*((struct_processus_fils *) (*(*l_element_courant)
914: .donnee).objet)).thread).processus_detache == d_vrai)
915: {
916: l_element_courant = (*l_element_courant).suivant;
917: continue;
918: }
919:
920: if (((pthread_equal((*(*((struct_processus_fils *)
921: (*s_objet_argument_1).objet)).thread).tid,
922: (*(*((struct_processus_fils *)
923: (*(*l_element_courant).donnee).objet)).thread).tid)
924: != 0)) && ((*(*((struct_processus_fils *)
925: (*s_objet_argument_1).objet)).thread).pid ==
926: (*(*((struct_processus_fils *)
927: (*(*l_element_courant).donnee).objet)).thread).pid))
928: {
929: // Envoi des données
930: // Attention : si le processus n'existe plus, il n'y a plus
931: // de lecteur et on peut se prendre un SIGPIPE dans la
932: // figure !
933:
934: action.sa_handler = SIG_IGN;
935: action.sa_flags = SA_ONSTACK;
936:
937: if (sigaction(SIGPIPE, &action, ®istre) != 0)
938: {
939: pthread_mutex_unlock(&((*s_etat_processus).mutex));
940:
941: (*s_etat_processus).erreur_systeme = d_es_signal;
942: return;
943: }
944:
945: // Validation des données. On envoie un signal pour
946: // débloquer les instructions de type WF* pour les
947: // lectures bloquantes.
948:
949: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
950: (*(*l_element_courant).donnee).objet)).thread)
951: .mutex)) != 0)
952: {
953: (*s_etat_processus).erreur_systeme = d_es_processus;
954: return;
955: }
956:
957: if ((*(*((struct_processus_fils *)
958: (*(*l_element_courant).donnee).objet)).thread)
959: .thread_actif == d_vrai)
960: {
961: if (envoi_signal_thread((*(*((struct_processus_fils *)
962: (*(*l_element_courant).donnee).objet)).thread)
963: .tid, rpl_siginject) != 0)
964: {
965: // Le processus fils peut s'être terminé.
966:
967: if (pthread_mutex_unlock(
968: &((*(*((struct_processus_fils *)
969: (*(*l_element_courant).donnee).objet))
970: .thread).mutex)) != 0)
971: {
972: (*s_etat_processus).erreur_systeme =
973: d_es_processus;
974: return;
975: }
976:
977: break;
978: }
979: }
980: else
981: {
982: if (pthread_mutex_unlock(
983: &((*(*((struct_processus_fils *)
984: (*(*l_element_courant).donnee).objet))
985: .thread).mutex)) != 0)
986: {
987: (*s_etat_processus).erreur_systeme = d_es_processus;
988: return;
989: }
990:
991: break;
992: }
993:
994: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
995: (*(*l_element_courant).donnee).objet)).thread)
996: .mutex)) != 0)
997: {
998: (*s_etat_processus).erreur_systeme = d_es_processus;
999: return;
1000: }
1001:
1002: registre_stop = (*s_etat_processus)
1003: .var_volatile_traitement_retarde_stop;
1004: (*s_etat_processus).var_volatile_traitement_retarde_stop
1005: = 1;
1006:
1007: if ((*s_etat_processus).profilage == d_vrai)
1008: {
1009: profilage(s_etat_processus,
1010: "Interthread communications (POKE)");
1011:
1012: if ((*s_etat_processus).erreur_systeme != d_es)
1013: {
1014: pthread_mutex_unlock(&((*s_etat_processus).mutex));
1015: return;
1016: }
1017: }
1018:
1019: if (sem_post(
1020: &((*s_etat_processus).semaphore_fork)) != 0)
1021: {
1022: (*s_etat_processus).erreur_systeme = d_es_processus;
1023: return;
1024: }
1025:
1026: while((longueur_ecriture = write_atomic(s_etat_processus,
1027: (*(*((struct_processus_fils *)
1028: (*(*l_element_courant).donnee).objet)).thread)
1029: .pipe_nombre_injections[1], "-",
1030: sizeof(unsigned char))) != sizeof(unsigned char))
1031: {
1032: while(sem_wait(
1033: &((*s_etat_processus).semaphore_fork)) != 0)
1034: {
1035: if (errno != EINTR)
1036: {
1037: (*s_etat_processus).erreur_systeme =
1038: d_es_processus;
1039: return;
1040: }
1041: }
1042:
1043: if (longueur_ecriture == -1)
1044: {
1045: pthread_mutex_unlock(&((*s_etat_processus).mutex));
1046:
1047: liberation(s_etat_processus, s_objet_argument_1);
1048: liberation(s_etat_processus, s_objet_argument_2);
1049:
1050: if (registre_stop == 0)
1051: {
1052: if ((*s_etat_processus)
1053: .var_volatile_traitement_retarde_stop
1054: == -1)
1055: {
1056: (*s_etat_processus)
1057: .var_volatile_requete_arret = -1;
1058: }
1059:
1060: (*s_etat_processus)
1061: .var_volatile_traitement_retarde_stop
1062: = registre_stop;
1063: }
1064:
1065: if ((*s_etat_processus).profilage == d_vrai)
1066: {
1067: profilage(s_etat_processus, NULL);
1068: }
1069:
1070: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
1071: {
1072: (*s_etat_processus).erreur_systeme =
1073: d_es_signal;
1074: return;
1075: }
1076:
1077: return;
1078: }
1079:
1080: if (sem_post(
1081: &((*s_etat_processus).semaphore_fork)) != 0)
1082: {
1083: (*s_etat_processus).erreur_systeme = d_es_processus;
1084: return;
1085: }
1086: }
1087:
1088: if (ecriture_pipe(s_etat_processus,
1089: (*(*((struct_processus_fils *)
1090: (*(*l_element_courant).donnee).objet)).thread)
1091: .pipe_injections[1], s_objet_argument_2)
1092: == d_erreur)
1093: {
1094: // Le processus fils peut s'être terminé.
1095:
1096: if ((*s_etat_processus).erreur_systeme != d_es)
1097: {
1098: (*s_etat_processus).erreur_systeme = d_es;
1099: }
1100: }
1101:
1102: while(sem_wait(
1103: &((*s_etat_processus).semaphore_fork)) != 0)
1104: {
1105: if (errno != EINTR)
1106: {
1107: (*s_etat_processus).erreur_systeme = d_es_processus;
1108: return;
1109: }
1110: }
1111:
1112: if (registre_stop == 0)
1113: {
1114: if ((*s_etat_processus)
1115: .var_volatile_traitement_retarde_stop
1116: == -1)
1117: {
1118: (*s_etat_processus).var_volatile_requete_arret = -1;
1119: }
1120:
1121: (*s_etat_processus).var_volatile_traitement_retarde_stop
1122: = registre_stop;
1123: }
1124:
1125: if ((*s_etat_processus).profilage == d_vrai)
1126: {
1127: profilage(s_etat_processus, NULL);
1128: }
1129:
1130: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
1131: {
1132: pthread_mutex_unlock(&((*s_etat_processus).mutex));
1133:
1134: (*s_etat_processus).erreur_systeme = d_es_signal;
1135: return;
1136: }
1137:
1138: break;
1139: }
1140: }
1141:
1142: l_element_courant = (*l_element_courant).suivant;
1143: }
1144:
1145: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
1146: {
1147: (*s_etat_processus).erreur_systeme = d_es_processus;
1148: return;
1149: }
1150:
1151: if (l_element_courant == NULL)
1152: {
1153: liberation(s_etat_processus, s_objet_argument_1);
1154: liberation(s_etat_processus, s_objet_argument_2);
1155:
1156: (*s_etat_processus).erreur_execution = d_ex_processus;
1157: return;
1158: }
1159: }
1160: else
1161: {
1162: liberation(s_etat_processus, s_objet_argument_1);
1163: liberation(s_etat_processus, s_objet_argument_2);
1164:
1165: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1166: return;
1167: }
1168:
1169: liberation(s_etat_processus, s_objet_argument_1);
1170: liberation(s_etat_processus, s_objet_argument_2);
1171:
1172: return;
1173: }
1174:
1175:
1176: /*
1177: ================================================================================
1178: Fonction 'private'
1179: ================================================================================
1180: Entrées :
1181: --------------------------------------------------------------------------------
1182: Sorties :
1183: --------------------------------------------------------------------------------
1184: Effets de bord : néant
1185: ================================================================================
1186: */
1187:
1188: void
1189: instruction_private(struct_processus *s_etat_processus)
1190: {
1191: struct_liste_chainee *l_element_courant;
1192:
1193: struct_objet *s_objet;
1194:
1195: (*s_etat_processus).erreur_execution = d_ex;
1196:
1197: if ((*s_etat_processus).affichage_arguments == 'Y')
1198: {
1199: printf("\n PRIVATE ");
1200:
1201: if ((*s_etat_processus).langue == 'F')
1202: {
1203: printf("(rend privée une variable partagée)\n\n");
1204: }
1205: else
1206: {
1207: printf("(switch a shared variable to private one)\n\n");
1208: }
1209:
1210: printf(" 1: %s, %s\n", d_NOM, d_LST);
1211:
1212: return;
1213: }
1214: else if ((*s_etat_processus).test_instruction == 'Y')
1215: {
1216: (*s_etat_processus).nombre_arguments = -1;
1217: return;
1218: }
1219:
1220: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1221: {
1222: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1223: {
1224: return;
1225: }
1226: }
1227:
1228: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1229: &s_objet) == d_erreur)
1230: {
1231: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1232: return;
1233: }
1234:
1235: if ((*s_objet).type == NOM)
1236: {
1237: if (recherche_variable(s_etat_processus, ((*((struct_nom *)
1238: (*s_objet).objet)).nom)) == d_faux)
1239: {
1240: liberation(s_etat_processus, s_objet);
1241:
1242: (*s_etat_processus).erreur_systeme = d_es;
1243: (*s_etat_processus).erreur_execution = d_ex_variable_non_definie;
1244: return;
1245: }
1246:
1247: if (pthread_mutex_lock(&((*(*s_etat_processus)
1248: .s_liste_variables_partagees).mutex)) != 0)
1249: {
1250: (*s_etat_processus).erreur_systeme = d_es_processus;
1251: return;
1252: }
1253:
1254: if (recherche_variable_partagee(s_etat_processus, ((*((struct_nom *)
1255: (*s_objet).objet)).nom), (*(*s_etat_processus)
1256: .pointeur_variable_courante).variable_partagee,
1257: (*(*s_etat_processus).pointeur_variable_courante).origine)
1258: == d_faux)
1259: {
1260: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1261: .s_liste_variables_partagees).mutex)) != 0)
1262: {
1263: (*s_etat_processus).erreur_systeme = d_es_processus;
1264: return;
1265: }
1266:
1267: liberation(s_etat_processus, s_objet);
1268:
1269: (*s_etat_processus).erreur_systeme = d_es;
1270: return;
1271: }
1272:
1273: (*(*s_etat_processus).pointeur_variable_courante).objet =
1274: (*(*s_etat_processus).s_liste_variables_partagees).table
1275: [(*(*s_etat_processus).s_liste_variables_partagees)
1276: .position_variable].objet;
1277: (*(*s_etat_processus).s_liste_variables_partagees).table
1278: [(*(*s_etat_processus).s_liste_variables_partagees)
1279: .position_variable].objet = NULL;
1280:
1281: if (retrait_variable_partagee(s_etat_processus,
1282: (*((struct_nom *) (*s_objet).objet)).nom,
1283: (*(*s_etat_processus).pointeur_variable_courante)
1284: .variable_partagee) == d_erreur)
1285: {
1286: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1287: .s_liste_variables_partagees).mutex)) != 0)
1288: {
1289: (*s_etat_processus).erreur_systeme = d_es_processus;
1290: return;
1291: }
1292:
1293: liberation(s_etat_processus, s_objet);
1294: return;
1295: }
1296:
1297: if ((*(*s_etat_processus).pointeur_variable_courante).origine == 'P')
1298: {
1299: (*(*s_etat_processus).pointeur_variable_courante)
1300: .variable_partagee.adresse = 0;
1301: }
1302: else
1303: {
1304: (*(*s_etat_processus).pointeur_variable_courante)
1305: .variable_partagee.pointeur = NULL;
1306: }
1307:
1308: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1309: .s_liste_variables_partagees).mutex)) != 0)
1310: {
1311: (*s_etat_processus).erreur_systeme = d_es_processus;
1312: return;
1313: }
1314: }
1315: else if ((*s_objet).type == LST)
1316: {
1317: l_element_courant = (struct_liste_chainee *) (*s_objet).objet;
1318:
1319: while(l_element_courant != NULL)
1320: {
1321: if ((*(*l_element_courant).donnee).type != NOM)
1322: {
1323: liberation(s_etat_processus, s_objet);
1324:
1325: (*s_etat_processus).erreur_execution = d_ex_nom_invalide;
1326: return;
1327: }
1328:
1329: if (recherche_variable(s_etat_processus, ((*((struct_nom *)
1330: (*s_objet).objet)).nom)) == d_faux)
1331: {
1332: liberation(s_etat_processus, s_objet);
1333:
1334: (*s_etat_processus).erreur_systeme = d_es;
1335: (*s_etat_processus).erreur_execution =
1336: d_ex_variable_non_definie;
1337: return;
1338: }
1339:
1340: if (pthread_mutex_lock(&((*(*s_etat_processus)
1341: .s_liste_variables_partagees).mutex)) != 0)
1342: {
1343: (*s_etat_processus).erreur_systeme = d_es_processus;
1344: return;
1345: }
1346:
1347: if (recherche_variable_partagee(s_etat_processus, ((*((struct_nom *)
1348: (*s_objet).objet)).nom), (*(*s_etat_processus)
1349: .pointeur_variable_courante).variable_partagee,
1350: (*(*s_etat_processus).pointeur_variable_courante).origine)
1351: == d_faux)
1352: {
1353: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1354: .s_liste_variables_partagees).mutex)) != 0)
1355: {
1356: (*s_etat_processus).erreur_systeme = d_es_processus;
1357: return;
1358: }
1359:
1360: liberation(s_etat_processus, s_objet);
1361:
1362: (*s_etat_processus).erreur_systeme = d_es;
1363: (*s_etat_processus).erreur_execution =
1364: d_ex_variable_non_definie;
1365: return;
1366: }
1367:
1368: (*(*s_etat_processus).pointeur_variable_courante).objet =
1369: (*(*s_etat_processus).s_liste_variables_partagees).table
1370: [(*(*s_etat_processus).s_liste_variables_partagees)
1371: .position_variable].objet;
1372: (*(*s_etat_processus).s_liste_variables_partagees).table
1373: [(*(*s_etat_processus).s_liste_variables_partagees)
1374: .position_variable].objet = NULL;
1375:
1376: if ((*(*s_etat_processus).pointeur_variable_courante).origine
1377: == 'P')
1378: {
1379: (*(*s_etat_processus).pointeur_variable_courante)
1380: .variable_partagee.adresse = 0;
1381: }
1382: else
1383: {
1384: (*(*s_etat_processus).pointeur_variable_courante)
1385: .variable_partagee.pointeur = NULL;
1386: }
1387:
1388: if (retrait_variable_partagee(s_etat_processus,
1389: (*((struct_nom *) (*s_objet).objet)).nom,
1390: (*(*s_etat_processus).pointeur_variable_courante)
1391: .variable_statique) == d_erreur)
1392: {
1393: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1394: .s_liste_variables_partagees).mutex)) != 0)
1395: {
1396: (*s_etat_processus).erreur_systeme = d_es_processus;
1397: return;
1398: }
1399:
1400: liberation(s_etat_processus, s_objet);
1401: return;
1402: }
1403:
1404: if (pthread_mutex_unlock(&((*(*s_etat_processus)
1405: .s_liste_variables_partagees).mutex)) != 0)
1406: {
1407: (*s_etat_processus).erreur_systeme = d_es_processus;
1408: return;
1409: }
1410:
1411: l_element_courant = (*l_element_courant).suivant;
1412: }
1413: }
1414: else
1415: {
1416: liberation(s_etat_processus, s_objet);
1417:
1418: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1419: return;
1420: }
1421:
1422: liberation(s_etat_processus, s_objet);
1423:
1424: return;
1425: }
1426:
1427:
1428: /*
1429: ================================================================================
1430: Fonction 'pshprfl'
1431: ================================================================================
1432: Entrées : pointeur sur une structure struct_processus
1433: --------------------------------------------------------------------------------
1434: Sorties :
1435: --------------------------------------------------------------------------------
1436: Effets de bord : néant
1437: ================================================================================
1438: */
1439:
1440: void
1441: instruction_pshprfl(struct_processus *s_etat_processus)
1442: {
1443: struct_objet *s_objet_argument;
1444:
1445: (*s_etat_processus).erreur_execution = d_ex;
1446:
1447: if ((*s_etat_processus).affichage_arguments == 'Y')
1448: {
1449: printf("\n PSHPRFL ");
1450:
1451: if ((*s_etat_processus).langue == 'F')
1452: {
1453: printf("(empilement d'un point de profilage)\n\n");
1454: }
1455: else
1456: {
1457: printf("(push profile data)\n\n");
1458: }
1459:
1460: printf(" 1: %s\n", d_CHN);
1461:
1462: return;
1463: }
1464: else if ((*s_etat_processus).test_instruction == 'Y')
1465: {
1466: (*s_etat_processus).nombre_arguments = -1;
1467: return;
1468: }
1469:
1470: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1471: {
1472: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
1473: {
1474: return;
1475: }
1476: }
1477:
1478: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1479: &s_objet_argument) == d_erreur)
1480: {
1481: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1482: return;
1483: }
1484:
1485: if ((*s_objet_argument).type == CHN)
1486: {
1487: if ((*s_etat_processus).profilage == d_vrai)
1488: {
1489: profilage(s_etat_processus, (unsigned char *)
1490: (*s_objet_argument).objet);
1491: }
1492: }
1493: else
1494: {
1495: liberation(s_etat_processus, s_objet_argument);
1496:
1497: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1498: return;
1499: }
1500:
1501: liberation(s_etat_processus, s_objet_argument);
1502:
1503: return;
1504: }
1505:
1506:
1507: /*
1508: ================================================================================
1509: Fonction 'pulprfl'
1510: ================================================================================
1511: Entrées : pointeur sur une structure struct_processus
1512: --------------------------------------------------------------------------------
1513: Sorties :
1514: --------------------------------------------------------------------------------
1515: Effets de bord : néant
1516: ================================================================================
1517: */
1518:
1519: void
1520: instruction_pulprfl(struct_processus *s_etat_processus)
1521: {
1522: (*s_etat_processus).erreur_execution = d_ex;
1523:
1524: if ((*s_etat_processus).affichage_arguments == 'Y')
1525: {
1526: printf("\n PULPRFL ");
1527:
1528: if ((*s_etat_processus).langue == 'F')
1529: {
1530: printf("(dépilement d'un point de profilage)\n\n");
1531: printf(" Aucun argument\n");
1532: }
1533: else
1534: {
1535: printf("(pull profile data)\n\n");
1536: printf(" No argument\n");
1537: }
1538:
1539: return;
1540: }
1541: else if ((*s_etat_processus).test_instruction == 'Y')
1542: {
1543: (*s_etat_processus).nombre_arguments = -1;
1544: return;
1545: }
1546:
1547: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1548: {
1549: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1550: {
1551: return;
1552: }
1553: }
1554:
1555: if ((*s_etat_processus).profilage == d_vrai)
1556: {
1557: profilage(s_etat_processus, NULL);
1558: }
1559:
1560: return;
1561: }
1562:
1563:
1564: /*
1565: ================================================================================
1566: Fonction 'plot'
1567: ================================================================================
1568: Entrées : pointeur sur une structure struct_processus
1569: --------------------------------------------------------------------------------
1570: Sorties :
1571: --------------------------------------------------------------------------------
1572: Effets de bord : néant
1573: ================================================================================
1574: */
1575:
1576: void
1577: instruction_plot(struct_processus *s_etat_processus)
1578: {
1579: (*s_etat_processus).erreur_execution = d_ex;
1580:
1581: if ((*s_etat_processus).affichage_arguments == 'Y')
1582: {
1583: printf("\n PLOT ");
1584:
1585: if ((*s_etat_processus).langue == 'F')
1586: {
1587: printf("(affiche les données graphiques mémorisées)\n\n");
1588: printf(" Aucun argument\n");
1589: }
1590: else
1591: {
1592: printf("(plot buffered graphic)\n\n");
1593: printf(" No argument\n");
1594: }
1595:
1596: return;
1597: }
1598: else if ((*s_etat_processus).test_instruction == 'Y')
1599: {
1600: (*s_etat_processus).nombre_arguments = -1;
1601: return;
1602: }
1603:
1604: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1605: {
1606: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1607: {
1608: return;
1609: }
1610: }
1611:
1612: if ((*s_etat_processus).fichiers_graphiques != NULL)
1613: {
1614: appel_gnuplot(s_etat_processus, 'N');
1615: }
1616:
1617: (*s_etat_processus).mise_a_jour_trace_requise = d_faux;
1618:
1619: return;
1620: }
1621:
1622:
1623: /*
1624: ================================================================================
1625: Fonction 'procid'
1626: ================================================================================
1627: Entrées : pointeur sur une structure struct_processus
1628: --------------------------------------------------------------------------------
1629: Sorties :
1630: --------------------------------------------------------------------------------
1631: Effets de bord : néant
1632: ================================================================================
1633: */
1634:
1635: void
1636: instruction_procid(struct_processus *s_etat_processus)
1637: {
1638: pthread_mutexattr_t attributs_mutex;
1639:
1640: struct_objet *s_objet;
1641:
1642: (*s_etat_processus).erreur_execution = d_ex;
1643:
1644: if ((*s_etat_processus).affichage_arguments == 'Y')
1645: {
1646: printf("\n PROCID ");
1647:
1648: if ((*s_etat_processus).langue == 'F')
1649: {
1650: printf("(identifiant du processus)\n\n");
1651: }
1652: else
1653: {
1654: printf("(process identifier)\n\n");
1655: }
1656:
1657: printf("-> 1: %s\n", d_PRC);
1658:
1659: return;
1660: }
1661: else if ((*s_etat_processus).test_instruction == 'Y')
1662: {
1663: (*s_etat_processus).nombre_arguments = -1;
1664: return;
1665: }
1666:
1667: if (test_cfsf(s_etat_processus, 31) == d_vrai)
1668: {
1669: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
1670: {
1671: return;
1672: }
1673: }
1674:
1675: if ((s_objet = allocation(s_etat_processus, PRC)) == NULL)
1676: {
1677: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1678: return;
1679: }
1680:
1681: if (((*((struct_processus_fils *) (*s_objet).objet)).thread =
1682: malloc(sizeof(struct_descripteur_thread))) == NULL)
1683: {
1684: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1685: return;
1686: }
1687:
1688: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1689: .nombre_references = 1;
1690: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1691: .pid = getpid();
1692: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1693: .tid = pthread_self();
1694: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1695: .processus_detache = (*s_etat_processus).processus_detache;
1696: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
1697: .argument = NULL;
1698:
1699: pthread_mutexattr_init(&attributs_mutex);
1700: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
1701: pthread_mutex_init(&((*(*((struct_processus_fils *)
1702: (*s_objet).objet)).thread).mutex), &attributs_mutex);
1703: pthread_mutexattr_destroy(&attributs_mutex);
1704:
1705: pthread_mutexattr_init(&attributs_mutex);
1706: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
1707: pthread_mutex_init(&((*(*((struct_processus_fils *)
1708: (*s_objet).objet)).thread).mutex_nombre_references),
1709: &attributs_mutex);
1710: pthread_mutexattr_destroy(&attributs_mutex);
1711:
1712: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1713: s_objet) == d_erreur)
1714: {
1715: return;
1716: }
1717:
1718: return;
1719: }
1720:
1721: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>