Annotation of rpl/src/instructions_m4.c, revision 1.55
1.1 bertrand 1: /*
2: ================================================================================
1.53 bertrand 3: RPL/2 (R) version 4.1.13
1.52 bertrand 4: Copyright (C) 1989-2013 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.12 bertrand 23: #include "rpl-conv.h"
1.1 bertrand 24:
25:
26: /*
27: ================================================================================
28: Fonction 'mem'
29: ================================================================================
30: Entrées :
31: --------------------------------------------------------------------------------
32: Sorties :
33: --------------------------------------------------------------------------------
34: Effets de bord : néant
35: ================================================================================
36: */
37:
38: void
39: instruction_mem(struct_processus *s_etat_processus)
40: {
1.54 bertrand 41: integer8 j;
42: integer8 nb_variables;
1.1 bertrand 43:
1.23 bertrand 44: struct_liste_chainee *l_element_courant;
45:
46: struct_objet *s_objet_resultat;
47:
48: struct_tableau_variables *tableau;
1.1 bertrand 49:
50: (*s_etat_processus).erreur_execution = d_ex;
51:
52: if ((*s_etat_processus).affichage_arguments == 'Y')
53: {
54: printf("\n MEM ");
55:
56: if ((*s_etat_processus).langue == 'F')
57: {
58: printf("(mémoire occupée)\n\n");
59: }
60: else
61: {
62: printf("(used memory)\n\n");
63: }
64:
65: printf("-> 1: %s\n", d_LST);
66:
67: return;
68: }
69: else if ((*s_etat_processus).test_instruction == 'Y')
70: {
71: (*s_etat_processus).nombre_arguments = -1;
72: return;
73: }
74:
75: if (test_cfsf(s_etat_processus, 31) == d_vrai)
76: {
77: if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
78: {
79: return;
80: }
81: }
82:
83: if ((s_objet_resultat = allocation(s_etat_processus, LST))
84: == NULL)
85: {
86: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
87: return;
88: }
89:
90: if (((*s_objet_resultat).objet =
91: allocation_maillon(s_etat_processus)) == NULL)
92: {
93: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
94: return;
95: }
96:
97: if (((*((struct_liste_chainee *) (*s_objet_resultat).objet)).donnee =
98: allocation(s_etat_processus, INT)) == NULL)
99: {
100: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
101: return;
102: }
103:
104: /*
105: * Décompte de la mémoire utilisée dans la pile
106: */
107:
108: (*((integer8 *) (*((*((struct_liste_chainee *) (*s_objet_resultat).objet))
109: .donnee)).objet)) = 0;
110:
111: l_element_courant = (*s_etat_processus).l_base_pile;
112:
113: while(l_element_courant != NULL)
114: {
115: (*((integer8 *) (*((*((struct_liste_chainee *) (*s_objet_resultat)
116: .objet)).donnee)).objet)) += occupation_memoire(
117: (*l_element_courant).donnee);
118: l_element_courant = (*l_element_courant).suivant;
119: }
120:
121: /*
122: * Décompte de la mémoire utilisée pour les différentes variables
123: */
124:
125: if (((*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant
126: = allocation_maillon(s_etat_processus)) == NULL)
127: {
128: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
129: return;
130: }
131:
132: if (((*((*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant))
133: .donnee = allocation(s_etat_processus, INT)) == NULL)
134: {
135: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
136: return;
137: }
138:
139: (*((*((struct_liste_chainee *) (*s_objet_resultat).objet)).suivant))
140: .suivant = NULL;
141:
142: (*((integer8 *) (*((*((*((struct_liste_chainee *)
143: (*s_objet_resultat).objet)).suivant)).donnee)).objet)) = 0;
144:
1.55 ! bertrand 145: if (pthread_mutex_lock(&mutex_liste_variables_partagees) != 0)
! 146: {
! 147: (*s_etat_processus).erreur_systeme = d_es_processus;
! 148: return;
! 149: }
! 150:
1.49 bertrand 151: nb_variables = nombre_variables(s_etat_processus);
1.23 bertrand 152:
1.54 bertrand 153: if ((tableau = malloc(((size_t) nb_variables) *
154: sizeof(struct_tableau_variables))) == NULL)
1.23 bertrand 155: {
1.49 bertrand 156: liberation_mutexes_arbre_variables_partagees(s_etat_processus,
157: (*(*s_etat_processus).s_arbre_variables_partagees));
1.55 ! bertrand 158: pthread_mutex_unlock(&mutex_liste_variables_partagees);
1.23 bertrand 159: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
160: return;
161: }
162:
1.55 ! bertrand 163: nb_variables = liste_variables(s_etat_processus, tableau);
! 164:
! 165: if (pthread_mutex_unlock(&mutex_liste_variables_partagees) != 0)
! 166: {
! 167: (*s_etat_processus).erreur_systeme = d_es_processus;
! 168: return;
! 169: }
1.23 bertrand 170:
171: for(j = 0; j < nb_variables; j++)
1.1 bertrand 172: {
173: (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat)
1.54 bertrand 174: .objet)).suivant)).donnee)).objet)) += (integer8)
175: (sizeof(unsigned char) * strlen(tableau[j].nom));
1.1 bertrand 176: (*((integer8 *) (*((*((*((struct_liste_chainee *) (*s_objet_resultat)
177: .objet)).suivant)).donnee)).objet)) += occupation_memoire(
1.23 bertrand 178: tableau[j].objet);
1.55 ! bertrand 179:
! 180: if(tableau[j].mutex != NULL)
! 181: { // La variable est une variable partagée. On libère le mutex.
! 182: pthread_mutex_unlock(tableau[j].mutex);
! 183: }
1.1 bertrand 184: }
1.23 bertrand 185:
186: free(tableau);
1.1 bertrand 187:
188: /*
189: * Empilement du résultat
190: */
191:
192: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
193: s_objet_resultat) == d_erreur)
194: {
195: return;
196: }
197:
198: return;
199: }
200:
201:
202: /*
203: ================================================================================
204: Fonction 'mclrin'
205: ================================================================================
206: Entrées :
207: --------------------------------------------------------------------------------
208: Sorties :
209: --------------------------------------------------------------------------------
210: Effets de bord : néant
211: ================================================================================
212: */
213:
214: void
215: instruction_mclrin(struct_processus *s_etat_processus)
216: {
217: logical1 last_valide;
218:
219: struct_liste_chainee *l_liste;
220:
221: struct_objet *s_objet;
222:
223: (*s_etat_processus).erreur_execution = d_ex;
224:
225: if ((*s_etat_processus).affichage_arguments == 'Y')
226: {
227: printf("\n MCLRIN ");
228:
229: if ((*s_etat_processus).langue == 'F')
230: {
231: printf("(série de MacLaurin)\n\n");
232: }
233: else
234: {
235: printf("(MacLaurin serie)\n\n");
236: }
237:
238: printf(" 3: %s\n", d_ALG);
239: printf(" 2: %s\n", d_NOM);
240: printf(" 1: %s\n", d_INT);
241: printf("-> 1: %s\n", d_ALG);
242:
243: return;
244: }
245: else if ((*s_etat_processus).test_instruction == 'Y')
246: {
247: (*s_etat_processus).nombre_arguments = -1;
248: return;
249: }
250:
251: if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
252: {
253: if (empilement_pile_last(s_etat_processus, 3) == d_erreur)
254: {
255: return;
256: }
257: }
258:
259: if ((*s_etat_processus).hauteur_pile_operationnelle < 3)
260: {
261: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
262: return;
263: }
264:
265: if ((s_objet = allocation(s_etat_processus, INT)) == NULL)
266: {
267: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
268: return;
269: }
270:
271: (*((integer8 *) (*s_objet).objet)) = 0;
272:
273: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
274: s_objet) == d_erreur)
275: {
276: return;
277: }
278:
279: l_liste = (*s_etat_processus).l_base_pile;
280: (*s_etat_processus).l_base_pile = (*l_liste).suivant;
281: (*l_liste).suivant = (*(*s_etat_processus).l_base_pile).suivant;
282: (*(*s_etat_processus).l_base_pile).suivant = l_liste;
283:
284: if (last_valide == d_vrai)
285: {
286: cf(s_etat_processus, 31);
287: }
288:
289: instruction_taylr(s_etat_processus);
290:
291: if (last_valide == d_vrai)
292: {
293: sf(s_etat_processus, 31);
294: }
295:
296: return;
297: }
298:
299:
300: /*
301: ================================================================================
302: Fonction 'mtxlock'
303: ================================================================================
304: Entrées :
305: --------------------------------------------------------------------------------
306: Sorties :
307: --------------------------------------------------------------------------------
308: Effets de bord : néant
309: ================================================================================
310: */
311:
312: void
313: instruction_mtxlock(struct_processus *s_etat_processus)
314: {
315: struct_liste_chainee *l_element_courant;
316:
317: struct_objet *s_objet_argument;
318:
319: unsigned char *tampon;
320:
321: (*s_etat_processus).erreur_execution = d_ex;
322:
323: if ((*s_etat_processus).affichage_arguments == 'Y')
324: {
325: printf("\n MTXLOCK ");
326:
327: if ((*s_etat_processus).langue == 'F')
328: {
329: printf("(verrouille un mutex)\n\n");
330: }
331: else
332: {
333: printf("(lock mutex)\n\n");
334: }
335:
336: printf(" 1: %s\n", d_MTX);
337:
338: return;
339: }
340: else if ((*s_etat_processus).test_instruction == 'Y')
341: {
342: (*s_etat_processus).nombre_arguments = -1;
343: return;
344: }
345:
346: if (test_cfsf(s_etat_processus, 31) == d_vrai)
347: {
348: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
349: {
350: return;
351: }
352: }
353:
354: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
355: &s_objet_argument) == d_erreur)
356: {
357: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
358: return;
359: }
360:
361: if ((*s_objet_argument).type == MTX)
362: {
363: l_element_courant = (*s_etat_processus).liste_mutexes;
364:
365: while(l_element_courant != NULL)
366: {
367: if (&((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
368: .mutex) == &((*((struct_mutex *) (*s_objet_argument).objet))
369: .mutex))
370: {
371: break;
372: }
373:
374: l_element_courant = (*l_element_courant).suivant;
375: }
376:
377: if (l_element_courant == NULL)
378: {
379: (*s_etat_processus).erreur_execution = d_ex_mutex;
380:
381: liberation(s_etat_processus, s_objet_argument);
382: return;
383: }
384:
385: if ((*s_etat_processus).profilage == d_vrai)
386: {
387: if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
388: == NULL)
389: {
390: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
391: return;
392: }
393:
394: profilage(s_etat_processus, tampon);
395: free(tampon);
396:
397: if ((*s_etat_processus).erreur_systeme != d_es)
398: {
399: return;
400: }
401: }
402:
1.34 bertrand 403: # ifndef SEMAPHORES_NOMMES
404: if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
405: # else
406: if (sem_post((*s_etat_processus).semaphore_fork) != 0)
407: # endif
1.1 bertrand 408: {
409: (*s_etat_processus).erreur_systeme = d_es_processus;
410: return;
411: }
412:
413: if (pthread_mutex_lock(&((*((struct_mutex *) (*s_objet_argument).objet))
414: .mutex)) != 0)
415: {
1.34 bertrand 416: # ifndef SEMAPHORES_NOMMES
417: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
418: # else
419: while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
420: # endif
1.1 bertrand 421: {
1.33 bertrand 422: if (errno != EINTR)
423: {
424: (*s_etat_processus).erreur_systeme = d_es_processus;
425: return;
426: }
1.1 bertrand 427: }
428:
429: liberation(s_etat_processus, s_objet_argument);
430:
431: if ((*s_etat_processus).profilage == d_vrai)
432: {
433: profilage(s_etat_processus, NULL);
434: }
435:
436: (*s_etat_processus).erreur_systeme = d_es_processus;
437: return;
438: }
439:
1.37 bertrand 440: (*((struct_mutex *) (*s_objet_argument).objet)).tid = pthread_self();
441:
1.34 bertrand 442: # ifndef SEMAPHORES_NOMMES
443: while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
444: # else
445: while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
446: # endif
1.1 bertrand 447: {
1.33 bertrand 448: if (errno != EINTR)
449: {
450: (*s_etat_processus).erreur_systeme = d_es_processus;
451: return;
452: }
1.1 bertrand 453: }
454:
455: if ((*s_etat_processus).profilage == d_vrai)
456: {
457: profilage(s_etat_processus, NULL);
458: }
459: }
460: else
461: {
462: liberation(s_etat_processus, s_objet_argument);
463:
464: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
465: return;
466: }
467:
468: liberation(s_etat_processus, s_objet_argument);
469:
470: return;
471: }
472:
473:
474: /*
475: ================================================================================
476: Fonction 'mtxtrylock'
477: ================================================================================
478: Entrées :
479: --------------------------------------------------------------------------------
480: Sorties :
481: --------------------------------------------------------------------------------
482: Effets de bord : néant
483: ================================================================================
484: */
485:
486: void
487: instruction_mtxtrylock(struct_processus *s_etat_processus)
488: {
489: int ios;
490:
491: struct_liste_chainee *l_element_courant;
492:
493: struct_objet *s_objet_argument;
494: struct_objet *s_objet_resultat;
495:
496: unsigned char *tampon;
497:
498: (*s_etat_processus).erreur_execution = d_ex;
499:
500: if ((*s_etat_processus).affichage_arguments == 'Y')
501: {
502: printf("\n MTXTRYLOCK ");
503:
504: if ((*s_etat_processus).langue == 'F')
505: {
506: printf("(essai de verrouillage du mutex)\n\n");
507: }
508: else
509: {
510: printf("(try to lock mutex)\n\n");
511: }
512:
513: printf(" 1: %s\n", d_MTX);
514: printf("-> 1: %s\n", d_INT);
515:
516: return;
517: }
518: else if ((*s_etat_processus).test_instruction == 'Y')
519: {
520: (*s_etat_processus).nombre_arguments = -1;
521: return;
522: }
523:
524: if (test_cfsf(s_etat_processus, 31) == d_vrai)
525: {
526: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
527: {
528: return;
529: }
530: }
531:
532: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
533: &s_objet_argument) == d_erreur)
534: {
535: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
536: return;
537: }
538:
539: if ((*s_objet_argument).type == MTX)
540: {
541: l_element_courant = (*s_etat_processus).liste_mutexes;
542:
543: while(l_element_courant != NULL)
544: {
545: if (&((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
546: .mutex) == &((*((struct_mutex *) (*s_objet_argument).objet))
547: .mutex))
548: {
549: break;
550: }
551:
552: l_element_courant = (*l_element_courant).suivant;
553: }
554:
555: if (l_element_courant == NULL)
556: {
557: (*s_etat_processus).erreur_execution = d_ex_mutex;
558:
559: liberation(s_etat_processus, s_objet_argument);
560: return;
561: }
562:
563: if ((*s_etat_processus).profilage == d_vrai)
564: {
565: if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
566: == NULL)
567: {
568: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
569: return;
570: }
571:
572: profilage(s_etat_processus, tampon);
573: free(tampon);
574:
575: if ((*s_etat_processus).erreur_systeme != d_es)
576: {
577: return;
578: }
579: }
580:
581: if ((ios = pthread_mutex_trylock(&((*((struct_mutex *)
582: (*s_objet_argument).objet)).mutex))) != 0)
583: {
584: if (ios != EBUSY)
585: {
586: liberation(s_etat_processus, s_objet_argument);
587:
588: if ((*s_etat_processus).profilage == d_vrai)
589: {
590: profilage(s_etat_processus, NULL);
591: }
592:
593: (*s_etat_processus).erreur_systeme = d_es_processus;
594: return;
595: }
596: }
1.42 bertrand 597: else
598: {
599: (*((struct_mutex *) (*s_objet_argument).objet)).tid =
600: pthread_self();
601: }
1.37 bertrand 602:
1.1 bertrand 603: if ((*s_etat_processus).profilage == d_vrai)
604: {
605: profilage(s_etat_processus, NULL);
606: }
607: }
608: else
609: {
610: liberation(s_etat_processus, s_objet_argument);
611:
612: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
613: return;
614: }
615:
616: liberation(s_etat_processus, s_objet_argument);
617:
618: if ((s_objet_resultat = allocation(s_etat_processus, INT))
619: == NULL)
620: {
621: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
622: return;
623: }
624:
1.42 bertrand 625: (*((integer8 *) (*s_objet_resultat).objet)) = (ios == 0) ? -1 : 0;
1.1 bertrand 626:
627: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
628: s_objet_resultat) == d_erreur)
629: {
630: return;
631: }
632:
633: return;
634: }
635:
1.37 bertrand 636:
1.1 bertrand 637: /*
638: ================================================================================
639: Fonction 'mtxstatus'
640: ================================================================================
641: Entrées :
642: --------------------------------------------------------------------------------
643: Sorties :
644: --------------------------------------------------------------------------------
645: Effets de bord : néant
646: ================================================================================
647: */
648:
649: void
650: instruction_mtxstatus(struct_processus *s_etat_processus)
651: {
652: int ios;
653:
654: struct_liste_chainee *l_element_courant;
655:
656: struct_objet *s_objet_argument;
657: struct_objet *s_objet_resultat;
658:
659: unsigned char *tampon;
660:
661: (*s_etat_processus).erreur_execution = d_ex;
662:
663: if ((*s_etat_processus).affichage_arguments == 'Y')
664: {
665: printf("\n MTXSTATUS ");
666:
667: if ((*s_etat_processus).langue == 'F')
668: {
669: printf("(statut du mutex)\n\n");
670: }
671: else
672: {
673: printf("(mutex status)\n\n");
674: }
675:
676: printf(" 1: %s\n", d_MTX);
677: printf("-> 1: %s\n", d_INT);
678:
679: return;
680: }
681: else if ((*s_etat_processus).test_instruction == 'Y')
682: {
683: (*s_etat_processus).nombre_arguments = -1;
684: return;
685: }
686:
687: if (test_cfsf(s_etat_processus, 31) == d_vrai)
688: {
689: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
690: {
691: return;
692: }
693: }
694:
695: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
696: &s_objet_argument) == d_erreur)
697: {
698: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
699: return;
700: }
701:
702: if ((*s_objet_argument).type == MTX)
703: {
704: l_element_courant = (*s_etat_processus).liste_mutexes;
705:
706: while(l_element_courant != NULL)
707: {
708: if (&((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
709: .mutex) == &((*((struct_mutex *) (*s_objet_argument).objet))
710: .mutex))
711: {
712: break;
713: }
714:
715: l_element_courant = (*l_element_courant).suivant;
716: }
717:
718: if (l_element_courant == NULL)
719: {
720: (*s_etat_processus).erreur_execution = d_ex_mutex;
721:
722: liberation(s_etat_processus, s_objet_argument);
723: return;
724: }
725:
726: if ((*s_etat_processus).profilage == d_vrai)
727: {
728: if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
729: == NULL)
730: {
731: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
732: return;
733: }
734:
735: profilage(s_etat_processus, tampon);
736: free(tampon);
737:
738: if ((*s_etat_processus).erreur_systeme != d_es)
739: {
740: return;
741: }
742: }
743:
744: if ((ios = pthread_mutex_trylock(&((*((struct_mutex *)
745: (*s_objet_argument).objet)).mutex))) != 0)
746: {
747: if (ios != EBUSY)
748: {
749: liberation(s_etat_processus, s_objet_argument);
750:
751: if ((*s_etat_processus).profilage == d_vrai)
752: {
753: profilage(s_etat_processus, NULL);
754: }
755:
756: (*s_etat_processus).erreur_systeme = d_es_processus;
757: return;
758: }
759: }
760:
1.37 bertrand 761: if (ios == 0)
1.1 bertrand 762: {
1.37 bertrand 763: // Le mutex a été verrouillé par le trylock précédent.
1.1 bertrand 764:
1.37 bertrand 765: if (pthread_mutex_unlock(&((*((struct_mutex *)
766: (*s_objet_argument).objet)).mutex)) != 0)
1.1 bertrand 767: {
1.37 bertrand 768: liberation(s_etat_processus, s_objet_argument);
769:
770: if ((*s_etat_processus).profilage == d_vrai)
771: {
772: profilage(s_etat_processus, NULL);
773: }
774:
775: (*s_etat_processus).erreur_systeme = d_es_processus;
776: return;
1.1 bertrand 777: }
778: }
779:
780: if ((*s_etat_processus).profilage == d_vrai)
781: {
782: profilage(s_etat_processus, NULL);
783: }
784: }
785: else
786: {
787: liberation(s_etat_processus, s_objet_argument);
788:
789: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
790: return;
791: }
792:
793: liberation(s_etat_processus, s_objet_argument);
794:
795: if ((s_objet_resultat = allocation(s_etat_processus, INT))
796: == NULL)
797: {
798: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
799: return;
800: }
801:
802: (*((integer8 *) (*s_objet_resultat).objet)) = (ios == 0) ? 0 : -1;
803:
804: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
805: s_objet_resultat) == d_erreur)
806: {
807: return;
808: }
809:
810: return;
811: }
812:
813:
814: /*
815: ================================================================================
816: Fonction 'mtxunlock'
817: ================================================================================
818: Entrées :
819: --------------------------------------------------------------------------------
820: Sorties :
821: --------------------------------------------------------------------------------
822: Effets de bord : néant
823: ================================================================================
824: */
825:
826: void
827: instruction_mtxunlock(struct_processus *s_etat_processus)
828: {
829: struct_liste_chainee *l_element_courant;
830:
831: struct_objet *s_objet_argument;
832:
833: (*s_etat_processus).erreur_execution = d_ex;
834:
835: if ((*s_etat_processus).affichage_arguments == 'Y')
836: {
837: printf("\n MTXUNLOCK ");
838:
839: if ((*s_etat_processus).langue == 'F')
840: {
841: printf("(déverrouille un mutex)\n\n");
842: }
843: else
844: {
845: printf("(unlock mutex)\n\n");
846: }
847:
848: printf(" 1: %s\n", d_MTX);
849:
850: return;
851: }
852: else if ((*s_etat_processus).test_instruction == 'Y')
853: {
854: (*s_etat_processus).nombre_arguments = -1;
855: return;
856: }
857:
858: if (test_cfsf(s_etat_processus, 31) == d_vrai)
859: {
860: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
861: {
862: return;
863: }
864: }
865:
866: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
867: &s_objet_argument) == d_erreur)
868: {
869: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
870: return;
871: }
872:
873: if ((*s_objet_argument).type == MTX)
874: {
875: l_element_courant = (*s_etat_processus).liste_mutexes;
876:
877: while(l_element_courant != NULL)
878: {
879: if (&((*((struct_mutex *) (*(*l_element_courant).donnee).objet))
880: .mutex) == &((*((struct_mutex *) (*s_objet_argument).objet))
881: .mutex))
882: {
883: break;
884: }
885:
886: l_element_courant = (*l_element_courant).suivant;
887: }
888:
889: if (l_element_courant == NULL)
890: {
1.37 bertrand 891: liberation(s_etat_processus, s_objet_argument);
892:
1.1 bertrand 893: (*s_etat_processus).erreur_execution = d_ex_mutex;
1.37 bertrand 894: return;
895: }
1.1 bertrand 896:
1.37 bertrand 897: if (pthread_equal(pthread_self(), (*((struct_mutex *)
898: (*s_objet_argument).objet)).tid) == 0)
899: {
1.1 bertrand 900: liberation(s_etat_processus, s_objet_argument);
1.37 bertrand 901:
902: (*s_etat_processus).erreur_execution =
903: d_ex_mutex_acquis_autre_thread;
1.1 bertrand 904: return;
905: }
906:
907: if (pthread_mutex_trylock(&((*((struct_mutex *)
908: (*s_objet_argument).objet)).mutex)) == EINVAL)
909: {
910: liberation(s_etat_processus, s_objet_argument);
911:
912: (*s_etat_processus).erreur_systeme = d_es_processus;
913: return;
914: }
915:
916: if (pthread_mutex_unlock(&((*((struct_mutex *)
917: (*s_objet_argument).objet)).mutex)) != 0)
918: {
919: liberation(s_etat_processus, s_objet_argument);
920:
921: (*s_etat_processus).erreur_systeme = d_es_processus;
922: return;
923: }
924: }
925: else
926: {
927: liberation(s_etat_processus, s_objet_argument);
928:
929: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
930: return;
931: }
932:
933: liberation(s_etat_processus, s_objet_argument);
934:
935: return;
936: }
937:
938:
939: /*
940: ================================================================================
941: Fonction 'mark'
942: ================================================================================
943: Entrées :
944: --------------------------------------------------------------------------------
945: Sorties :
946: --------------------------------------------------------------------------------
947: Effets de bord : néant
948: ================================================================================
949: */
950:
951: void
952: instruction_mark(struct_processus *s_etat_processus)
953: {
954: struct_marque *marque;
955:
956: struct_objet *s_objet_argument;
957: struct_objet *s_objet_label;
958:
959: (*s_etat_processus).erreur_execution = d_ex;
960:
961: if ((*s_etat_processus).affichage_arguments == 'Y')
962: {
963: printf("\n MARK ");
964:
965: if ((*s_etat_processus).langue == 'F')
966: {
967: printf("(ajoute une marque à un graphique)\n\n");
968: }
969: else
970: {
971: printf("(add mark to graph)\n\n");
972: }
973:
974: printf(" 2: %s\n", d_CHN);
975: printf(" 1: %s\n", d_CPL);
976:
977: return;
978: }
979: else if ((*s_etat_processus).test_instruction == 'Y')
980: {
981: (*s_etat_processus).nombre_arguments = -1;
982: return;
983: }
984:
985: if (test_cfsf(s_etat_processus, 31) == d_vrai)
986: {
987: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
988: {
989: return;
990: }
991: }
992:
993: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
994: &s_objet_argument) == d_erreur)
995: {
996: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
997: return;
998: }
999:
1000: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1001: &s_objet_label) == d_erreur)
1002: {
1003: liberation(s_etat_processus, s_objet_argument);
1004:
1005: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
1006: return;
1007: }
1008:
1009: if (((*s_objet_argument).type == CPL) && ((*s_objet_label).type == CHN))
1010: {
1011: if ((marque = malloc(sizeof(struct_marque))) == NULL)
1012: {
1013: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1014: return;
1015: }
1016:
1017: if (((*marque).label = malloc((strlen((unsigned char *)
1018: (*s_objet_label).objet) + 1) * sizeof(unsigned char))) == NULL)
1019: {
1020: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1021: return;
1022: }
1023:
1024: sprintf((*marque).label, "%s",
1025: (unsigned char *) (*s_objet_label).objet);
1026:
1027: if (((*marque).position = malloc(64 * sizeof(unsigned char))) == NULL)
1028: {
1029: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
1030: return;
1031: }
1032:
1033: sprintf((*marque).position, "%f,%f",
1034: (*((complex16 *) (*s_objet_argument).objet)).partie_reelle,
1035: (*((complex16 *) (*s_objet_argument).objet)).partie_imaginaire);
1036:
1037: (*marque).suivant = (*s_etat_processus).s_marques;
1038: (*s_etat_processus).s_marques = marque;
1039:
1040: (*s_etat_processus).mise_a_jour_trace_requise = d_vrai;
1041: }
1042: else
1043: {
1044: liberation(s_etat_processus, s_objet_argument);
1045: liberation(s_etat_processus, s_objet_label);
1046:
1047: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
1048: return;
1049: }
1050:
1051: liberation(s_etat_processus, s_objet_argument);
1052: liberation(s_etat_processus, s_objet_label);
1053:
1054: return;
1055: }
1056:
1057: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>