Annotation of rpl/src/instructions_d5.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 'DFT'
! 29: ================================================================================
! 30: Entrées : structure processus
! 31: --------------------------------------------------------------------------------
! 32: Sorties :
! 33: --------------------------------------------------------------------------------
! 34: Effets de bord : néant
! 35: ================================================================================
! 36: */
! 37:
! 38: void
! 39: instruction_dft(struct_processus *s_etat_processus)
! 40: {
! 41: integer4 erreur;
! 42: integer4 inverse;
! 43: integer4 nombre_colonnes;
! 44: integer4 nombre_lignes;
! 45:
! 46: logical1 presence_longueur_dft;
! 47:
! 48: long longueur_dft_signee;
! 49:
! 50: struct_complexe16 *matrice_f77;
! 51:
! 52: struct_objet *s_objet_argument;
! 53: struct_objet *s_objet_longueur_dft;
! 54: struct_objet *s_objet_resultat;
! 55:
! 56: unsigned long i;
! 57: unsigned long j;
! 58: unsigned long k;
! 59: unsigned long longueur_dft;
! 60:
! 61: (*s_etat_processus).erreur_execution = d_ex;
! 62:
! 63: if ((*s_etat_processus).affichage_arguments == 'Y')
! 64: {
! 65: printf("\n DFT ");
! 66:
! 67: if ((*s_etat_processus).langue == 'F')
! 68: {
! 69: printf("(transformée de Fourier discrète)\n\n");
! 70: }
! 71: else
! 72: {
! 73: printf("(discrete Fourier transform)\n\n");
! 74: }
! 75:
! 76: printf(" 1: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
! 77: printf("-> 1: %s\n\n", d_VCX);
! 78:
! 79: printf(" 2: %s, %s, %s\n", d_VIN, d_VRL, d_VCX);
! 80: printf(" 1: %s\n", d_INT);
! 81: printf("-> 1: %s\n\n", d_VCX);
! 82:
! 83: printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
! 84: printf("-> 1: %s\n\n", d_VCX);
! 85:
! 86: printf(" 2: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
! 87: printf(" 1: %s\n", d_INT);
! 88: printf("-> 1: %s\n", d_MCX);
! 89:
! 90: return;
! 91: }
! 92: else if ((*s_etat_processus).test_instruction == 'Y')
! 93: {
! 94: (*s_etat_processus).nombre_arguments = -1;
! 95: return;
! 96: }
! 97:
! 98: /*
! 99: * Il est possible d'imposer une longueur de DFT au premier niveau
! 100: * de la pile.
! 101: */
! 102:
! 103: if ((*s_etat_processus).l_base_pile == NULL)
! 104: {
! 105: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 106: return;
! 107: }
! 108:
! 109: if ((*(*(*s_etat_processus).l_base_pile).donnee).type == INT)
! 110: {
! 111: presence_longueur_dft = d_vrai;
! 112:
! 113: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 114: {
! 115: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
! 116: {
! 117: return;
! 118: }
! 119: }
! 120:
! 121: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 122: &s_objet_longueur_dft) == d_erreur)
! 123: {
! 124: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 125: return;
! 126: }
! 127:
! 128: longueur_dft_signee = (*((integer8 *) (*s_objet_longueur_dft).objet));
! 129:
! 130: liberation(s_etat_processus, s_objet_longueur_dft);
! 131:
! 132: if (longueur_dft_signee <= 0)
! 133: {
! 134: (*s_etat_processus).erreur_execution = d_ex_longueur_dft;
! 135: return;
! 136: }
! 137:
! 138: longueur_dft = longueur_dft_signee;
! 139: }
! 140: else
! 141: {
! 142: presence_longueur_dft = d_faux;
! 143: longueur_dft = 0;
! 144:
! 145: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 146: {
! 147: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 148: {
! 149: return;
! 150: }
! 151: }
! 152: }
! 153:
! 154: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 155: &s_objet_argument) == d_erreur)
! 156: {
! 157: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 158: return;
! 159: }
! 160:
! 161: /*
! 162: --------------------------------------------------------------------------------
! 163: Vecteur
! 164: --------------------------------------------------------------------------------
! 165: */
! 166:
! 167: if (((*s_objet_argument).type == VIN) ||
! 168: ((*s_objet_argument).type == VRL) ||
! 169: ((*s_objet_argument).type == VCX))
! 170: {
! 171: if (presence_longueur_dft == d_faux)
! 172: {
! 173: longueur_dft = (*((struct_vecteur *)
! 174: (*s_objet_argument).objet)).taille;
! 175: }
! 176:
! 177: if ((matrice_f77 = malloc(longueur_dft *
! 178: sizeof(struct_complexe16))) == NULL)
! 179: {
! 180: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 181: return;
! 182: }
! 183:
! 184: if ((*s_objet_argument).type == VIN)
! 185: {
! 186: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
! 187: .taille; i++)
! 188: {
! 189: matrice_f77[i].partie_reelle = (real8) ((integer8 *)
! 190: (*((struct_vecteur *) (*s_objet_argument).objet))
! 191: .tableau)[i];
! 192: matrice_f77[i].partie_imaginaire = (real8) 0;
! 193: }
! 194: }
! 195: else if ((*s_objet_argument).type == VRL)
! 196: {
! 197: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
! 198: .taille; i++)
! 199: {
! 200: matrice_f77[i].partie_reelle = ((real8 *)
! 201: (*((struct_vecteur *) (*s_objet_argument).objet))
! 202: .tableau)[i];
! 203: matrice_f77[i].partie_imaginaire = (real8) 0;
! 204: }
! 205: }
! 206: else
! 207: {
! 208: for(i = 0; i < (*((struct_vecteur *) (*s_objet_argument).objet))
! 209: .taille; i++)
! 210: {
! 211: matrice_f77[i].partie_reelle = ((struct_complexe16 *)
! 212: (*((struct_vecteur *) (*s_objet_argument).objet))
! 213: .tableau)[i].partie_reelle;
! 214: matrice_f77[i].partie_imaginaire = ((struct_complexe16 *)
! 215: (*((struct_vecteur *) (*s_objet_argument).objet))
! 216: .tableau)[i].partie_imaginaire;
! 217: }
! 218: }
! 219:
! 220: for(; i < longueur_dft; i++)
! 221: {
! 222: matrice_f77[i].partie_reelle = (real8) 0;
! 223: matrice_f77[i].partie_imaginaire = (real8) 0;
! 224: }
! 225:
! 226: nombre_lignes = 1;
! 227: nombre_colonnes = longueur_dft;
! 228: inverse = 0;
! 229:
! 230: dft(matrice_f77, &nombre_lignes, &nombre_colonnes, &inverse, &erreur);
! 231:
! 232: if (erreur != 0)
! 233: {
! 234: liberation(s_etat_processus, s_objet_argument);
! 235: free(matrice_f77);
! 236:
! 237: (*s_etat_processus).erreur_execution = d_ex_longueur_dft;
! 238: return;
! 239: }
! 240:
! 241: if ((s_objet_resultat = allocation(s_etat_processus, VCX)) == NULL)
! 242: {
! 243: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 244: return;
! 245: }
! 246:
! 247: (*((struct_vecteur *) (*s_objet_resultat).objet)).taille = longueur_dft;
! 248: (*((struct_vecteur *) (*s_objet_resultat).objet)).tableau = matrice_f77;
! 249: }
! 250:
! 251: /*
! 252: --------------------------------------------------------------------------------
! 253: Matrice
! 254: --------------------------------------------------------------------------------
! 255: */
! 256:
! 257: else if (((*s_objet_argument).type == MIN) ||
! 258: ((*s_objet_argument).type == MRL) ||
! 259: ((*s_objet_argument).type == MCX))
! 260: {
! 261: if (presence_longueur_dft == d_faux)
! 262: {
! 263: longueur_dft = (*((struct_matrice *)
! 264: (*s_objet_argument).objet)).nombre_colonnes;
! 265: }
! 266:
! 267: if ((matrice_f77 = malloc(longueur_dft *
! 268: (*((struct_matrice *) (*s_objet_argument).objet))
! 269: .nombre_lignes * sizeof(struct_complexe16))) == NULL)
! 270: {
! 271: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 272: return;
! 273: }
! 274:
! 275: if ((*s_objet_argument).type == MIN)
! 276: {
! 277: for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_argument)
! 278: .objet)).nombre_lignes; j++)
! 279: {
! 280: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument)
! 281: .objet)).nombre_colonnes; i++)
! 282: {
! 283: matrice_f77[k].partie_reelle = (real8) ((integer8 **)
! 284: (*((struct_matrice *) (*s_objet_argument).objet))
! 285: .tableau)[j][i];
! 286: matrice_f77[k++].partie_imaginaire = (real8) 0;
! 287: }
! 288: }
! 289:
! 290: for(; k < longueur_dft * (*((struct_matrice *) (*s_objet_argument)
! 291: .objet)).nombre_lignes; k++)
! 292: {
! 293: matrice_f77[k].partie_reelle = (real8) 0;
! 294: matrice_f77[k].partie_imaginaire = (real8) 0;
! 295: }
! 296: }
! 297: else if ((*s_objet_argument).type == MRL)
! 298: {
! 299: for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_argument)
! 300: .objet)).nombre_lignes; j++)
! 301: {
! 302: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument)
! 303: .objet)).nombre_colonnes; i++)
! 304: {
! 305: matrice_f77[k].partie_reelle = ((real8 **)
! 306: (*((struct_matrice *) (*s_objet_argument).objet))
! 307: .tableau)[j][i];
! 308: matrice_f77[k++].partie_imaginaire = (real8) 0;
! 309: }
! 310: }
! 311:
! 312: for(; k < longueur_dft * (*((struct_matrice *) (*s_objet_argument)
! 313: .objet)).nombre_lignes; k++)
! 314: {
! 315: matrice_f77[k].partie_reelle = (real8) 0;
! 316: matrice_f77[k].partie_imaginaire = (real8) 0;
! 317: }
! 318: }
! 319: else
! 320: {
! 321: for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_argument)
! 322: .objet)).nombre_lignes; j++)
! 323: {
! 324: for(i = 0; i < (*((struct_matrice *) (*s_objet_argument)
! 325: .objet)).nombre_colonnes; i++)
! 326: {
! 327: matrice_f77[k].partie_reelle = ((struct_complexe16 **)
! 328: (*((struct_matrice *) (*s_objet_argument).objet))
! 329: .tableau)[j][i].partie_reelle;
! 330: matrice_f77[k++].partie_imaginaire =
! 331: ((struct_complexe16 **) (*((struct_matrice *)
! 332: (*s_objet_argument).objet)).tableau)[j][i]
! 333: .partie_imaginaire;
! 334: }
! 335: }
! 336:
! 337: for(; k < longueur_dft * (*((struct_matrice *) (*s_objet_argument)
! 338: .objet)).nombre_lignes; k++)
! 339: {
! 340: matrice_f77[k].partie_reelle = (real8) 0;
! 341: matrice_f77[k].partie_imaginaire = (real8) 0;
! 342: }
! 343: }
! 344:
! 345: nombre_lignes = (*((struct_matrice *) (*s_objet_argument).objet))
! 346: .nombre_lignes;
! 347: nombre_colonnes = longueur_dft;
! 348: inverse = 0;
! 349:
! 350: dft(matrice_f77, &nombre_lignes, &nombre_colonnes, &inverse, &erreur);
! 351:
! 352: if (erreur != 0)
! 353: {
! 354: liberation(s_etat_processus, s_objet_argument);
! 355: free(matrice_f77);
! 356:
! 357: (*s_etat_processus).erreur_execution = d_ex_longueur_dft;
! 358: return;
! 359: }
! 360:
! 361: if ((s_objet_resultat = allocation(s_etat_processus, MCX)) == NULL)
! 362: {
! 363: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 364: return;
! 365: }
! 366:
! 367: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_lignes =
! 368: (*((struct_matrice *) (*s_objet_argument).objet))
! 369: .nombre_lignes;
! 370: (*((struct_matrice *) (*s_objet_resultat).objet)).nombre_colonnes =
! 371: longueur_dft;
! 372:
! 373: if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau =
! 374: malloc((*((struct_matrice *) (*s_objet_resultat).objet))
! 375: .nombre_lignes * sizeof(struct_complexe16 *))) == NULL)
! 376: {
! 377: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 378: return;
! 379: }
! 380:
! 381: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
! 382: .nombre_lignes; i++)
! 383: {
! 384: if ((((struct_complexe16 **) (*((struct_matrice *)
! 385: (*s_objet_resultat).objet)).tableau)[i] =
! 386: malloc((*((struct_matrice *)
! 387: (*s_objet_resultat).objet)).nombre_colonnes *
! 388: sizeof(struct_complexe16))) == NULL)
! 389: {
! 390: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 391: return;
! 392: }
! 393: }
! 394:
! 395: for(k = 0, j = 0; j < (*((struct_matrice *) (*s_objet_resultat).objet))
! 396: .nombre_lignes; j++)
! 397: {
! 398: for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat).objet))
! 399: .nombre_colonnes; i++)
! 400: {
! 401: ((struct_complexe16 **) (*((struct_matrice *)
! 402: (*s_objet_resultat).objet)).tableau)[j][i]
! 403: .partie_reelle = matrice_f77[k].partie_reelle;
! 404: ((struct_complexe16 **) (*((struct_matrice *)
! 405: (*s_objet_resultat).objet)).tableau)[j][i]
! 406: .partie_imaginaire = matrice_f77[k++].partie_imaginaire;
! 407: }
! 408: }
! 409:
! 410: free(matrice_f77);
! 411: }
! 412:
! 413: /*
! 414: --------------------------------------------------------------------------------
! 415: Calcul de DFT impossible
! 416: --------------------------------------------------------------------------------
! 417: */
! 418:
! 419: else
! 420: {
! 421: liberation(s_etat_processus, s_objet_argument);
! 422:
! 423: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 424: return;
! 425: }
! 426:
! 427: liberation(s_etat_processus, s_objet_argument);
! 428:
! 429: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 430: s_objet_resultat) == d_erreur)
! 431: {
! 432: return;
! 433: }
! 434:
! 435: return;
! 436: }
! 437:
! 438:
! 439: /*
! 440: ================================================================================
! 441: Fonction 'DER'
! 442: ================================================================================
! 443: Entrées : structure processus
! 444: --------------------------------------------------------------------------------
! 445: Sorties :
! 446: --------------------------------------------------------------------------------
! 447: Effets de bord : néant
! 448: ================================================================================
! 449: */
! 450:
! 451: void
! 452: instruction_der(struct_processus *s_etat_processus)
! 453: {
! 454: logical1 expression_rpn;
! 455: logical1 last_valide;
! 456:
! 457: struct_liste_chainee *l_element_courant;
! 458: struct_liste_chainee *l_element_precedent;
! 459:
! 460: struct_objet *s_copie_argument_2;
! 461: struct_objet *s_objet_argument_1;
! 462: struct_objet *s_objet_argument_2;
! 463: struct_objet *s_objet_resultat;
! 464: struct_objet *s_objet_simplifie;
! 465:
! 466: (*s_etat_processus).erreur_execution = d_ex;
! 467:
! 468: if ((*s_etat_processus).affichage_arguments == 'Y')
! 469: {
! 470: printf("\n DER ");
! 471:
! 472: if ((*s_etat_processus).langue == 'F')
! 473: {
! 474: printf("(dérivation)\n\n");
! 475: }
! 476: else
! 477: {
! 478: printf("(derivation)\n\n");
! 479: }
! 480:
! 481: printf(" 2: %s, %s, %s, %s\n", d_INT, d_REL, d_CPL, d_NOM);
! 482: printf(" 1: %s\n", d_NOM);
! 483: printf("-> 1: %s\n\n", d_INT);
! 484:
! 485: printf(" 2: %s, %s\n", d_RPN, d_ALG);
! 486: printf(" 1: %s\n", d_NOM);
! 487: printf("-> 1: %s, %s\n", d_RPN, d_ALG);
! 488:
! 489: return;
! 490: }
! 491: else if ((*s_etat_processus).test_instruction == 'Y')
! 492: {
! 493: (*s_etat_processus).nombre_arguments = 2;
! 494: return;
! 495: }
! 496:
! 497: if ((last_valide = test_cfsf(s_etat_processus, 31)) == d_vrai)
! 498: {
! 499: if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
! 500: {
! 501: return;
! 502: }
! 503: }
! 504:
! 505: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 506: &s_objet_argument_1) == d_erreur)
! 507: {
! 508: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 509: return;
! 510: }
! 511:
! 512: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 513: &s_objet_argument_2) == d_erreur)
! 514: {
! 515: liberation(s_etat_processus, s_objet_argument_1);
! 516:
! 517: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 518: return;
! 519: }
! 520:
! 521: expression_rpn = d_faux;
! 522:
! 523: /*
! 524: * Dérivation d'une expression
! 525: */
! 526:
! 527: if (((*s_objet_argument_1).type == NOM) &&
! 528: (((*s_objet_argument_2).type == RPN) ||
! 529: ((*s_objet_argument_2).type == ALG)))
! 530: {
! 531: if ((s_copie_argument_2 = copie_objet(s_etat_processus,
! 532: s_objet_argument_2, 'N')) == NULL)
! 533: {
! 534: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 535: return;
! 536: }
! 537:
! 538: if ((*s_copie_argument_2).type == RPN)
! 539: {
! 540: expression_rpn = d_vrai;
! 541: }
! 542:
! 543: l_element_courant = (struct_liste_chainee *)
! 544: (*s_copie_argument_2).objet;
! 545: l_element_precedent = l_element_courant;
! 546:
! 547: while((*l_element_courant).suivant != NULL)
! 548: {
! 549: l_element_precedent = l_element_courant;
! 550: l_element_courant = (*l_element_courant).suivant;
! 551: }
! 552:
! 553: if (((*l_element_precedent).suivant =
! 554: allocation_maillon(s_etat_processus)) == NULL)
! 555: {
! 556: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 557: return;
! 558: }
! 559:
! 560: (*(*l_element_precedent).suivant).donnee = s_objet_argument_1;
! 561: l_element_precedent = (*l_element_precedent).suivant;
! 562:
! 563: if (((*l_element_precedent).suivant =
! 564: allocation_maillon(s_etat_processus)) == NULL)
! 565: {
! 566: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 567: return;
! 568: }
! 569:
! 570: if (((*(*l_element_precedent).suivant).donnee =
! 571: allocation(s_etat_processus, FCT)) == NULL)
! 572: {
! 573: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 574: return;
! 575: }
! 576:
! 577: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
! 578: .donnee).objet)).nombre_arguments = 2;
! 579: (*((struct_fonction *) (*(*(*l_element_precedent).suivant)
! 580: .donnee).objet)).fonction = instruction_der;
! 581:
! 582: if (((*((struct_fonction *) (*(*(*l_element_precedent)
! 583: .suivant).donnee).objet)).nom_fonction =
! 584: malloc(4 * sizeof(unsigned char))) == NULL)
! 585: {
! 586: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 587: return;
! 588: }
! 589:
! 590: strcpy((*((struct_fonction *) (*(*(*l_element_precedent)
! 591: .suivant).donnee).objet)).nom_fonction, "DER");
! 592:
! 593: (*(*l_element_precedent).suivant).suivant = l_element_courant;
! 594:
! 595: s_objet_resultat = s_copie_argument_2;
! 596: s_objet_argument_1 = NULL;
! 597: }
! 598:
! 599: /*
! 600: * Dérivation d'un nom ou d'une constante
! 601: */
! 602:
! 603: else if (((*s_objet_argument_1).type == NOM) &&
! 604: (((*s_objet_argument_2).type == NOM) ||
! 605: ((*s_objet_argument_2).type == INT) ||
! 606: ((*s_objet_argument_2).type == REL) ||
! 607: ((*s_objet_argument_2).type == CPL)))
! 608: {
! 609: if ((s_objet_resultat = allocation(s_etat_processus, ALG)) == NULL)
! 610: {
! 611: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 612: return;
! 613: }
! 614:
! 615: if (((*s_objet_resultat).objet =
! 616: allocation_maillon(s_etat_processus)) == NULL)
! 617: {
! 618: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 619: return;
! 620: }
! 621:
! 622: l_element_courant = (*s_objet_resultat).objet;
! 623:
! 624: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 625: == NULL)
! 626: {
! 627: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 628: return;
! 629: }
! 630:
! 631: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 632: .nombre_arguments = 0;
! 633: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 634: .fonction = instruction_vers_niveau_superieur;
! 635:
! 636: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 637: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
! 638: {
! 639: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 640: return;
! 641: }
! 642:
! 643: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 644: .nom_fonction, "<<");
! 645:
! 646: if (((*l_element_courant).suivant =
! 647: allocation_maillon(s_etat_processus)) == NULL)
! 648: {
! 649: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 650: return;
! 651: }
! 652:
! 653: l_element_courant = (*l_element_courant).suivant;
! 654: (*l_element_courant).donnee = s_objet_argument_2;
! 655:
! 656: if (((*l_element_courant).suivant =
! 657: allocation_maillon(s_etat_processus)) == NULL)
! 658: {
! 659: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 660: return;
! 661: }
! 662:
! 663: l_element_courant = (*l_element_courant).suivant;
! 664: (*l_element_courant).donnee = s_objet_argument_1;
! 665:
! 666: if (((*l_element_courant).suivant =
! 667: allocation_maillon(s_etat_processus)) == NULL)
! 668: {
! 669: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 670: return;
! 671: }
! 672:
! 673: l_element_courant = (*l_element_courant).suivant;
! 674:
! 675: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 676: == NULL)
! 677: {
! 678: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 679: return;
! 680: }
! 681:
! 682: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 683: .nombre_arguments = 2;
! 684: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 685: .fonction = instruction_der;
! 686:
! 687: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 688: .nom_fonction = malloc(4 * sizeof(unsigned char))) == NULL)
! 689: {
! 690: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 691: return;
! 692: }
! 693:
! 694: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 695: .nom_fonction, "DER");
! 696:
! 697: if (((*l_element_courant).suivant =
! 698: allocation_maillon(s_etat_processus)) == NULL)
! 699: {
! 700: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 701: return;
! 702: }
! 703:
! 704: l_element_courant = (*l_element_courant).suivant;
! 705:
! 706: if (((*l_element_courant).donnee = allocation(s_etat_processus, FCT))
! 707: == NULL)
! 708: {
! 709: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 710: return;
! 711: }
! 712:
! 713: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 714: .nombre_arguments = 0;
! 715: (*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 716: .fonction = instruction_vers_niveau_inferieur;
! 717:
! 718: if (((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 719: .nom_fonction = malloc(3 * sizeof(unsigned char))) == NULL)
! 720: {
! 721: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 722: return;
! 723: }
! 724:
! 725: strcpy((*((struct_fonction *) (*(*l_element_courant).donnee).objet))
! 726: .nom_fonction, ">>");
! 727:
! 728: (*l_element_courant).suivant = NULL;
! 729:
! 730: s_objet_argument_1 = NULL;
! 731: s_objet_argument_2 = NULL;
! 732: }
! 733:
! 734: /*
! 735: * Dérivation impossible
! 736: */
! 737:
! 738: else
! 739: {
! 740: liberation(s_etat_processus, s_objet_argument_1);
! 741: liberation(s_etat_processus, s_objet_argument_2);
! 742:
! 743: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 744: return;
! 745: }
! 746:
! 747: liberation(s_etat_processus, s_objet_argument_1);
! 748: liberation(s_etat_processus, s_objet_argument_2);
! 749:
! 750: if (expression_rpn == d_faux)
! 751: {
! 752: if (last_valide == d_vrai)
! 753: {
! 754: cf(s_etat_processus, 31);
! 755: }
! 756:
! 757: derivation(s_etat_processus, &s_objet_resultat);
! 758:
! 759: if (last_valide == d_vrai)
! 760: {
! 761: sf(s_etat_processus, 31);
! 762: }
! 763:
! 764: if (((*s_etat_processus).var_volatile_requete_arret == 0) &&
! 765: (s_objet_resultat != NULL))
! 766: {
! 767: if ((s_objet_simplifie = simplification(s_etat_processus,
! 768: s_objet_resultat)) == NULL)
! 769: {
! 770: return;
! 771: }
! 772:
! 773: liberation(s_etat_processus, s_objet_resultat);
! 774:
! 775: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 776: s_objet_simplifie) == d_erreur)
! 777: {
! 778: return;
! 779: }
! 780: }
! 781: else
! 782: {
! 783: if (s_objet_resultat != NULL)
! 784: {
! 785: liberation(s_etat_processus, s_objet_resultat);
! 786: }
! 787: }
! 788: }
! 789: else
! 790: {
! 791: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 792: s_objet_resultat) == d_erreur)
! 793: {
! 794: return;
! 795: }
! 796: }
! 797:
! 798: return;
! 799: }
! 800:
! 801:
! 802: /*
! 803: ================================================================================
! 804: Fonction 'DETACH'
! 805: ================================================================================
! 806: Entrées : structure processus
! 807: --------------------------------------------------------------------------------
! 808: Sorties :
! 809: --------------------------------------------------------------------------------
! 810: Effets de bord : néant
! 811: ================================================================================
! 812: */
! 813:
! 814: void
! 815: instruction_detach(struct_processus *s_etat_processus)
! 816: {
! 817: int status;
! 818:
! 819: logical1 drapeau;
! 820: logical1 variable_partagee;
! 821:
! 822: pid_t ppid;
! 823: pid_t pid_final;
! 824:
! 825: pthread_attr_t attributs;
! 826:
! 827: pthread_mutexattr_t attributs_mutex;
! 828:
! 829: pthread_t thread_surveillance;
! 830:
! 831: sig_atomic_t registre_stop;
! 832:
! 833: sigset_t oldset;
! 834: sigset_t oldset2;
! 835: sigset_t set;
! 836: sigset_t set2;
! 837:
! 838: ssize_t longueur_ecriture;
! 839:
! 840: struct_descripteur_thread *s_argument_thread;
! 841:
! 842: struct_liste_chainee *l_element_courant;
! 843: struct_liste_chainee *l_element_precedent;
! 844: struct_liste_chainee *l_element_suivant;
! 845:
! 846: struct_objet *s_copie;
! 847: struct_objet *s_objet;
! 848: struct_objet *s_objet_systeme;
! 849: struct_objet *s_objet_temporaire;
! 850:
! 851: struct sigaction action;
! 852: struct sigaction registre;
! 853:
! 854: struct timespec attente;
! 855:
! 856: unsigned char *message;
! 857:
! 858: unsigned int erreur;
! 859:
! 860: unsigned long i;
! 861:
! 862: (*s_etat_processus).erreur_execution = d_ex;
! 863:
! 864: attente.tv_sec = 0;
! 865: attente.tv_nsec = GRANULARITE_us * 1000;
! 866: s_copie = NULL;
! 867:
! 868: if ((*s_etat_processus).affichage_arguments == 'Y')
! 869: {
! 870: printf("\n DETACH ");
! 871:
! 872: if ((*s_etat_processus).langue == 'F')
! 873: {
! 874: printf("(détachement d'un processus)\n\n");
! 875: }
! 876: else
! 877: {
! 878: printf("(fork)\n\n");
! 879: }
! 880:
! 881: printf(" 1: %s, %s\n", d_NOM, d_RPN);
! 882: printf("-> 1: %s\n", d_PRC);
! 883:
! 884: return;
! 885: }
! 886: else if ((*s_etat_processus).test_instruction == 'Y')
! 887: {
! 888: (*s_etat_processus).nombre_arguments = -1;
! 889: return;
! 890: }
! 891:
! 892: if (test_cfsf(s_etat_processus, 31) == d_vrai)
! 893: {
! 894: if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
! 895: {
! 896: return;
! 897: }
! 898: }
! 899:
! 900: if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 901: &s_objet) == d_erreur)
! 902: {
! 903: (*s_etat_processus).erreur_execution = d_ex_manque_argument;
! 904: return;
! 905: }
! 906:
! 907: /*
! 908: * Une routine fille doit pouvoir renvoyer des objets au processus
! 909: * père au travers de la fonction SEND. Il ne peut donc s'agir que
! 910: * d'une fonction ou d'une expression RPN.
! 911: */
! 912:
! 913: if (((*s_objet).type != NOM) && ((*s_objet).type != RPN))
! 914: {
! 915: liberation(s_etat_processus, s_objet);
! 916:
! 917: (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
! 918: return;
! 919: }
! 920:
! 921: /*
! 922: * Si l'argument est de type NOM, il faut que la variable correspondante
! 923: * soit une variable de type RPN.
! 924: */
! 925:
! 926: variable_partagee = d_faux;
! 927:
! 928: if ((*s_objet).type == NOM)
! 929: {
! 930: if (recherche_variable(s_etat_processus, (*((struct_nom *)
! 931: (*s_objet).objet)).nom) == d_vrai)
! 932: {
! 933: if ((*s_etat_processus).s_liste_variables
! 934: [(*s_etat_processus).position_variable_courante].objet
! 935: == NULL)
! 936: {
! 937: if (pthread_mutex_lock(&((*(*s_etat_processus)
! 938: .s_liste_variables_partagees).mutex)) != 0)
! 939: {
! 940: (*s_etat_processus).erreur_systeme = d_es_processus;
! 941: return;
! 942: }
! 943:
! 944: if (recherche_variable_partagee(s_etat_processus,
! 945: (*s_etat_processus).s_liste_variables
! 946: [(*s_etat_processus).position_variable_courante].nom,
! 947: (*s_etat_processus).s_liste_variables
! 948: [(*s_etat_processus).position_variable_courante]
! 949: .variable_partagee, (*s_etat_processus)
! 950: .s_liste_variables[(*s_etat_processus)
! 951: .position_variable_courante].origine) == d_faux)
! 952: {
! 953: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 954: .s_liste_variables_partagees).mutex)) != 0)
! 955: {
! 956: (*s_etat_processus).erreur_systeme = d_es_processus;
! 957: return;
! 958: }
! 959:
! 960: liberation(s_etat_processus, s_objet);
! 961:
! 962: (*s_etat_processus).erreur_systeme = d_es;
! 963: (*s_etat_processus).erreur_execution =
! 964: d_ex_argument_invalide;
! 965: return;
! 966: }
! 967:
! 968: if (((*(*(*s_etat_processus).s_liste_variables_partagees)
! 969: .table[(*(*s_etat_processus)
! 970: .s_liste_variables_partagees).position_variable].objet)
! 971: .type != RPN) && ((*(*(*s_etat_processus)
! 972: .s_liste_variables_partagees).table
! 973: [(*(*s_etat_processus).s_liste_variables_partagees)
! 974: .position_variable].objet).type != ADR))
! 975: {
! 976: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 977: .s_liste_variables_partagees).mutex)) != 0)
! 978: {
! 979: (*s_etat_processus).erreur_systeme = d_es_processus;
! 980: return;
! 981: }
! 982:
! 983: liberation(s_etat_processus, s_objet);
! 984:
! 985: (*s_etat_processus).erreur_execution =
! 986: d_ex_argument_invalide;
! 987: return;
! 988: }
! 989:
! 990: if ((s_copie = copie_objet(s_etat_processus,
! 991: (*(*s_etat_processus).s_liste_variables_partagees).table
! 992: [(*(*s_etat_processus).s_liste_variables_partagees)
! 993: .position_variable].objet, 'P')) == NULL)
! 994: {
! 995: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 996: .s_liste_variables_partagees).mutex)) != 0)
! 997: {
! 998: (*s_etat_processus).erreur_systeme = d_es_processus;
! 999: return;
! 1000: }
! 1001:
! 1002: (*s_etat_processus).erreur_systeme =
! 1003: d_es_allocation_memoire;
! 1004:
! 1005: return;
! 1006: }
! 1007:
! 1008: variable_partagee = d_vrai;
! 1009:
! 1010: if (pthread_mutex_unlock(&((*(*s_etat_processus)
! 1011: .s_liste_variables_partagees).mutex)) != 0)
! 1012: {
! 1013: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1014: return;
! 1015: }
! 1016: }
! 1017: else
! 1018: {
! 1019: if (((*(*s_etat_processus).s_liste_variables
! 1020: [(*s_etat_processus).position_variable_courante].objet)
! 1021: .type != RPN) && ((*(*s_etat_processus)
! 1022: .s_liste_variables[(*s_etat_processus)
! 1023: .position_variable_courante].objet).type != ADR))
! 1024: {
! 1025: liberation(s_etat_processus, s_objet);
! 1026:
! 1027: (*s_etat_processus).erreur_execution =
! 1028: d_ex_argument_invalide;
! 1029: return;
! 1030: }
! 1031: }
! 1032: }
! 1033: else // Variable inexistante
! 1034: {
! 1035: liberation(s_etat_processus, s_objet);
! 1036:
! 1037: (*s_etat_processus).erreur_systeme = d_es;
! 1038: (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
! 1039: return;
! 1040: }
! 1041: }
! 1042:
! 1043: if (sigemptyset(&set) != 0)
! 1044: {
! 1045: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1046: return;
! 1047: }
! 1048:
! 1049: if (sigaddset(&set, SIGSTART) != 0)
! 1050: {
! 1051: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1052: return;
! 1053: }
! 1054:
! 1055: /*
! 1056: * Le signal SIGFSTOP doit être traité !
! 1057: */
! 1058:
! 1059: if (sigaddset(&set, SIGFSTOP) != 0)
! 1060: {
! 1061: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1062: return;
! 1063: }
! 1064:
! 1065: if (sigaddset(&set, SIGURG) != 0)
! 1066: {
! 1067: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1068: return;
! 1069: }
! 1070:
! 1071: if (pthread_sigmask(SIG_BLOCK, &set, &oldset) != 0)
! 1072: {
! 1073: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1074: return;
! 1075: }
! 1076:
! 1077: if ((s_argument_thread = malloc(sizeof(struct_descripteur_thread))) == NULL)
! 1078: {
! 1079: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1080: return;
! 1081: }
! 1082:
! 1083: if (pipe((*s_argument_thread).pipe_erreurs) != 0)
! 1084: {
! 1085: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1086: return;
! 1087: }
! 1088:
! 1089: if (pipe((*s_argument_thread).pipe_interruptions) != 0)
! 1090: {
! 1091: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1092: return;
! 1093: }
! 1094:
! 1095: if (pipe((*s_argument_thread).pipe_nombre_interruptions_attente) != 0)
! 1096: {
! 1097: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1098: return;
! 1099: }
! 1100:
! 1101: if (pipe((*s_argument_thread).pipe_objets) != 0)
! 1102: {
! 1103: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1104: return;
! 1105: }
! 1106:
! 1107: if (pipe((*s_argument_thread).pipe_acquittement) != 0)
! 1108: {
! 1109: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1110: return;
! 1111: }
! 1112:
! 1113: if (pipe((*s_argument_thread).pipe_nombre_objets_attente) != 0)
! 1114: {
! 1115: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1116: return;
! 1117: }
! 1118:
! 1119: if (pipe((*s_argument_thread).pipe_injections) != 0)
! 1120: {
! 1121: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1122: return;
! 1123: }
! 1124:
! 1125: if (pipe((*s_argument_thread).pipe_nombre_injections) != 0)
! 1126: {
! 1127: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1128: return;
! 1129: }
! 1130:
! 1131: ppid = getpid();
! 1132:
! 1133: /*
! 1134: * Le mutex suivant permet de copier un contexte propre.
! 1135: */
! 1136:
! 1137: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 1138: {
! 1139: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1140: return;
! 1141: }
! 1142:
! 1143: fflush(NULL);
! 1144:
! 1145: /*
! 1146: * On bloque tous les threads concurents pour qu'il n'y ait ni allocation
! 1147: * de mémoire, ni libération, ni copie d'objet concurrent au fork().
! 1148: */
! 1149:
! 1150: sigfillset(&set2);
! 1151: pthread_sigmask(SIG_BLOCK, &set2, &oldset2);
! 1152:
! 1153: verrouillage_threads_concurrents(s_etat_processus);
! 1154: (*s_argument_thread).pid = fork();
! 1155: deverrouillage_threads_concurrents(s_etat_processus);
! 1156:
! 1157: pthread_sigmask(SIG_SETMASK, &oldset2, NULL);
! 1158: sigpending(&set2);
! 1159:
! 1160: (*s_argument_thread).thread_pere = pthread_self();
! 1161: (*s_argument_thread).processus_detache = d_vrai;
! 1162:
! 1163: pthread_mutexattr_init(&attributs_mutex);
! 1164: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
! 1165: pthread_mutex_init(&((*s_argument_thread).mutex), &attributs_mutex);
! 1166: pthread_mutexattr_destroy(&attributs_mutex);
! 1167:
! 1168: if ((*s_argument_thread).pid > 0)
! 1169: {
! 1170: /*
! 1171: * Processus père
! 1172: */
! 1173:
! 1174: if (variable_partagee == d_vrai)
! 1175: {
! 1176: liberation(s_etat_processus, s_copie);
! 1177: }
! 1178:
! 1179: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 1180: {
! 1181: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1182: return;
! 1183: }
! 1184:
! 1185: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 1186: {
! 1187: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1188: return;
! 1189: }
! 1190:
! 1191: if (close((*s_argument_thread).pipe_erreurs[1]) != 0)
! 1192: {
! 1193: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1194: return;
! 1195: }
! 1196:
! 1197: if (close((*s_argument_thread).pipe_interruptions[1]) != 0)
! 1198: {
! 1199: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1200: return;
! 1201: }
! 1202:
! 1203: if (close((*s_argument_thread).pipe_nombre_interruptions_attente[1])
! 1204: != 0)
! 1205: {
! 1206: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1207: return;
! 1208: }
! 1209:
! 1210: if (close((*s_argument_thread).pipe_objets[1]) != 0)
! 1211: {
! 1212: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1213: return;
! 1214: }
! 1215:
! 1216: if (close((*s_argument_thread).pipe_nombre_objets_attente[1]) != 0)
! 1217: {
! 1218: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1219: return;
! 1220: }
! 1221:
! 1222: if (close((*s_argument_thread).pipe_injections[0]) != 0)
! 1223: {
! 1224: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1225: return;
! 1226: }
! 1227:
! 1228: if (close((*s_argument_thread).pipe_nombre_injections[0]) != 0)
! 1229: {
! 1230: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1231: return;
! 1232: }
! 1233:
! 1234: if (close((*s_argument_thread).pipe_acquittement[0]) != 0)
! 1235: {
! 1236: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1237: return;
! 1238: }
! 1239:
! 1240: if (pthread_attr_init(&attributs) != 0)
! 1241: {
! 1242: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1243: return;
! 1244: }
! 1245:
! 1246: if (pthread_attr_setdetachstate(&attributs,
! 1247: PTHREAD_CREATE_DETACHED) != 0)
! 1248: {
! 1249: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1250: return;
! 1251: }
! 1252:
! 1253: if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
! 1254: {
! 1255: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1256: return;
! 1257: }
! 1258:
! 1259: if (pthread_attr_setinheritsched(&attributs,
! 1260: PTHREAD_EXPLICIT_SCHED) != 0)
! 1261: {
! 1262: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1263: return;
! 1264: }
! 1265:
! 1266: if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
! 1267: {
! 1268: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1269: return;
! 1270: }
! 1271:
! 1272: (*s_argument_thread).s_etat_processus = s_etat_processus;
! 1273:
! 1274: if (pthread_create(&thread_surveillance, &attributs,
! 1275: surveillance_processus, s_argument_thread) != 0)
! 1276: {
! 1277: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1278: return;
! 1279: }
! 1280:
! 1281: if (pthread_attr_destroy(&attributs) != 0)
! 1282: {
! 1283: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1284: return;
! 1285: }
! 1286: }
! 1287: else if ((*s_argument_thread).pid == 0)
! 1288: {
! 1289: /*
! 1290: * Processus fils
! 1291: */
! 1292:
! 1293: sem_post(&semaphore_gestionnaires_signaux);
! 1294: sem_destroy(&semaphore_gestionnaires_signaux);
! 1295: sem_init(&semaphore_gestionnaires_signaux, 0, 0);
! 1296:
! 1297: sem_post(&semaphore_liste_threads);
! 1298: sem_destroy(&semaphore_liste_threads);
! 1299: sem_init(&semaphore_liste_threads, 0, 1);
! 1300:
! 1301: sem_destroy(&semaphore_gestionnaires_signaux_atomique);
! 1302: sem_init(&semaphore_gestionnaires_signaux_atomique, 0, 1);
! 1303:
! 1304: sem_trywait(&((*s_etat_processus).semaphore_fork));
! 1305:
! 1306: if (pthread_setspecific(semaphore_fork_processus_courant,
! 1307: &((*s_etat_processus).semaphore_fork)) != 0)
! 1308: {
! 1309: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1310: }
! 1311:
! 1312: if (close((*s_argument_thread).pipe_erreurs[0]) != 0)
! 1313: {
! 1314: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1315: }
! 1316: else if (close((*s_argument_thread).pipe_interruptions[0]) != 0)
! 1317: {
! 1318: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1319: }
! 1320: else if (close((*s_argument_thread)
! 1321: .pipe_nombre_interruptions_attente[0]) != 0)
! 1322: {
! 1323: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1324: }
! 1325: else if (close((*s_argument_thread).pipe_objets[0]) != 0)
! 1326: {
! 1327: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1328: }
! 1329: else if (close((*s_argument_thread).pipe_nombre_objets_attente[0]) != 0)
! 1330: {
! 1331: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1332: }
! 1333: else if (close((*s_argument_thread).pipe_injections[1]) != 0)
! 1334: {
! 1335: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1336: }
! 1337: else if (close((*s_argument_thread).pipe_nombre_injections[1]) != 0)
! 1338: {
! 1339: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1340: }
! 1341: else if (close((*s_argument_thread).pipe_acquittement[1]) != 0)
! 1342: {
! 1343: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1344: }
! 1345:
! 1346: l_element_courant = (*s_etat_processus).liste_mutexes;
! 1347: while(l_element_courant != NULL)
! 1348: {
! 1349: pthread_mutex_trylock(&((*((struct_mutex *) (*(*l_element_courant)
! 1350: .donnee).objet)).mutex));
! 1351: pthread_mutex_unlock(&((*((struct_mutex *) (*(*l_element_courant)
! 1352: .donnee).objet)).mutex));
! 1353: pthread_mutex_destroy(&((*((struct_mutex *) (*(*l_element_courant)
! 1354: .donnee).objet)).mutex));
! 1355:
! 1356: liberation(s_etat_processus, (*l_element_courant).donnee);
! 1357: l_element_suivant = (*l_element_courant).suivant;
! 1358: free(l_element_courant);
! 1359: l_element_courant = l_element_suivant;
! 1360: }
! 1361:
! 1362: (*s_etat_processus).liste_mutexes = NULL;
! 1363:
! 1364: liberation_threads(s_etat_processus);
! 1365:
! 1366: (*(*s_etat_processus).s_liste_variables_partagees)
! 1367: .table = NULL;
! 1368: (*(*s_etat_processus).s_liste_variables_partagees)
! 1369: .nombre_variables = 0;
! 1370: (*(*s_etat_processus).s_liste_variables_partagees)
! 1371: .nombre_variables_allouees = 0;
! 1372:
! 1373: insertion_thread(s_etat_processus, d_vrai);
! 1374:
! 1375: // Envoi d'une donnée pour signaler le démarrage du processus au thread
! 1376: // de surveillance.
! 1377:
! 1378: if (write_atomic(s_etat_processus,
! 1379: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 1380: "-", sizeof(unsigned char)) != sizeof(unsigned char))
! 1381: {
! 1382: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 1383: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1384:
! 1385: pid_final = -2;
! 1386:
! 1387: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1388: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
! 1389: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1390: {
! 1391: if (longueur_ecriture == -1)
! 1392: {
! 1393: break;
! 1394: }
! 1395: }
! 1396:
! 1397: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1398: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 1399: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1400: {
! 1401: if (longueur_ecriture == -1)
! 1402: {
! 1403: break;
! 1404: }
! 1405: }
! 1406:
! 1407: exit(EXIT_FAILURE);
! 1408: }
! 1409:
! 1410: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 1411: {
! 1412: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1413:
! 1414: pid_final = -2;
! 1415:
! 1416: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1417: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
! 1418: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1419: {
! 1420: if (longueur_ecriture == -1)
! 1421: {
! 1422: break;
! 1423: }
! 1424: }
! 1425:
! 1426: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1427: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 1428: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1429: {
! 1430: if (longueur_ecriture == -1)
! 1431: {
! 1432: break;
! 1433: }
! 1434: }
! 1435:
! 1436: exit(EXIT_FAILURE);
! 1437: }
! 1438:
! 1439: if (pthread_mutex_unlock(&((*s_etat_processus)
! 1440: .protection_liste_mutexes)) != 0)
! 1441: {
! 1442: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1443:
! 1444: pid_final = -2;
! 1445:
! 1446: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1447: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
! 1448: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1449: {
! 1450: if (longueur_ecriture == -1)
! 1451: {
! 1452: break;
! 1453: }
! 1454: }
! 1455:
! 1456: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1457: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 1458: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1459: {
! 1460: if (longueur_ecriture == -1)
! 1461: {
! 1462: break;
! 1463: }
! 1464: }
! 1465:
! 1466: exit(EXIT_FAILURE);
! 1467: }
! 1468:
! 1469: if ((*s_etat_processus).evaluation_expression_compilee == 'N')
! 1470: {
! 1471: free((*s_etat_processus).instruction_courante);
! 1472: (*s_etat_processus).instruction_courante = NULL;
! 1473: }
! 1474:
! 1475: (*s_etat_processus).var_volatile_processus_pere = 0;
! 1476:
! 1477: // On réinitialise toutes les interruptions.
! 1478:
! 1479: (*s_etat_processus).traitement_interruption = 'N';
! 1480: (*s_etat_processus).traitement_interruptible = 'Y';
! 1481: (*s_etat_processus).nombre_interruptions_en_queue = 0;
! 1482: (*s_etat_processus).nombre_interruptions_non_affectees = 0;
! 1483: (*s_etat_processus).processus_detache = d_vrai;
! 1484:
! 1485: for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
! 1486: {
! 1487: liberation(s_etat_processus,
! 1488: (*s_etat_processus).corps_interruptions[i]);
! 1489:
! 1490: (*s_etat_processus).corps_interruptions[i] = NULL;
! 1491: (*s_etat_processus).masque_interruptions[i] = 'N';
! 1492: (*s_etat_processus).queue_interruptions[i] = 0;
! 1493:
! 1494: l_element_courant = (*s_etat_processus)
! 1495: .pile_origine_interruptions[i];
! 1496:
! 1497: while(l_element_courant != NULL)
! 1498: {
! 1499: l_element_suivant = (*l_element_courant).suivant;
! 1500: liberation(s_etat_processus, (*l_element_courant).donnee);
! 1501: free(l_element_courant);
! 1502: l_element_courant = l_element_suivant;
! 1503: }
! 1504:
! 1505: (*s_etat_processus).pile_origine_interruptions[i] = NULL;
! 1506: }
! 1507:
! 1508: if ((*s_etat_processus).debug == d_vrai)
! 1509: if (((*s_etat_processus).type_debug &
! 1510: d_debug_processus) != 0)
! 1511: {
! 1512: if ((*s_etat_processus).langue == 'F')
! 1513: {
! 1514: printf("[%d] Lancement du processus fils %d de %d\n",
! 1515: (int) getpid(), (int) getpid(), (int) ppid);
! 1516: }
! 1517: else
! 1518: {
! 1519: printf("[%d] Start child process %d from %d\n", (int) getpid(),
! 1520: (int) getpid(), (int) ppid);
! 1521: }
! 1522:
! 1523: fflush(stdout);
! 1524: }
! 1525:
! 1526: /*
! 1527: * On bloque l'exécution du processus fils jusqu'à ce que
! 1528: * le père ait renseigné correctement la pile des processus.
! 1529: * Dans le cas contraire, on pourrait essayer de traiter
! 1530: * un RECV sur un système chargé avant que cette pile soit
! 1531: * renseignée.
! 1532: */
! 1533:
! 1534: if (sigpending(&set) != 0)
! 1535: {
! 1536: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1537: }
! 1538: else if (sigismember(&set, SIGSTART) == 0)
! 1539: {
! 1540: while(sigismember(&set, SIGSTART) == 0)
! 1541: {
! 1542: if (sigpending(&set) != 0)
! 1543: {
! 1544: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1545: }
! 1546:
! 1547: nanosleep(&attente, NULL);
! 1548: }
! 1549: }
! 1550:
! 1551: (*s_etat_processus).niveau_initial = (*s_etat_processus).niveau_courant;
! 1552: (*s_etat_processus).presence_pipes = d_vrai;
! 1553: (*s_etat_processus).debug_programme = d_faux;
! 1554: (*s_etat_processus).pipe_donnees = (*s_argument_thread).pipe_objets[1];
! 1555: (*s_etat_processus).pipe_nombre_objets_attente = (*s_argument_thread)
! 1556: .pipe_nombre_objets_attente[1];
! 1557: (*s_etat_processus).pipe_interruptions = (*s_argument_thread)
! 1558: .pipe_interruptions[1];
! 1559: (*s_etat_processus).pipe_nombre_interruptions_attente =
! 1560: (*s_argument_thread).pipe_nombre_interruptions_attente[1];
! 1561: (*s_etat_processus).pipe_injections =
! 1562: (*s_argument_thread).pipe_injections[0];
! 1563: (*s_etat_processus).pipe_nombre_injections =
! 1564: (*s_argument_thread).pipe_nombre_injections[0];
! 1565: (*s_etat_processus).pipe_acquittement =
! 1566: (*s_argument_thread).pipe_acquittement[0];
! 1567: (*s_etat_processus).nombre_objets_injectes = 0;
! 1568: (*s_etat_processus).nombre_objets_envoyes_non_lus = 0;
! 1569: (*s_etat_processus).temps_maximal_cpu = 0;
! 1570: (*s_etat_processus).presence_fusible = d_faux;
! 1571: (*s_etat_processus).thread_fusible = 0;
! 1572: (*s_etat_processus).pid_erreur_processus_fils = getpid();
! 1573:
! 1574: if ((*s_etat_processus).profilage == d_vrai)
! 1575: {
! 1576: liberation_profil(s_etat_processus);
! 1577: }
! 1578:
! 1579: (*s_etat_processus).pile_profilage = NULL;
! 1580:
! 1581: if ((*s_etat_processus).generateur_aleatoire != NULL)
! 1582: {
! 1583: liberation_generateur_aleatoire(s_etat_processus);
! 1584: }
! 1585:
! 1586: (*s_etat_processus).generateur_aleatoire = NULL;
! 1587:
! 1588: if ((*s_etat_processus).instruction_derniere_erreur != NULL)
! 1589: {
! 1590: free((*s_etat_processus).instruction_derniere_erreur);
! 1591: (*s_etat_processus).instruction_derniere_erreur = NULL;
! 1592: }
! 1593:
! 1594: /*
! 1595: * Initialisation de la pile des processus
! 1596: */
! 1597:
! 1598: (*s_etat_processus).l_base_pile_processus = NULL;
! 1599: // Les données associées sont déjà effacées par liberation_thread().
! 1600:
! 1601: /*
! 1602: * Initialisation de la pile système
! 1603: */
! 1604:
! 1605: l_element_courant = (struct_liste_chainee *)
! 1606: (*s_etat_processus).l_base_pile_systeme;
! 1607: while(l_element_courant != NULL)
! 1608: {
! 1609: l_element_suivant = (struct_liste_chainee *)
! 1610: (*((struct_liste_pile_systeme *)
! 1611: l_element_courant)).suivant;
! 1612:
! 1613: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
! 1614: l_element_courant)).indice_boucle);
! 1615: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
! 1616: l_element_courant)).limite_indice_boucle);
! 1617: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
! 1618: l_element_courant)).objet_de_test);
! 1619:
! 1620: if ((*((struct_liste_pile_systeme *) l_element_courant))
! 1621: .nom_variable != NULL)
! 1622: {
! 1623: free((*((struct_liste_pile_systeme *)
! 1624: l_element_courant)).nom_variable);
! 1625: }
! 1626:
! 1627: free((struct_liste_pile_systeme *) l_element_courant);
! 1628:
! 1629: l_element_courant = l_element_suivant;
! 1630: }
! 1631:
! 1632: (*s_etat_processus).l_base_pile_systeme = NULL;
! 1633: (*s_etat_processus).hauteur_pile_systeme = 0;
! 1634:
! 1635: empilement_pile_systeme(s_etat_processus);
! 1636:
! 1637: if ((*s_etat_processus).erreur_systeme != d_es)
! 1638: {
! 1639: pid_final = -2;
! 1640:
! 1641: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1642: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
! 1643: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1644: {
! 1645: if (longueur_ecriture == -1)
! 1646: {
! 1647: break;
! 1648: }
! 1649: }
! 1650:
! 1651: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1652: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 1653: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1654: {
! 1655: if (longueur_ecriture == -1)
! 1656: {
! 1657: break;
! 1658: }
! 1659: }
! 1660:
! 1661: exit(EXIT_FAILURE);
! 1662: }
! 1663:
! 1664: (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
! 1665:
! 1666: l_element_courant = (struct_liste_chainee *)
! 1667: (*s_etat_processus).s_marques;
! 1668:
! 1669: while(l_element_courant != NULL)
! 1670: {
! 1671: free((*((struct_marque *) l_element_courant)).label);
! 1672: free((*((struct_marque *) l_element_courant)).position);
! 1673: l_element_suivant = (struct_liste_chainee *)
! 1674: (*((struct_marque *) l_element_courant)).suivant;
! 1675: free((struct_marque *) l_element_courant);
! 1676: l_element_courant = l_element_suivant;
! 1677: }
! 1678:
! 1679: (*s_etat_processus).s_marques = NULL;
! 1680:
! 1681: /*
! 1682: * On empile deux valeurs retour_definition pour pouvoir récupérer
! 1683: * les variables dans le cas d'un programme compilé.
! 1684: */
! 1685:
! 1686: empilement_pile_systeme(s_etat_processus);
! 1687:
! 1688: if ((*s_etat_processus).erreur_systeme != d_es)
! 1689: {
! 1690: pid_final = -2;
! 1691:
! 1692: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1693: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
! 1694: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1695: {
! 1696: if (longueur_ecriture == -1)
! 1697: {
! 1698: break;
! 1699: }
! 1700: }
! 1701:
! 1702: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1703: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 1704: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1705: {
! 1706: if (longueur_ecriture == -1)
! 1707: {
! 1708: break;
! 1709: }
! 1710: }
! 1711:
! 1712: exit(EXIT_FAILURE);
! 1713: }
! 1714:
! 1715: (*(*s_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
! 1716:
! 1717: /*
! 1718: * Destruction des sorties graphiques et PostScript
! 1719: */
! 1720:
! 1721: while((*s_etat_processus).fichiers_graphiques != NULL)
! 1722: {
! 1723: free((*(*s_etat_processus).fichiers_graphiques).nom);
! 1724:
! 1725: if ((*(*s_etat_processus).fichiers_graphiques).legende != NULL)
! 1726: {
! 1727: free((*(*s_etat_processus).fichiers_graphiques).legende);
! 1728: }
! 1729:
! 1730: l_element_precedent = (void *) (*s_etat_processus)
! 1731: .fichiers_graphiques;
! 1732: (*s_etat_processus).fichiers_graphiques =
! 1733: (*(*s_etat_processus).fichiers_graphiques).suivant;
! 1734: free(l_element_precedent);
! 1735: }
! 1736:
! 1737: if ((*s_etat_processus).entree_standard != NULL)
! 1738: {
! 1739: pclose((*s_etat_processus).entree_standard);
! 1740: (*s_etat_processus).entree_standard = NULL;
! 1741: }
! 1742:
! 1743: (*s_etat_processus).requete_nouveau_plan = d_vrai;
! 1744: (*s_etat_processus).mise_a_jour_trace_requise = d_faux;
! 1745:
! 1746: if ((*s_etat_processus).nom_fichier_impression != NULL)
! 1747: {
! 1748: free((*s_etat_processus).nom_fichier_impression);
! 1749: (*s_etat_processus).nom_fichier_impression = NULL;
! 1750: }
! 1751:
! 1752: /*
! 1753: * Destruction des piles de fichiers
! 1754: */
! 1755:
! 1756: l_element_courant = (*s_etat_processus).s_fichiers;
! 1757:
! 1758: while(l_element_courant != NULL)
! 1759: {
! 1760: l_element_suivant = (*l_element_courant).suivant;
! 1761:
! 1762: fclose((*((struct_descripteur_fichier *)
! 1763: (*l_element_courant).donnee)).descripteur);
! 1764:
! 1765: free((*((struct_descripteur_fichier *) (*l_element_courant)
! 1766: .donnee)).nom);
! 1767: free((struct_descripteur_fichier *) (*l_element_courant).donnee);
! 1768: free(l_element_courant);
! 1769:
! 1770: l_element_courant = l_element_suivant;
! 1771: }
! 1772:
! 1773: /*
! 1774: * Destruction des piles de connecteurs SQL
! 1775: */
! 1776:
! 1777: l_element_courant = (*s_etat_processus).s_connecteurs_sql;
! 1778:
! 1779: while(l_element_courant != NULL)
! 1780: {
! 1781: l_element_suivant = (*l_element_courant).suivant;
! 1782:
! 1783: sqlclose((*l_element_courant).donnee);
! 1784: liberation(s_etat_processus, (*l_element_courant).donnee);
! 1785: l_element_courant = l_element_suivant;
! 1786: }
! 1787:
! 1788: /*
! 1789: * On ne détruit pas les sockets car il faut utiliser DETACH
! 1790: * pour traiter plusieurs connexions simultanées sur les sockets
! 1791: */
! 1792:
! 1793: (*s_etat_processus).s_fichiers = NULL;
! 1794:
! 1795: if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) != 0)
! 1796: {
! 1797: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1798: }
! 1799:
! 1800: sigpending(&set);
! 1801:
! 1802: if ((*s_etat_processus).erreur_systeme == d_es)
! 1803: {
! 1804: if (variable_partagee == d_faux)
! 1805: {
! 1806: if (evaluation(s_etat_processus, s_objet, 'E') == d_erreur)
! 1807: {
! 1808: if (((*s_etat_processus).erreur_execution == d_ex) &&
! 1809: ((*s_etat_processus).erreur_systeme == d_es))
! 1810: {
! 1811: (*s_etat_processus).erreur_execution =
! 1812: d_ex_erreur_evaluation;
! 1813: }
! 1814: }
! 1815: }
! 1816: else
! 1817: {
! 1818: if (evaluation(s_etat_processus, s_copie, 'E') == d_erreur)
! 1819: {
! 1820: if (((*s_etat_processus).erreur_execution == d_ex) &&
! 1821: ((*s_etat_processus).erreur_systeme == d_es))
! 1822: {
! 1823: (*s_etat_processus).erreur_execution =
! 1824: d_ex_erreur_evaluation;
! 1825: }
! 1826: }
! 1827:
! 1828: liberation(s_etat_processus, s_copie);
! 1829: }
! 1830: }
! 1831:
! 1832: l_element_courant = (*s_etat_processus).liste_mutexes;
! 1833: while(l_element_courant != NULL)
! 1834: {
! 1835: pthread_mutex_trylock(&((*((struct_mutex *)
! 1836: (*(*l_element_courant).donnee).objet)).mutex));
! 1837: pthread_mutex_unlock(&((*((struct_mutex *)
! 1838: (*(*l_element_courant).donnee).objet)).mutex));
! 1839: pthread_mutex_destroy(&((*((struct_mutex *)
! 1840: (*(*l_element_courant).donnee).objet)).mutex));
! 1841:
! 1842: liberation(s_etat_processus, (*l_element_courant).donnee);
! 1843: l_element_suivant = (*l_element_courant).suivant;
! 1844: free(l_element_courant);
! 1845: l_element_courant = l_element_suivant;
! 1846: }
! 1847:
! 1848: if ((*s_etat_processus).presence_fusible == d_vrai)
! 1849: {
! 1850: pthread_cancel((*s_etat_processus).thread_fusible);
! 1851: }
! 1852:
! 1853: pid_final = -2;
! 1854:
! 1855: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1856: (*s_argument_thread).pipe_nombre_interruptions_attente[1],
! 1857: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1858: {
! 1859: if (longueur_ecriture == -1)
! 1860: {
! 1861: break;
! 1862: }
! 1863: }
! 1864:
! 1865: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1866: (*s_argument_thread).pipe_nombre_objets_attente[1],
! 1867: &pid_final, sizeof(pid_final))) != sizeof(pid_final))
! 1868: {
! 1869: if (longueur_ecriture == -1)
! 1870: {
! 1871: break;
! 1872: }
! 1873: }
! 1874:
! 1875: if ((*s_etat_processus).var_volatile_processus_pere != 0)
! 1876: {
! 1877: // Racine des processus atteinte
! 1878:
! 1879: erreur = d_ex;
! 1880:
! 1881: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1882: (*s_argument_thread).pipe_erreurs[1], &erreur,
! 1883: sizeof((*s_etat_processus).erreur_execution))) !=
! 1884: sizeof((*s_etat_processus).erreur_execution))
! 1885: {
! 1886: if (longueur_ecriture == -1)
! 1887: {
! 1888: break;
! 1889: }
! 1890: }
! 1891: }
! 1892: else
! 1893: {
! 1894: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1895: (*s_argument_thread).pipe_erreurs[1],
! 1896: &((*s_etat_processus).erreur_execution),
! 1897: sizeof((*s_etat_processus).erreur_execution))) !=
! 1898: sizeof((*s_etat_processus).erreur_execution))
! 1899: {
! 1900: if (longueur_ecriture == -1)
! 1901: {
! 1902: break;
! 1903: }
! 1904: }
! 1905: }
! 1906:
! 1907: if ((*s_etat_processus).var_volatile_processus_pere != 0)
! 1908: {
! 1909: // Racine des processus atteinte
! 1910:
! 1911: erreur = d_es;
! 1912:
! 1913: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1914: (*s_argument_thread).pipe_erreurs[1], &erreur,
! 1915: sizeof((*s_etat_processus).erreur_systeme))) !=
! 1916: sizeof((*s_etat_processus).erreur_systeme))
! 1917: {
! 1918: if (longueur_ecriture == -1)
! 1919: {
! 1920: break;
! 1921: }
! 1922: }
! 1923: }
! 1924: else
! 1925: {
! 1926: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1927: (*s_argument_thread).pipe_erreurs[1],
! 1928: &((*s_etat_processus).erreur_systeme),
! 1929: sizeof((*s_etat_processus).erreur_systeme))) !=
! 1930: sizeof((*s_etat_processus).erreur_systeme))
! 1931: {
! 1932: if (longueur_ecriture == -1)
! 1933: {
! 1934: break;
! 1935: }
! 1936: }
! 1937: }
! 1938:
! 1939: if ((*s_etat_processus).pid_erreur_processus_fils == 0)
! 1940: {
! 1941: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1942: (*s_argument_thread).pipe_erreurs[1],
! 1943: &ppid, sizeof(ppid))) != sizeof(ppid))
! 1944: {
! 1945: if (longueur_ecriture == -1)
! 1946: {
! 1947: break;
! 1948: }
! 1949: }
! 1950: }
! 1951: else
! 1952: {
! 1953: while((longueur_ecriture = write_atomic(s_etat_processus,
! 1954: (*s_argument_thread).pipe_erreurs[1],
! 1955: &((*s_etat_processus).pid_erreur_processus_fils),
! 1956: sizeof((*s_etat_processus).pid_erreur_processus_fils))) !=
! 1957: sizeof((*s_etat_processus).pid_erreur_processus_fils))
! 1958: {
! 1959: if (longueur_ecriture == -1)
! 1960: {
! 1961: break;
! 1962: }
! 1963: }
! 1964: }
! 1965:
! 1966: close((*s_argument_thread).pipe_erreurs[1]);
! 1967: close((*s_argument_thread).pipe_interruptions[1]);
! 1968: close((*s_argument_thread).pipe_nombre_interruptions_attente[1]);
! 1969: close((*s_argument_thread).pipe_objets[1]);
! 1970: close((*s_argument_thread).pipe_nombre_objets_attente[1]);
! 1971: close((*s_argument_thread).pipe_injections[0]);
! 1972: close((*s_argument_thread).pipe_nombre_injections[0]);
! 1973: close((*s_argument_thread).pipe_acquittement[0]);
! 1974:
! 1975: l_element_courant = (*s_etat_processus).s_fichiers;
! 1976:
! 1977: while(l_element_courant != NULL)
! 1978: {
! 1979: l_element_suivant = (*l_element_courant).suivant;
! 1980:
! 1981: fclose((*((struct_descripteur_fichier *)
! 1982: (*l_element_courant).donnee)).descripteur);
! 1983:
! 1984: if (((*((struct_descripteur_fichier *) (*l_element_courant)
! 1985: .donnee)).pid == getpid()) &&
! 1986: (pthread_equal((*((struct_descripteur_fichier *)
! 1987: (*l_element_courant).donnee)).tid, pthread_self()) != 0))
! 1988: {
! 1989: if ((*((struct_descripteur_fichier *) (*l_element_courant)
! 1990: .donnee)).effacement == 'Y')
! 1991: {
! 1992: unlink((*((struct_descripteur_fichier *)
! 1993: (*l_element_courant).donnee)).nom);
! 1994: }
! 1995: }
! 1996:
! 1997: free((*((struct_descripteur_fichier *) (*l_element_courant)
! 1998: .donnee)).nom);
! 1999: free((struct_descripteur_fichier *) (*l_element_courant).donnee);
! 2000: free(l_element_courant);
! 2001:
! 2002: l_element_courant = l_element_suivant;
! 2003: }
! 2004:
! 2005: pthread_mutex_lock(&((*s_etat_processus).mutex));
! 2006:
! 2007: l_element_courant = (struct_liste_chainee *)
! 2008: (*s_etat_processus).l_base_pile_processus;
! 2009:
! 2010: while(l_element_courant != NULL)
! 2011: {
! 2012: if ((*(*((struct_processus_fils *) (*(*((struct_liste_chainee *)
! 2013: l_element_courant)).donnee).objet)).thread)
! 2014: .processus_detache == d_vrai)
! 2015: {
! 2016: if ((*s_etat_processus).debug == d_vrai)
! 2017: {
! 2018: if (((*s_etat_processus).type_debug & d_debug_processus)
! 2019: != 0)
! 2020: {
! 2021: if ((*s_etat_processus).langue == 'F')
! 2022: {
! 2023: printf("[%d] Signalement pour arrêt du "
! 2024: "processus %d\n",
! 2025: (int) getpid(),
! 2026: (int) (*(*((struct_processus_fils *)
! 2027: (*(*((struct_liste_chainee *)
! 2028: l_element_courant)).donnee).objet))
! 2029: .thread).pid);
! 2030: }
! 2031: else
! 2032: {
! 2033: printf("[%d] Send stop signal to process %d\n",
! 2034: (int) getpid(),
! 2035: (int) (*(*((struct_processus_fils *)
! 2036: (*(*((struct_liste_chainee *)
! 2037: l_element_courant)).donnee).objet))
! 2038: .thread).pid);
! 2039: }
! 2040: }
! 2041: }
! 2042:
! 2043: if ((*s_etat_processus).var_volatile_alarme != 0)
! 2044: {
! 2045: kill((*(*((struct_processus_fils *)
! 2046: (*(*l_element_courant).donnee).objet)).thread).pid,
! 2047: SIGURG);
! 2048: }
! 2049: else
! 2050: {
! 2051: kill((*(*((struct_processus_fils *)
! 2052: (*(*l_element_courant).donnee).objet)).thread).pid,
! 2053: SIGFSTOP);
! 2054: }
! 2055: }
! 2056: else
! 2057: {
! 2058: if ((*s_etat_processus).debug == d_vrai)
! 2059: {
! 2060: if (((*s_etat_processus).type_debug & d_debug_processus)
! 2061: != 0)
! 2062: {
! 2063: if ((*s_etat_processus).langue == 'F')
! 2064: {
! 2065: printf("[%d] Signalement pour arrêt du "
! 2066: "thread %llu\n",
! 2067: (int) getpid(), (unsigned long long)
! 2068: (*(*((struct_processus_fils *)
! 2069: (*(*((struct_liste_chainee *)
! 2070: l_element_courant)).donnee).objet)).thread)
! 2071: .tid);
! 2072: }
! 2073: else
! 2074: {
! 2075: printf("[%d] Send stop signal to thread %llu\n",
! 2076: (int) getpid(), (unsigned long long)
! 2077: (*(*((struct_processus_fils *)
! 2078: (*(*((struct_liste_chainee *)
! 2079: l_element_courant)).donnee).objet)).thread)
! 2080: .tid);
! 2081: }
! 2082: }
! 2083: }
! 2084:
! 2085: pthread_mutex_lock(&((*(*((struct_processus_fils *)
! 2086: (*(*l_element_courant).donnee).objet)).thread).mutex));
! 2087:
! 2088: if ((*(*((struct_processus_fils *)
! 2089: (*(*l_element_courant).donnee).objet)).thread)
! 2090: .thread_actif == d_vrai)
! 2091: {
! 2092: if ((*s_etat_processus).var_volatile_alarme != 0)
! 2093: {
! 2094: pthread_kill((*(*((struct_processus_fils *)
! 2095: (*(*l_element_courant).donnee).objet)).thread)
! 2096: .tid, SIGURG);
! 2097: }
! 2098: else
! 2099: {
! 2100: pthread_kill((*(*((struct_processus_fils *)
! 2101: (*(*l_element_courant).donnee).objet)).thread)
! 2102: .tid, SIGFSTOP);
! 2103: }
! 2104: }
! 2105:
! 2106: pthread_mutex_unlock(&((*(*((struct_processus_fils *)
! 2107: (*(*l_element_courant).donnee).objet)).thread).mutex));
! 2108: }
! 2109:
! 2110: l_element_courant = (*l_element_courant).suivant;
! 2111: }
! 2112:
! 2113: /*
! 2114: * Attente de la fin de tous les processus fils
! 2115: */
! 2116:
! 2117: for(i = 0; i < d_NOMBRE_INTERRUPTIONS;
! 2118: (*s_etat_processus).masque_interruptions[i++] = 'I');
! 2119:
! 2120: attente.tv_sec = 0;
! 2121: attente.tv_nsec = GRANULARITE_us * 1000;
! 2122:
! 2123: while((*s_etat_processus).l_base_pile_processus != NULL)
! 2124: {
! 2125: status = 0;
! 2126:
! 2127: l_element_courant = (struct_liste_chainee *)
! 2128: (*s_etat_processus).l_base_pile_processus;
! 2129:
! 2130: if ((*s_etat_processus).nombre_interruptions_non_affectees != 0)
! 2131: {
! 2132: affectation_interruptions_logicielles(s_etat_processus);
! 2133: }
! 2134:
! 2135: registre_stop = (*s_etat_processus)
! 2136: .var_volatile_traitement_retarde_stop;
! 2137: (*s_etat_processus).var_volatile_traitement_retarde_stop = 1;
! 2138:
! 2139: for(i = 0; i < (unsigned long) (*(*((struct_processus_fils *)
! 2140: (*(*l_element_courant)
! 2141: .donnee).objet)).thread).nombre_objets_dans_pipe; i++)
! 2142: {
! 2143: if ((s_objet_temporaire = lecture_pipe(s_etat_processus,
! 2144: (*(*((struct_processus_fils *) (*(*l_element_courant)
! 2145: .donnee).objet)).thread).pipe_objets[0])) != NULL)
! 2146: {
! 2147: liberation(s_etat_processus, s_objet_temporaire);
! 2148:
! 2149: (*(*((struct_processus_fils *) (*(*l_element_courant)
! 2150: .donnee).objet)).thread).nombre_objets_dans_pipe--;
! 2151:
! 2152: action.sa_handler = SIG_IGN;
! 2153: action.sa_flags = SA_ONSTACK;
! 2154:
! 2155: if (sigaction(SIGPIPE, &action, ®istre) != 0)
! 2156: {
! 2157: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 2158:
! 2159: if (registre_stop == 0)
! 2160: {
! 2161: if ((*s_etat_processus)
! 2162: .var_volatile_traitement_retarde_stop
! 2163: == -1)
! 2164: {
! 2165: (*s_etat_processus)
! 2166: .var_volatile_requete_arret = -1;
! 2167: }
! 2168:
! 2169: (*s_etat_processus)
! 2170: .var_volatile_traitement_retarde_stop =
! 2171: registre_stop;
! 2172: }
! 2173:
! 2174: (*s_etat_processus).erreur_systeme = d_es_signal;
! 2175: exit(EXIT_FAILURE);
! 2176: }
! 2177:
! 2178: while((longueur_ecriture = write_atomic(
! 2179: s_etat_processus, (*(*((struct_processus_fils *)
! 2180: (*(*l_element_courant).donnee).objet))
! 2181: .thread).pipe_nombre_injections[1], "+",
! 2182: sizeof(unsigned char))) !=
! 2183: sizeof(unsigned char))
! 2184: {
! 2185: if (longueur_ecriture == -1)
! 2186: {
! 2187: // Le processus n'existe plus.
! 2188: break;
! 2189: }
! 2190: }
! 2191:
! 2192: if (registre_stop == 0)
! 2193: {
! 2194: if ((*s_etat_processus)
! 2195: .var_volatile_traitement_retarde_stop == -1)
! 2196: {
! 2197: (*s_etat_processus).var_volatile_requete_arret
! 2198: = -1;
! 2199: }
! 2200:
! 2201: (*s_etat_processus)
! 2202: .var_volatile_traitement_retarde_stop =
! 2203: registre_stop;
! 2204: }
! 2205:
! 2206: if (sigaction(SIGPIPE, ®istre, NULL) != 0)
! 2207: {
! 2208: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 2209:
! 2210: (*s_etat_processus).erreur_systeme = d_es_signal;
! 2211: exit(EXIT_FAILURE);
! 2212: }
! 2213: }
! 2214: }
! 2215:
! 2216: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 2217: nanosleep(&attente, NULL);
! 2218: pthread_mutex_lock(&((*s_etat_processus).mutex));
! 2219: }
! 2220:
! 2221: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 2222:
! 2223: l_element_courant = (*s_etat_processus).s_sockets;
! 2224:
! 2225: while(l_element_courant != NULL)
! 2226: {
! 2227: l_element_suivant = (*l_element_courant).suivant;
! 2228:
! 2229: if ((*((struct_socket *) (*(*l_element_courant).donnee)
! 2230: .objet)).socket_connectee == d_vrai)
! 2231: {
! 2232: shutdown((*((struct_socket *) (*(*l_element_courant).donnee)
! 2233: .objet)).socket, SHUT_RDWR);
! 2234: }
! 2235:
! 2236: close((*((struct_socket *) (*(*l_element_courant).donnee)
! 2237: .objet)).socket);
! 2238:
! 2239: if (((*((struct_socket *) (*(*l_element_courant).donnee).objet))
! 2240: .pid == getpid()) && (pthread_equal((*((struct_socket *)
! 2241: (*(*l_element_courant).donnee).objet)).tid, pthread_self())
! 2242: != 0))
! 2243: {
! 2244: if ((*((struct_socket *) (*(*l_element_courant).donnee).objet))
! 2245: .effacement == 'Y')
! 2246: {
! 2247: unlink((*((struct_socket *) (*(*l_element_courant).donnee)
! 2248: .objet)).adresse);
! 2249: }
! 2250: }
! 2251:
! 2252: liberation(s_etat_processus,
! 2253: (*((struct_liste_chainee *) l_element_courant)).donnee);
! 2254: free(l_element_courant);
! 2255:
! 2256: l_element_courant = l_element_suivant;
! 2257: }
! 2258:
! 2259: l_element_courant = (*s_etat_processus).s_connecteurs_sql;
! 2260:
! 2261: while(l_element_courant != NULL)
! 2262: {
! 2263: l_element_suivant = (*l_element_courant).suivant;
! 2264:
! 2265: sqlclose((*l_element_courant).donnee);
! 2266:
! 2267: liberation(s_etat_processus,
! 2268: (*((struct_liste_chainee *) l_element_courant)).donnee);
! 2269: free(l_element_courant);
! 2270:
! 2271: l_element_courant = l_element_suivant;
! 2272: }
! 2273:
! 2274: if ((((*s_etat_processus).erreur_execution != d_ex) ||
! 2275: ((*s_etat_processus).exception != d_ep) ||
! 2276: ((*s_etat_processus).erreur_systeme != d_es)) &&
! 2277: ((*s_etat_processus).var_volatile_traitement_sigint == 0))
! 2278: {
! 2279: printf("%s [%d]\n", message =
! 2280: messages(s_etat_processus), (int) getpid());
! 2281: free(message);
! 2282:
! 2283: if ((*s_etat_processus).core == d_vrai)
! 2284: {
! 2285: printf("\n");
! 2286:
! 2287: if ((*s_etat_processus).langue == 'F')
! 2288: {
! 2289: printf("+++Information : Génération du fichier rpl-core "
! 2290: "[%d]\n", (int) getpid());
! 2291: }
! 2292: else
! 2293: {
! 2294: printf("+++Information : Writing rpl-core file [%d]\n",
! 2295: (int) getpid());
! 2296: }
! 2297:
! 2298: rplcore(s_etat_processus);
! 2299:
! 2300: if ((*s_etat_processus).langue == 'F')
! 2301: {
! 2302: printf("+++Information : Processus tracé [%d]\n",
! 2303: (int) getpid());
! 2304: }
! 2305: else
! 2306: {
! 2307: printf("+++Information : Done [%d]\n", (int) getpid());
! 2308: }
! 2309:
! 2310: printf("\n");
! 2311: fflush(stdout);
! 2312: }
! 2313: }
! 2314:
! 2315: liberation_arbre_instructions(s_etat_processus,
! 2316: (*s_etat_processus).arbre_instructions);
! 2317: free((*s_etat_processus).pointeurs_caracteres);
! 2318:
! 2319: if ((*s_etat_processus).entree_standard != NULL)
! 2320: {
! 2321: pclose((*s_etat_processus).entree_standard);
! 2322: (*s_etat_processus).entree_standard = NULL;
! 2323: }
! 2324:
! 2325: liberation(s_etat_processus, (*s_etat_processus).indep);
! 2326: liberation(s_etat_processus, (*s_etat_processus).depend);
! 2327:
! 2328: free((*s_etat_processus).label_x);
! 2329: free((*s_etat_processus).label_y);
! 2330: free((*s_etat_processus).label_z);
! 2331: free((*s_etat_processus).titre);
! 2332: free((*s_etat_processus).legende);
! 2333:
! 2334: liberation(s_etat_processus,
! 2335: (*s_etat_processus).parametres_courbes_de_niveau);
! 2336:
! 2337: if ((*s_etat_processus).instruction_derniere_erreur != NULL)
! 2338: {
! 2339: free((*s_etat_processus).instruction_derniere_erreur);
! 2340: (*s_etat_processus).instruction_derniere_erreur = NULL;
! 2341: }
! 2342:
! 2343: for(i = 0; i < (*s_etat_processus).nombre_variables; i++)
! 2344: {
! 2345: liberation(s_etat_processus,
! 2346: (*s_etat_processus).s_liste_variables[i].objet);
! 2347: free((*s_etat_processus).s_liste_variables[i].nom);
! 2348: }
! 2349:
! 2350: free((*s_etat_processus).s_liste_variables);
! 2351:
! 2352: for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++)
! 2353: {
! 2354: liberation(s_etat_processus,
! 2355: (*s_etat_processus).s_liste_variables_statiques[i].objet);
! 2356: free((*s_etat_processus).s_liste_variables_statiques[i].nom);
! 2357: }
! 2358:
! 2359: free((*s_etat_processus).s_liste_variables_statiques);
! 2360:
! 2361: for(i = 0; i < (*(*s_etat_processus).s_liste_variables_partagees)
! 2362: .nombre_variables; i++)
! 2363: {
! 2364: liberation(s_etat_processus,
! 2365: (*(*s_etat_processus).s_liste_variables_partagees)
! 2366: .table[i].objet);
! 2367: free((*(*s_etat_processus).s_liste_variables_partagees)
! 2368: .table[i].nom);
! 2369: }
! 2370:
! 2371: if ((*(*s_etat_processus).s_liste_variables_partagees).table
! 2372: != NULL)
! 2373: {
! 2374: free((struct_variable_partagee *)
! 2375: (*(*s_etat_processus).s_liste_variables_partagees).table);
! 2376: }
! 2377:
! 2378: pthread_mutex_destroy(&((*(*s_etat_processus)
! 2379: .s_liste_variables_partagees).mutex));
! 2380:
! 2381: l_element_courant = (*s_etat_processus).l_base_pile;
! 2382: while(l_element_courant != NULL)
! 2383: {
! 2384: l_element_suivant = (*l_element_courant).suivant;
! 2385:
! 2386: liberation(s_etat_processus, (*l_element_courant).donnee);
! 2387: free(l_element_courant);
! 2388:
! 2389: l_element_courant = l_element_suivant;
! 2390: }
! 2391:
! 2392: l_element_courant = (*s_etat_processus).l_base_pile_last;
! 2393: while(l_element_courant != NULL)
! 2394: {
! 2395: l_element_suivant = (*l_element_courant).suivant;
! 2396:
! 2397: liberation(s_etat_processus, (*l_element_courant).donnee);
! 2398: free(l_element_courant);
! 2399:
! 2400: l_element_courant = l_element_suivant;
! 2401: }
! 2402:
! 2403: l_element_courant = (*s_etat_processus).l_base_pile_contextes;
! 2404: while(l_element_courant != NULL)
! 2405: {
! 2406: l_element_suivant = (*l_element_courant).suivant;
! 2407:
! 2408: liberation(s_etat_processus, (*l_element_courant).donnee);
! 2409: free(l_element_courant);
! 2410:
! 2411: l_element_courant = l_element_suivant;
! 2412: }
! 2413:
! 2414: l_element_courant = (*s_etat_processus).l_base_pile_taille_contextes;
! 2415: while(l_element_courant != NULL)
! 2416: {
! 2417: l_element_suivant = (*l_element_courant).suivant;
! 2418:
! 2419: liberation(s_etat_processus, (*l_element_courant).donnee);
! 2420: free(l_element_courant);
! 2421:
! 2422: l_element_courant = l_element_suivant;
! 2423: }
! 2424:
! 2425: l_element_courant = (struct_liste_chainee *)
! 2426: (*s_etat_processus).l_base_pile_systeme;
! 2427: while(l_element_courant != NULL)
! 2428: {
! 2429: l_element_suivant = (struct_liste_chainee *)
! 2430: (*((struct_liste_pile_systeme *)
! 2431: l_element_courant)).suivant;
! 2432:
! 2433: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
! 2434: l_element_courant)).indice_boucle);
! 2435: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
! 2436: l_element_courant)).limite_indice_boucle);
! 2437: liberation(s_etat_processus, (*((struct_liste_pile_systeme *)
! 2438: l_element_courant)).objet_de_test);
! 2439:
! 2440: if ((*((struct_liste_pile_systeme *)
! 2441: l_element_courant)).nom_variable != NULL)
! 2442: {
! 2443: free((*((struct_liste_pile_systeme *)
! 2444: l_element_courant)).nom_variable);
! 2445: }
! 2446:
! 2447: free((struct_liste_pile_systeme *) l_element_courant);
! 2448:
! 2449: l_element_courant = l_element_suivant;
! 2450: }
! 2451:
! 2452: /*
! 2453: * Destruction des bibliothèques
! 2454: */
! 2455:
! 2456: l_element_courant = (*s_etat_processus).s_bibliotheques;
! 2457:
! 2458: while(l_element_courant != NULL)
! 2459: {
! 2460: l_element_suivant = (*l_element_courant).suivant;
! 2461:
! 2462: free((*((struct_bibliotheque *) (*l_element_courant).donnee)).nom);
! 2463:
! 2464: dlclose((*((struct_bibliotheque *) (*l_element_courant).donnee))
! 2465: .descripteur);
! 2466:
! 2467: free((*l_element_courant).donnee);
! 2468: free(l_element_courant);
! 2469:
! 2470: l_element_courant = l_element_suivant;
! 2471: }
! 2472:
! 2473: for(i = 0; i < (*s_etat_processus).nombre_instructions_externes; i++)
! 2474: {
! 2475: free((*s_etat_processus).s_instructions_externes[i].nom);
! 2476: free((*s_etat_processus).s_instructions_externes[i]
! 2477: .nom_bibliotheque);
! 2478: }
! 2479:
! 2480: if ((*s_etat_processus).nombre_instructions_externes != 0)
! 2481: {
! 2482: free((*s_etat_processus).s_instructions_externes);
! 2483: }
! 2484:
! 2485: l_element_courant = (struct_liste_chainee *)
! 2486: (*s_etat_processus).s_marques;
! 2487:
! 2488: while(l_element_courant != NULL)
! 2489: {
! 2490: free((*((struct_marque *) l_element_courant)).label);
! 2491: free((*((struct_marque *) l_element_courant)).position);
! 2492: l_element_suivant = (struct_liste_chainee *)
! 2493: (*((struct_marque *) l_element_courant)).suivant;
! 2494: free((struct_marque *) l_element_courant);
! 2495: l_element_courant = l_element_suivant;
! 2496: }
! 2497:
! 2498: free((*s_etat_processus).chemin_fichiers_temporaires);
! 2499:
! 2500: if ((*s_etat_processus).debug == d_vrai)
! 2501: if (((*s_etat_processus).type_debug &
! 2502: d_debug_processus) != 0)
! 2503: {
! 2504: if ((*s_etat_processus).langue == 'F')
! 2505: {
! 2506: printf("[%d] Arrêt du processus\n", (int) getpid());
! 2507: }
! 2508: else
! 2509: {
! 2510: printf("[%d] Stop process\n", (int) getpid());
! 2511: }
! 2512:
! 2513: fflush(stdout);
! 2514: }
! 2515:
! 2516: liberation(s_etat_processus, s_objet);
! 2517:
! 2518: free((*s_etat_processus).pile_signal.ss_sp);
! 2519: free((*s_etat_processus).definitions_chainees);
! 2520:
! 2521: free((*s_etat_processus).nom_fichier_historique);
! 2522:
! 2523: for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
! 2524: {
! 2525: liberation(s_etat_processus,
! 2526: (*s_etat_processus).corps_interruptions[i]);
! 2527:
! 2528: l_element_courant = (*s_etat_processus)
! 2529: .pile_origine_interruptions[i];
! 2530:
! 2531: while(l_element_courant != NULL)
! 2532: {
! 2533: l_element_suivant = (*l_element_courant).suivant;
! 2534:
! 2535: liberation(s_etat_processus, (*l_element_courant).donnee);
! 2536: free(l_element_courant);
! 2537:
! 2538: l_element_courant = l_element_suivant;
! 2539: }
! 2540: }
! 2541:
! 2542: if ((*s_etat_processus).generateur_aleatoire != NULL)
! 2543: {
! 2544: liberation_generateur_aleatoire(s_etat_processus);
! 2545: }
! 2546:
! 2547: if ((*s_etat_processus).profilage == d_vrai)
! 2548: {
! 2549: ecriture_profil(s_etat_processus);
! 2550: liberation_profil(s_etat_processus);
! 2551: }
! 2552:
! 2553: closelog();
! 2554:
! 2555: liberation_allocateur(s_etat_processus);
! 2556: retrait_thread(s_etat_processus);
! 2557:
! 2558: pthread_mutex_destroy(&((*s_etat_processus).mutex));
! 2559: pthread_mutex_destroy(&((*s_etat_processus).protection_liste_mutexes));
! 2560:
! 2561: pthread_key_delete(semaphore_fork_processus_courant);
! 2562:
! 2563: sem_post(&((*s_etat_processus).semaphore_fork));
! 2564: sem_destroy(&((*s_etat_processus).semaphore_fork));
! 2565:
! 2566: free((*s_etat_processus).localisation);
! 2567: free(s_etat_processus);
! 2568: free(s_argument_thread);
! 2569:
! 2570: sem_destroy(&semaphore_liste_threads);
! 2571: sem_post(&semaphore_gestionnaires_signaux);
! 2572: sem_destroy(&semaphore_gestionnaires_signaux);
! 2573: sem_destroy(&semaphore_gestionnaires_signaux_atomique);
! 2574:
! 2575: clear_history();
! 2576: exit(EXIT_SUCCESS);
! 2577: }
! 2578: else
! 2579: {
! 2580: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2581: return;
! 2582: }
! 2583:
! 2584: liberation(s_etat_processus, s_objet);
! 2585:
! 2586: if ((s_objet = allocation(s_etat_processus, PRC)) == NULL)
! 2587: {
! 2588: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2589: return;
! 2590: }
! 2591:
! 2592: (*((struct_processus_fils *) (*s_objet).objet)).thread = s_argument_thread;
! 2593: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
! 2594: .nombre_objets_dans_pipe = 0;
! 2595: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
! 2596: .nombre_interruptions_dans_pipe = 0;
! 2597: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
! 2598: .nombre_references = 1;
! 2599:
! 2600: /*
! 2601: * On copie l'objet plutôt que le pointeur car cet objet peut être
! 2602: * accédé depuis deux threads distincts et aboutir à un blocage lors d'une
! 2603: * copie.
! 2604: */
! 2605:
! 2606: if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet, 'O')) == NULL)
! 2607: {
! 2608: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2609: return;
! 2610: }
! 2611:
! 2612: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 2613: {
! 2614: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2615: return;
! 2616: }
! 2617:
! 2618: // Si le pid existe déjà dans la pile des processus, il s'agit forcement
! 2619: // d'un processus moribond. On attend donc qu'il soit effectivement
! 2620: // libéré.
! 2621:
! 2622: do
! 2623: {
! 2624: l_element_courant = (struct_liste_chainee *)
! 2625: (*s_etat_processus).l_base_pile_processus;
! 2626: drapeau = d_faux;
! 2627:
! 2628: attente.tv_sec = 0;
! 2629: attente.tv_nsec = GRANULARITE_us * 1000;
! 2630:
! 2631: while(l_element_courant != NULL)
! 2632: {
! 2633: if ((*(*((struct_processus_fils *)
! 2634: (*(*l_element_courant).donnee).objet)).thread)
! 2635: .processus_detache == d_vrai)
! 2636: {
! 2637: if ((*(*((struct_processus_fils *)
! 2638: (*(*l_element_courant).donnee).objet)).thread).pid ==
! 2639: (*s_argument_thread).pid)
! 2640: {
! 2641: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2642: {
! 2643: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2644: return;
! 2645: }
! 2646:
! 2647: nanosleep(&attente, NULL);
! 2648: INCR_GRANULARITE(attente.tv_nsec);
! 2649:
! 2650: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 2651: {
! 2652: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2653: return;
! 2654: }
! 2655:
! 2656: drapeau = d_vrai;
! 2657: break;
! 2658: }
! 2659: }
! 2660:
! 2661: l_element_courant = (*l_element_courant).suivant;
! 2662: }
! 2663: } while(drapeau == d_vrai);
! 2664:
! 2665: if (empilement(s_etat_processus,
! 2666: (struct_liste_chainee **) &((*s_etat_processus)
! 2667: .l_base_pile_processus), s_objet_systeme) == d_erreur)
! 2668: {
! 2669: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 2670: return;
! 2671: }
! 2672:
! 2673: if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
! 2674: s_objet) == d_erreur)
! 2675: {
! 2676: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 2677: return;
! 2678: }
! 2679:
! 2680: // Être sûr que le processus fils soit déjà présent...
! 2681:
! 2682: while(kill((*s_argument_thread).pid, 0) != 0)
! 2683: {
! 2684: //if ((errno != ESRCH) && (errno != EAGAIN))
! 2685: if (errno != ESRCH)
! 2686: {
! 2687: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2688: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 2689: return;
! 2690: }
! 2691:
! 2692: nanosleep(&attente, NULL);
! 2693: }
! 2694:
! 2695: // Le fils peut être présent sans être en attente du signal de départ.
! 2696:
! 2697: if (kill((*s_argument_thread).pid, SIGSTART) != 0)
! 2698: {
! 2699: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2700: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 2701: return;
! 2702: }
! 2703:
! 2704: if (pthread_sigmask(SIG_SETMASK, &oldset, NULL) != 0)
! 2705: {
! 2706: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2707: pthread_mutex_unlock(&((*s_etat_processus).mutex));
! 2708: return;
! 2709: }
! 2710:
! 2711: sigpending(&set);
! 2712:
! 2713: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2714: {
! 2715: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2716: return;
! 2717: }
! 2718:
! 2719: return;
! 2720: }
! 2721:
! 2722: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>