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