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