Annotation of rpl/src/gestion_objets.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: Routine de gestion du nombre d'occurrences comme grandeur atomique
! 29: ================================================================================
! 30: entrées : structure sur l'état du processus et objet à afficher
! 31: --------------------------------------------------------------------------------
! 32: sorties : chaine de caractères
! 33: --------------------------------------------------------------------------------
! 34: effets de bord : néant
! 35: ================================================================================
! 36: */
! 37:
! 38: static inline void
! 39: incrementation_atomique(struct_objet *s_objet)
! 40: {
! 41: // Le mutex est sur l'objet.
! 42:
! 43: (*s_objet).nombre_occurrences++;
! 44:
! 45: BUG((*s_objet).nombre_occurrences <= 0,
! 46: uprintf("Capacity exceeded %ld\n", (*s_objet).nombre_occurrences));
! 47:
! 48: return;
! 49: }
! 50:
! 51: static inline long
! 52: decrementation_atomique(struct_objet *s_objet)
! 53: {
! 54: // Le mutex est sur l'objet.
! 55:
! 56: (*s_objet).nombre_occurrences--;
! 57: return((*s_objet).nombre_occurrences);
! 58: }
! 59:
! 60: inline void
! 61: initialisation_objet(struct_objet *s_objet)
! 62: {
! 63: pthread_mutexattr_t attributs_mutex;
! 64:
! 65: pthread_mutexattr_init(&attributs_mutex);
! 66: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);
! 67: pthread_mutex_init(&((*s_objet).mutex), &attributs_mutex);
! 68: pthread_mutexattr_destroy(&attributs_mutex);
! 69:
! 70: (*s_objet).nombre_occurrences = 1;
! 71:
! 72: return;
! 73: }
! 74:
! 75:
! 76: /*
! 77: ================================================================================
! 78: Routines d'initialisation et de purge de l'allocateur
! 79: ================================================================================
! 80: Entrées : structure sur l'état du processus et objet à afficher
! 81: --------------------------------------------------------------------------------
! 82: Sorties : chaine de caractères
! 83: --------------------------------------------------------------------------------
! 84: Effets de bord : néant
! 85: ================================================================================
! 86: */
! 87:
! 88: void
! 89: initialisation_allocateur(struct_processus *s_etat_processus)
! 90: {
! 91: (*s_etat_processus).estimation_taille_pile_tampon = 0;
! 92: (*s_etat_processus).taille_pile_tampon = 0;
! 93: (*s_etat_processus).pile_tampon = NULL;
! 94:
! 95: (*s_etat_processus).estimation_taille_pile_systeme_tampon = 0;
! 96: (*s_etat_processus).taille_pile_systeme_tampon = 0;
! 97: (*s_etat_processus).pile_systeme_tampon = NULL;
! 98:
! 99: (*s_etat_processus).taille_pile_objets = 0;
! 100: (*s_etat_processus).pile_objets = NULL;
! 101:
! 102: (*s_etat_processus).pointeur_adr = 0;
! 103: (*s_etat_processus).pointeur_bin = 0;
! 104: (*s_etat_processus).pointeur_cpl = 0;
! 105: (*s_etat_processus).pointeur_fct = 0;
! 106: (*s_etat_processus).pointeur_int = 0;
! 107: (*s_etat_processus).pointeur_mat = 0;
! 108: (*s_etat_processus).pointeur_nom = 0;
! 109: (*s_etat_processus).pointeur_rel = 0;
! 110: (*s_etat_processus).pointeur_tab = 0;
! 111: (*s_etat_processus).pointeur_vec = 0;
! 112: (*s_etat_processus).pointeur_maillons = 0;
! 113:
! 114: return;
! 115: }
! 116:
! 117:
! 118: void
! 119: liberation_allocateur(struct_processus *s_etat_processus)
! 120: {
! 121: int i;
! 122:
! 123: for(i = 0; i < (*s_etat_processus).pointeur_adr;
! 124: free((*s_etat_processus).objets_adr[i++]));
! 125: for(i = 0; i < (*s_etat_processus).pointeur_bin;
! 126: free((*s_etat_processus).objets_bin[i++]));
! 127: for(i = 0; i < (*s_etat_processus).pointeur_cpl;
! 128: free((*s_etat_processus).objets_cpl[i++]));
! 129: for(i = 0; i < (*s_etat_processus).pointeur_fct;
! 130: free((*s_etat_processus).objets_fct[i++]));
! 131: for(i = 0; i < (*s_etat_processus).pointeur_int;
! 132: free((*s_etat_processus).objets_int[i++]));
! 133: for(i = 0; i < (*s_etat_processus).pointeur_mat;
! 134: free((*s_etat_processus).objets_mat[i++]));
! 135: for(i = 0; i < (*s_etat_processus).pointeur_nom;
! 136: free((*s_etat_processus).objets_nom[i++]));
! 137: for(i = 0; i < (*s_etat_processus).pointeur_rel;
! 138: free((*s_etat_processus).objets_rel[i++]));
! 139: for(i = 0; i < (*s_etat_processus).pointeur_tab;
! 140: free((*s_etat_processus).objets_tab[i++]));
! 141: for(i = 0; i < (*s_etat_processus).pointeur_vec;
! 142: free((*s_etat_processus).objets_vec[i++]));
! 143: for(i = 0; i < (*s_etat_processus).pointeur_maillons;
! 144: free((*s_etat_processus).maillons[i++]));
! 145:
! 146: {
! 147: struct_liste_chainee *l_element_courant;
! 148: struct_liste_chainee *l_element_suivant;
! 149:
! 150: l_element_courant = (*s_etat_processus).pile_tampon;
! 151:
! 152: while(l_element_courant != NULL)
! 153: {
! 154: l_element_suivant = (*l_element_courant).suivant;
! 155: liberation(s_etat_processus, (*l_element_courant).donnee);
! 156: free(l_element_courant);
! 157: l_element_courant = l_element_suivant;
! 158: }
! 159: }
! 160:
! 161: {
! 162: struct_liste_pile_systeme *l_element_courant;
! 163: struct_liste_pile_systeme *l_element_suivant;
! 164:
! 165: l_element_courant = (*s_etat_processus).pile_systeme_tampon;
! 166:
! 167: while(l_element_courant != NULL)
! 168: {
! 169: l_element_suivant = (*l_element_courant).suivant;
! 170: free(l_element_courant);
! 171: l_element_courant = l_element_suivant;
! 172: }
! 173: }
! 174:
! 175: {
! 176: struct_objet *l_element_courant;
! 177: struct_objet *l_element_suivant;
! 178:
! 179: l_element_courant = (*s_etat_processus).pile_objets;
! 180:
! 181: while(l_element_courant != NULL)
! 182: {
! 183: l_element_suivant = (*l_element_courant).objet;
! 184:
! 185: if (pthread_mutex_destroy(&((*l_element_courant).mutex)) != 0)
! 186: {
! 187: (*s_etat_processus).erreur_systeme = d_es_processus;
! 188: BUG(1, printf("Mutex error\n"));
! 189: return;
! 190: }
! 191:
! 192: free(l_element_courant);
! 193: l_element_courant = l_element_suivant;
! 194: }
! 195: }
! 196:
! 197: return;
! 198: }
! 199:
! 200:
! 201: /*
! 202: ================================================================================
! 203: Routine d'allocation d'un maillon d'un objet (liste, expression...)
! 204: ================================================================================
! 205: Entrées : structure sur l'état du processus et objet à afficher
! 206: --------------------------------------------------------------------------------
! 207: Sorties : chaine de caractères
! 208: --------------------------------------------------------------------------------
! 209: Effets de bord : néant
! 210: ================================================================================
! 211: */
! 212:
! 213: void *
! 214: allocation_maillon(struct_processus *s_etat_processus)
! 215: {
! 216: struct_liste_chainee *s_maillon;
! 217:
! 218: if ((*s_etat_processus).pointeur_maillons > 0)
! 219: {
! 220: s_maillon = (*s_etat_processus).maillons
! 221: [--(*s_etat_processus).pointeur_maillons];
! 222: }
! 223: else
! 224: {
! 225: if ((s_maillon = malloc(sizeof(struct_liste_chainee))) == NULL)
! 226: {
! 227: return(NULL);
! 228: }
! 229: }
! 230:
! 231: return(s_maillon);
! 232: }
! 233:
! 234:
! 235: /*
! 236: ================================================================================
! 237: Routine d'allocation d'un maillon d'un objet (liste, expression...)
! 238: ================================================================================
! 239: Entrées : structure sur l'état du processus et objet à afficher
! 240: --------------------------------------------------------------------------------
! 241: Sorties : chaine de caractères
! 242: --------------------------------------------------------------------------------
! 243: Effets de bord : néant
! 244: ================================================================================
! 245: */
! 246:
! 247: void
! 248: liberation_maillon(struct_processus *s_etat_processus,
! 249: struct_liste_chainee *maillon)
! 250: {
! 251: if ((*s_etat_processus).pointeur_maillons < TAILLE_CACHE)
! 252: {
! 253: (*s_etat_processus).maillons
! 254: [(*s_etat_processus).pointeur_maillons++] = maillon;
! 255: }
! 256: else
! 257: {
! 258: free(maillon);
! 259: }
! 260:
! 261: return;
! 262: }
! 263:
! 264:
! 265: /*
! 266: ================================================================================
! 267: Routine d'allocation d'une structure *s_objet
! 268: ================================================================================
! 269: Entrées : structure sur l'état du processus et objet à afficher
! 270: --------------------------------------------------------------------------------
! 271: Sorties : chaine de caractères
! 272: --------------------------------------------------------------------------------
! 273: Effets de bord : néant
! 274: ================================================================================
! 275: */
! 276:
! 277: void *
! 278: allocation(struct_processus *s_etat_processus, enum t_type type)
! 279: {
! 280: struct_objet *s_objet;
! 281:
! 282: if ((*s_etat_processus).pile_objets == NULL)
! 283: {
! 284: // Il n'existe aucune structure struct_objet disponible dans le cache.
! 285:
! 286: if ((s_objet = malloc(sizeof(struct_objet))) == NULL)
! 287: {
! 288: return(NULL);
! 289: }
! 290:
! 291: initialisation_objet(s_objet);
! 292: }
! 293: else
! 294: {
! 295: // Récupération d'une structure dans le cache.
! 296:
! 297: s_objet = (*s_etat_processus).pile_objets;
! 298: (*s_etat_processus).pile_objets = (*s_objet).objet;
! 299: (*s_etat_processus).taille_pile_objets--;
! 300:
! 301: (*s_objet).nombre_occurrences = 1;
! 302: }
! 303:
! 304: (*s_objet).type = type;
! 305:
! 306: switch(type)
! 307: {
! 308: case ADR :
! 309: {
! 310: if ((*s_etat_processus).pointeur_adr > 0)
! 311: {
! 312: (*s_objet).objet = (*s_etat_processus).objets_adr
! 313: [--(*s_etat_processus).pointeur_adr];
! 314: }
! 315: else
! 316: {
! 317: if (((*s_objet).objet = malloc(sizeof(unsigned long))) == NULL)
! 318: {
! 319: free(s_objet);
! 320: return(NULL);
! 321: }
! 322: }
! 323:
! 324: break;
! 325: }
! 326:
! 327: case ALG :
! 328: {
! 329: (*s_objet).objet = NULL;
! 330: break;
! 331: }
! 332:
! 333: case BIN :
! 334: {
! 335: if ((*s_etat_processus).pointeur_bin > 0)
! 336: {
! 337: (*s_objet).objet = (*s_etat_processus).objets_bin
! 338: [--(*s_etat_processus).pointeur_bin];
! 339: }
! 340: else
! 341: {
! 342: if (((*s_objet).objet = malloc(sizeof(logical8))) == NULL)
! 343: {
! 344: free(s_objet);
! 345: return(NULL);
! 346: }
! 347: }
! 348:
! 349: break;
! 350: }
! 351:
! 352: case CHN :
! 353: {
! 354: (*s_objet).objet = NULL;
! 355: break;
! 356: }
! 357:
! 358: case CPL :
! 359: {
! 360: if ((*s_etat_processus).pointeur_cpl > 0)
! 361: {
! 362: (*s_objet).objet = (*s_etat_processus).objets_cpl
! 363: [--(*s_etat_processus).pointeur_cpl];
! 364: }
! 365: else
! 366: {
! 367: if (((*s_objet).objet = malloc(sizeof(struct_complexe16)))
! 368: == NULL)
! 369: {
! 370: free(s_objet);
! 371: return(NULL);
! 372: }
! 373: }
! 374:
! 375: break;
! 376: }
! 377:
! 378: case FCH :
! 379: {
! 380: if (((*s_objet).objet = malloc(sizeof(struct_fichier))) == NULL)
! 381: {
! 382: free(s_objet);
! 383: return(NULL);
! 384: }
! 385:
! 386: break;
! 387: }
! 388:
! 389: case FCT :
! 390: {
! 391: if ((*s_etat_processus).pointeur_fct > 0)
! 392: {
! 393: (*s_objet).objet = (*s_etat_processus).objets_fct
! 394: [--(*s_etat_processus).pointeur_fct];
! 395: }
! 396: else
! 397: {
! 398: if (((*s_objet).objet = malloc(sizeof(struct_fonction)))
! 399: == NULL)
! 400: {
! 401: free(s_objet);
! 402: return(NULL);
! 403: }
! 404: }
! 405:
! 406: (*((struct_fonction *) (*s_objet).objet)).prediction_saut = NULL;
! 407: break;
! 408: }
! 409:
! 410: case INT :
! 411: {
! 412: if ((*s_etat_processus).pointeur_int > 0)
! 413: {
! 414: (*s_objet).objet = (*s_etat_processus).objets_int
! 415: [--(*s_etat_processus).pointeur_int];
! 416: }
! 417: else
! 418: {
! 419: if (((*s_objet).objet = malloc(sizeof(integer8))) == NULL)
! 420: {
! 421: free(s_objet);
! 422: return(NULL);
! 423: }
! 424: }
! 425:
! 426: break;
! 427: }
! 428:
! 429: case LST :
! 430: {
! 431: (*s_objet).objet = NULL;
! 432: break;
! 433: }
! 434:
! 435: case MCX :
! 436: {
! 437: if ((*s_etat_processus).pointeur_mat > 0)
! 438: {
! 439: (*s_objet).objet = (*s_etat_processus).objets_mat
! 440: [--(*s_etat_processus).pointeur_mat];
! 441: }
! 442: else
! 443: {
! 444: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
! 445: {
! 446: free(s_objet);
! 447: return(NULL);
! 448: }
! 449: }
! 450:
! 451: (*((struct_matrice *) (*s_objet).objet)).type = 'C';
! 452: (*((struct_matrice *) (*s_objet).objet)).nombre_lignes = 0;
! 453: (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes = 0;
! 454: (*((struct_matrice *) (*s_objet).objet)).tableau = NULL;
! 455: break;
! 456: }
! 457:
! 458: case MIN :
! 459: {
! 460: if ((*s_etat_processus).pointeur_mat > 0)
! 461: {
! 462: (*s_objet).objet = (*s_etat_processus).objets_mat
! 463: [--(*s_etat_processus).pointeur_mat];
! 464: }
! 465: else
! 466: {
! 467: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
! 468: {
! 469: free(s_objet);
! 470: return(NULL);
! 471: }
! 472: }
! 473:
! 474: (*((struct_matrice *) (*s_objet).objet)).type = 'I';
! 475: (*((struct_matrice *) (*s_objet).objet)).nombre_lignes = 0;
! 476: (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes = 0;
! 477: (*((struct_matrice *) (*s_objet).objet)).tableau = NULL;
! 478: break;
! 479: }
! 480:
! 481: case MRL :
! 482: {
! 483: if ((*s_etat_processus).pointeur_mat > 0)
! 484: {
! 485: (*s_objet).objet = (*s_etat_processus).objets_mat
! 486: [--(*s_etat_processus).pointeur_mat];
! 487: }
! 488: else
! 489: {
! 490: if (((*s_objet).objet = malloc(sizeof(struct_matrice))) == NULL)
! 491: {
! 492: free(s_objet);
! 493: return(NULL);
! 494: }
! 495: }
! 496:
! 497: (*((struct_matrice *) (*s_objet).objet)).type = 'R';
! 498: (*((struct_matrice *) (*s_objet).objet)).nombre_lignes = 0;
! 499: (*((struct_matrice *) (*s_objet).objet)).nombre_colonnes = 0;
! 500: (*((struct_matrice *) (*s_objet).objet)).tableau = NULL;
! 501: break;
! 502: }
! 503:
! 504: case MTX :
! 505: {
! 506: if (((*s_objet).objet = malloc(sizeof(struct_mutex))) == NULL)
! 507: {
! 508: free(s_objet);
! 509: return(NULL);
! 510: }
! 511:
! 512: break;
! 513: }
! 514:
! 515: case NOM :
! 516: {
! 517: if ((*s_etat_processus).pointeur_nom > 0)
! 518: {
! 519: (*s_objet).objet = (*s_etat_processus).objets_nom
! 520: [--(*s_etat_processus).pointeur_nom];
! 521: }
! 522: else
! 523: {
! 524: if (((*s_objet).objet = malloc(sizeof(struct_nom))) == NULL)
! 525: {
! 526: free(s_objet);
! 527: return(NULL);
! 528: }
! 529: }
! 530:
! 531: break;
! 532: }
! 533:
! 534: case NON :
! 535: {
! 536: (*s_objet).objet = NULL;
! 537: break;
! 538: }
! 539:
! 540: case PRC :
! 541: {
! 542: if (((*s_objet).objet = malloc(sizeof(struct_processus_fils)))
! 543: == NULL)
! 544: {
! 545: free(s_objet);
! 546: return(NULL);
! 547: }
! 548:
! 549: break;
! 550: }
! 551:
! 552: case REL :
! 553: {
! 554: if ((*s_etat_processus).pointeur_rel > 0)
! 555: {
! 556: (*s_objet).objet = (*s_etat_processus).objets_rel
! 557: [--(*s_etat_processus).pointeur_rel];
! 558: }
! 559: else
! 560: {
! 561: if (((*s_objet).objet = malloc(sizeof(real8))) == NULL)
! 562: {
! 563: free(s_objet);
! 564: return(NULL);
! 565: }
! 566: }
! 567:
! 568: break;
! 569: }
! 570:
! 571: case RPN :
! 572: {
! 573: (*s_objet).objet = NULL;
! 574: break;
! 575: }
! 576:
! 577: case SCK :
! 578: {
! 579: if (((*s_objet).objet = malloc(sizeof(struct_socket))) == NULL)
! 580: {
! 581: free(s_objet);
! 582: return(NULL);
! 583: }
! 584:
! 585: break;
! 586: }
! 587:
! 588: case SLB :
! 589: {
! 590: if (((*s_objet).objet = malloc(sizeof(struct_bibliotheque)))
! 591: == NULL)
! 592: {
! 593: free(s_objet);
! 594: return(NULL);
! 595: }
! 596:
! 597: break;
! 598: }
! 599:
! 600: case SPH :
! 601: {
! 602: if (((*s_objet).objet = malloc(sizeof(struct_semaphore))) == NULL)
! 603: {
! 604: free(s_objet);
! 605: return(NULL);
! 606: }
! 607:
! 608: break;
! 609: }
! 610:
! 611: case SQL :
! 612: {
! 613: if (((*s_objet).objet = malloc(sizeof(struct_connecteur_sql)))
! 614: == NULL)
! 615: {
! 616: free(s_objet);
! 617: return(NULL);
! 618: }
! 619:
! 620: break;
! 621: }
! 622:
! 623: case TBL :
! 624: {
! 625: if ((*s_etat_processus).pointeur_tab > 0)
! 626: {
! 627: (*s_objet).objet = (*s_etat_processus).objets_tab
! 628: [--(*s_etat_processus).pointeur_tab];
! 629: }
! 630: else
! 631: {
! 632: if (((*s_objet).objet = malloc(sizeof(struct_tableau))) == NULL)
! 633: {
! 634: free(s_objet);
! 635: return(NULL);
! 636: }
! 637: }
! 638:
! 639: (*((struct_tableau *) (*s_objet).objet)).nombre_elements = 0;
! 640: (*((struct_tableau *) (*s_objet).objet)).elements = NULL;
! 641: break;
! 642: }
! 643:
! 644: case VCX :
! 645: {
! 646: if ((*s_etat_processus).pointeur_vec > 0)
! 647: {
! 648: (*s_objet).objet = (*s_etat_processus).objets_vec
! 649: [--(*s_etat_processus).pointeur_vec];
! 650: }
! 651: else
! 652: {
! 653: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
! 654: {
! 655: free(s_objet);
! 656: return(NULL);
! 657: }
! 658: }
! 659:
! 660: (*((struct_vecteur *) (*s_objet).objet)).type = 'C';
! 661: (*((struct_vecteur *) (*s_objet).objet)).taille = 0;
! 662: (*((struct_vecteur *) (*s_objet).objet)).tableau = NULL;
! 663: break;
! 664: }
! 665:
! 666: case VIN :
! 667: {
! 668: if ((*s_etat_processus).pointeur_vec > 0)
! 669: {
! 670: (*s_objet).objet = (*s_etat_processus).objets_vec
! 671: [--(*s_etat_processus).pointeur_vec];
! 672: }
! 673: else
! 674: {
! 675: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
! 676: {
! 677: free(s_objet);
! 678: return(NULL);
! 679: }
! 680: }
! 681:
! 682: (*((struct_vecteur *) (*s_objet).objet)).type = 'I';
! 683: (*((struct_vecteur *) (*s_objet).objet)).taille = 0;
! 684: (*((struct_vecteur *) (*s_objet).objet)).tableau = NULL;
! 685: break;
! 686: }
! 687:
! 688: case VRL :
! 689: {
! 690: if ((*s_etat_processus).pointeur_vec > 0)
! 691: {
! 692: (*s_objet).objet = (*s_etat_processus).objets_vec
! 693: [--(*s_etat_processus).pointeur_vec];
! 694: }
! 695: else
! 696: {
! 697: if (((*s_objet).objet = malloc(sizeof(struct_vecteur))) == NULL)
! 698: {
! 699: free(s_objet);
! 700: return(NULL);
! 701: }
! 702: }
! 703:
! 704: (*((struct_vecteur *) (*s_objet).objet)).type = 'R';
! 705: (*((struct_vecteur *) (*s_objet).objet)).taille = 0;
! 706: (*((struct_vecteur *) (*s_objet).objet)).tableau = NULL;
! 707: break;
! 708: }
! 709:
! 710: default :
! 711: {
! 712: free(s_objet);
! 713: BUG(1, printf("Allocation failure (type %d)\n", type));
! 714:
! 715: return(NULL);
! 716: }
! 717: }
! 718:
! 719: return(s_objet);
! 720: }
! 721:
! 722:
! 723: /*
! 724: ================================================================================
! 725: Routine de libération d'une structure *s_objet
! 726: ================================================================================
! 727: Entrées : structure sur l'état du processus et objet à afficher
! 728: --------------------------------------------------------------------------------
! 729: Sorties : chaine de caractères
! 730: --------------------------------------------------------------------------------
! 731: Effets de bord : néant
! 732: ================================================================================
! 733: */
! 734:
! 735: void
! 736: liberation(struct_processus *s_etat_processus, struct_objet *s_objet)
! 737: {
! 738: logical1 drapeau;
! 739:
! 740: struct_liste_chainee *l_element_courant;
! 741: struct_liste_chainee *l_element_suivant;
! 742:
! 743: unsigned long i;
! 744:
! 745: if (s_objet == NULL)
! 746: {
! 747: return;
! 748: }
! 749:
! 750: if (pthread_mutex_lock(&((*s_objet).mutex)) != 0)
! 751: {
! 752: (*s_etat_processus).erreur_systeme = d_es_processus;
! 753: return;
! 754: }
! 755:
! 756: #define return \
! 757: if (pthread_mutex_unlock(&((*s_objet).mutex)) != 0) \
! 758: { (*s_etat_processus).erreur_systeme = d_es_processus; return; } \
! 759: return
! 760:
! 761: BUG((*s_objet).nombre_occurrences <= 0,
! 762: pthread_mutex_unlock(&((*s_objet).mutex)),
! 763: printf("(*s_objet).nombre_occurrences=%ld\n",
! 764: (*s_objet).nombre_occurrences));
! 765:
! 766: switch((*s_objet).type)
! 767: {
! 768: case ADR :
! 769: {
! 770: if (decrementation_atomique(s_objet) > 0)
! 771: {
! 772: return;
! 773: }
! 774:
! 775: if ((*s_etat_processus).pointeur_adr < TAILLE_CACHE)
! 776: {
! 777: (*s_etat_processus).objets_adr
! 778: [(*s_etat_processus).pointeur_adr++] = (*s_objet).objet;
! 779: }
! 780: else
! 781: {
! 782: free((unsigned long *) ((*s_objet).objet));
! 783: }
! 784:
! 785: break;
! 786: }
! 787:
! 788: case ALG :
! 789: {
! 790: l_element_courant = (struct_liste_chainee *) ((*s_objet).objet);
! 791:
! 792: if (decrementation_atomique(s_objet) > 0)
! 793: { // Il reste un pointeur sur l'objet.
! 794: while(l_element_courant != NULL)
! 795: {
! 796: BUG((*(*l_element_courant).donnee).nombre_occurrences <= 1,
! 797: pthread_mutex_unlock(&((*s_objet).mutex)),
! 798: printf("(*(*l_element_courant).donnee)"
! 799: ".nombre_occurrences=%ld\n",
! 800: (*(*l_element_courant).donnee).nombre_occurrences));
! 801:
! 802: liberation(s_etat_processus, (*l_element_courant).donnee);
! 803: l_element_courant = (*l_element_courant).suivant;
! 804: }
! 805:
! 806: return;
! 807: }
! 808: else
! 809: { // Il ne reste plus aucun pointeur sur l'objet.
! 810: while(l_element_courant != NULL)
! 811: {
! 812: l_element_suivant = (*l_element_courant).suivant;
! 813: liberation(s_etat_processus, (*l_element_courant).donnee);
! 814: liberation_maillon(s_etat_processus, l_element_courant);
! 815: l_element_courant = l_element_suivant;
! 816: }
! 817: }
! 818:
! 819: break;
! 820: }
! 821:
! 822: case BIN :
! 823: {
! 824: if (decrementation_atomique(s_objet) > 0)
! 825: {
! 826: return;
! 827: }
! 828:
! 829: if ((*s_etat_processus).pointeur_bin < TAILLE_CACHE)
! 830: {
! 831: (*s_etat_processus).objets_bin
! 832: [(*s_etat_processus).pointeur_bin++] = (*s_objet).objet;
! 833: }
! 834: else
! 835: {
! 836: free((logical8 *) ((*s_objet).objet));
! 837: }
! 838:
! 839: break;
! 840: }
! 841:
! 842: case CHN :
! 843: {
! 844: if (decrementation_atomique(s_objet) > 0)
! 845: {
! 846: return;
! 847: }
! 848:
! 849: free((unsigned char *) ((*s_objet).objet));
! 850: break;
! 851: }
! 852:
! 853: case CPL :
! 854: {
! 855: if (decrementation_atomique(s_objet) > 0)
! 856: {
! 857: return;
! 858: }
! 859:
! 860: if ((*s_etat_processus).pointeur_cpl < TAILLE_CACHE)
! 861: {
! 862: (*s_etat_processus).objets_cpl
! 863: [(*s_etat_processus).pointeur_cpl++] = (*s_objet).objet;
! 864: }
! 865: else
! 866: {
! 867: free((struct_complexe16 *) ((*s_objet).objet));
! 868: }
! 869:
! 870: break;
! 871: }
! 872:
! 873: case FCH :
! 874: {
! 875: if (decrementation_atomique(s_objet) > 0)
! 876: {
! 877: return;
! 878: }
! 879:
! 880: liberation(s_etat_processus,
! 881: (*((struct_fichier *) (*s_objet).objet)).format);
! 882:
! 883: free((unsigned char *) (*((struct_fichier *)
! 884: (*s_objet).objet)).nom);
! 885: free((struct_fichier *) ((*s_objet).objet));
! 886: break;
! 887: }
! 888:
! 889: case FCT :
! 890: {
! 891: if (decrementation_atomique(s_objet) > 0)
! 892: {
! 893: return;
! 894: }
! 895:
! 896: free((unsigned char *) (*((struct_fonction *)
! 897: (*s_objet).objet)).nom_fonction);
! 898:
! 899: if ((*s_etat_processus).pointeur_fct < TAILLE_CACHE)
! 900: {
! 901: (*s_etat_processus).objets_fct
! 902: [(*s_etat_processus).pointeur_fct++] = (*s_objet).objet;
! 903: }
! 904: else
! 905: {
! 906: free((struct_fonction *) (*s_objet).objet);
! 907: }
! 908:
! 909: break;
! 910: }
! 911:
! 912: case INT :
! 913: {
! 914: if (decrementation_atomique(s_objet) > 0)
! 915: {
! 916: return;
! 917: }
! 918:
! 919: if ((*s_etat_processus).pointeur_int < TAILLE_CACHE)
! 920: {
! 921: (*s_etat_processus).objets_int
! 922: [(*s_etat_processus).pointeur_int++] = (*s_objet).objet;
! 923: }
! 924: else
! 925: {
! 926: free((integer8 *) ((*s_objet).objet));
! 927: }
! 928:
! 929: break;
! 930: }
! 931:
! 932: case LST :
! 933: {
! 934: l_element_courant = (struct_liste_chainee *) ((*s_objet).objet);
! 935:
! 936: if (decrementation_atomique(s_objet) > 0)
! 937: { // Il reste un pointeur sur l'objet.
! 938: while(l_element_courant != NULL)
! 939: {
! 940: BUG((*(*l_element_courant).donnee).nombre_occurrences <= 1,
! 941: pthread_mutex_unlock(&((*s_objet).mutex)),
! 942: printf("(*(*l_element_courant).donnee)"
! 943: ".nombre_occurrences=%ld\n",
! 944: (*(*l_element_courant).donnee).nombre_occurrences));
! 945:
! 946: liberation(s_etat_processus, (*l_element_courant).donnee);
! 947: l_element_courant = (*l_element_courant).suivant;
! 948: }
! 949:
! 950: return;
! 951: }
! 952: else
! 953: { // Il ne reste plus aucun pointeur sur l'objet.
! 954: while(l_element_courant != NULL)
! 955: {
! 956: l_element_suivant = (*l_element_courant).suivant;
! 957: liberation(s_etat_processus, (*l_element_courant).donnee);
! 958: liberation_maillon(s_etat_processus, l_element_courant);
! 959: l_element_courant = l_element_suivant;
! 960: }
! 961: }
! 962:
! 963: break;
! 964: }
! 965:
! 966: case MIN :
! 967: {
! 968: if (decrementation_atomique(s_objet) > 0)
! 969: {
! 970: return;
! 971: }
! 972:
! 973: for(i = 0; i < (*((struct_matrice *)
! 974: ((*s_objet).objet))).nombre_lignes; i++)
! 975: {
! 976: free(((integer8 **) (*((struct_matrice *)
! 977: (*s_objet).objet)).tableau)[i]);
! 978: }
! 979:
! 980: free((integer8 **) (*((struct_matrice *)
! 981: (*s_objet).objet)).tableau);
! 982:
! 983: if ((*s_etat_processus).pointeur_mat < TAILLE_CACHE)
! 984: {
! 985: (*s_etat_processus).objets_mat
! 986: [(*s_etat_processus).pointeur_mat++] = (*s_objet).objet;
! 987: }
! 988: else
! 989: {
! 990: free((struct_matrice *) (*s_objet).objet);
! 991: }
! 992:
! 993: break;
! 994: }
! 995:
! 996: case MCX :
! 997: {
! 998: if (decrementation_atomique(s_objet) > 0)
! 999: {
! 1000: return;
! 1001: }
! 1002:
! 1003: for(i = 0; i < (*((struct_matrice *)
! 1004: ((*s_objet).objet))).nombre_lignes; i++)
! 1005: {
! 1006: free(((struct_complexe16 **) (*((struct_matrice *)
! 1007: (*s_objet).objet)).tableau)[i]);
! 1008: }
! 1009:
! 1010: free((struct_complexe16 **) (*((struct_matrice *)
! 1011: (*s_objet).objet)).tableau);
! 1012:
! 1013: if ((*s_etat_processus).pointeur_mat < TAILLE_CACHE)
! 1014: {
! 1015: (*s_etat_processus).objets_mat
! 1016: [(*s_etat_processus).pointeur_mat++] = (*s_objet).objet;
! 1017: }
! 1018: else
! 1019: {
! 1020: free((struct_matrice *) (*s_objet).objet);
! 1021: }
! 1022:
! 1023: break;
! 1024: }
! 1025:
! 1026: case MRL :
! 1027: {
! 1028: if (decrementation_atomique(s_objet) > 0)
! 1029: {
! 1030: return;
! 1031: }
! 1032:
! 1033: for(i = 0; i < (*((struct_matrice *)
! 1034: ((*s_objet).objet))).nombre_lignes; i++)
! 1035: {
! 1036: free(((real8 **) (*((struct_matrice *)
! 1037: (*s_objet).objet)).tableau)[i]);
! 1038: }
! 1039:
! 1040: free((real8 **) (*((struct_matrice *) (*s_objet).objet)).tableau);
! 1041:
! 1042: if ((*s_etat_processus).pointeur_mat < TAILLE_CACHE)
! 1043: {
! 1044: (*s_etat_processus).objets_mat
! 1045: [(*s_etat_processus).pointeur_mat++] = (*s_objet).objet;
! 1046: }
! 1047: else
! 1048: {
! 1049: free((struct_matrice *) (*s_objet).objet);
! 1050: }
! 1051:
! 1052: break;
! 1053: }
! 1054:
! 1055: case MTX :
! 1056: {
! 1057: if (decrementation_atomique(s_objet) > 0)
! 1058: {
! 1059: return;
! 1060: }
! 1061:
! 1062: free((struct_mutex *) (*s_objet).objet);
! 1063: break;
! 1064: }
! 1065:
! 1066: case NOM :
! 1067: {
! 1068: if (decrementation_atomique(s_objet) > 0)
! 1069: {
! 1070: return;
! 1071: }
! 1072:
! 1073: free((*((struct_nom *) (*s_objet).objet)).nom);
! 1074:
! 1075: if ((*s_etat_processus).pointeur_nom < TAILLE_CACHE)
! 1076: {
! 1077: (*s_etat_processus).objets_nom
! 1078: [(*s_etat_processus).pointeur_nom++] = (*s_objet).objet;
! 1079: }
! 1080: else
! 1081: {
! 1082: free((struct_nom *) (*s_objet).objet);
! 1083: }
! 1084:
! 1085: break;
! 1086: }
! 1087:
! 1088: case NON :
! 1089: {
! 1090: if (decrementation_atomique(s_objet) > 0)
! 1091: {
! 1092: return;
! 1093: }
! 1094:
! 1095: free(s_objet);
! 1096: break;
! 1097: }
! 1098:
! 1099: case PRC :
! 1100: {
! 1101: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
! 1102: (*s_objet).objet)).thread).mutex)) != 0)
! 1103: {
! 1104: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1105: return;
! 1106: }
! 1107:
! 1108: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
! 1109: .nombre_references--;
! 1110:
! 1111: BUG((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
! 1112: .nombre_references < 0, printf("(*(*((struct_processus_fils"
! 1113: " *) (*s_objet).objet)).thread).nombre_references = %d\n",
! 1114: (int) (*(*((struct_processus_fils *) (*s_objet).objet))
! 1115: .thread).nombre_references));
! 1116:
! 1117: if ((*(*((struct_processus_fils *) (*s_objet).objet)).thread)
! 1118: .nombre_references == 0)
! 1119: {
! 1120: drapeau = d_vrai;
! 1121: }
! 1122: else
! 1123: {
! 1124: drapeau = d_faux;
! 1125: }
! 1126:
! 1127: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
! 1128: (*s_objet).objet)).thread).mutex)) != 0)
! 1129: {
! 1130: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1131: return;
! 1132: }
! 1133:
! 1134: if (drapeau == d_vrai)
! 1135: {
! 1136: pthread_mutex_destroy(&((*(*((struct_processus_fils *)
! 1137: (*s_objet).objet)).thread).mutex));
! 1138: free((*((struct_processus_fils *) (*s_objet).objet)).thread);
! 1139: }
! 1140:
! 1141: if (decrementation_atomique(s_objet) > 0)
! 1142: {
! 1143: return;
! 1144: }
! 1145:
! 1146: free((struct_processus_fils *) ((*s_objet).objet));
! 1147: break;
! 1148: }
! 1149:
! 1150: case REL :
! 1151: {
! 1152: if (decrementation_atomique(s_objet) > 0)
! 1153: {
! 1154: return;
! 1155: }
! 1156:
! 1157: if ((*s_etat_processus).pointeur_rel < TAILLE_CACHE)
! 1158: {
! 1159: (*s_etat_processus).objets_rel
! 1160: [(*s_etat_processus).pointeur_rel++] = (*s_objet).objet;
! 1161: }
! 1162: else
! 1163: {
! 1164: free((real8 *) ((*s_objet).objet));
! 1165: }
! 1166:
! 1167: break;
! 1168: }
! 1169:
! 1170: case RPN :
! 1171: {
! 1172: l_element_courant = (struct_liste_chainee *) ((*s_objet).objet);
! 1173:
! 1174: if (decrementation_atomique(s_objet) > 0)
! 1175: { // Il reste un pointeur sur l'objet.
! 1176: while(l_element_courant != NULL)
! 1177: {
! 1178: BUG((*(*l_element_courant).donnee).nombre_occurrences <= 1,
! 1179: pthread_mutex_unlock(&((*s_objet).mutex)),
! 1180: printf("(*(*l_element_courant).donnee)"
! 1181: ".nombre_occurrences=%ld\n",
! 1182: (*(*l_element_courant).donnee).nombre_occurrences));
! 1183:
! 1184: liberation(s_etat_processus, (*l_element_courant).donnee);
! 1185: l_element_courant = (*l_element_courant).suivant;
! 1186: }
! 1187:
! 1188: return;
! 1189: }
! 1190: else
! 1191: { // Il ne reste plus aucun pointeur sur l'objet.
! 1192: while(l_element_courant != NULL)
! 1193: {
! 1194: l_element_suivant = (*l_element_courant).suivant;
! 1195: liberation(s_etat_processus, (*l_element_courant).donnee);
! 1196: liberation_maillon(s_etat_processus, l_element_courant);
! 1197: l_element_courant = l_element_suivant;
! 1198: }
! 1199: }
! 1200:
! 1201: break;
! 1202: }
! 1203:
! 1204: case SCK :
! 1205: {
! 1206: if (decrementation_atomique(s_objet) > 0)
! 1207: {
! 1208: return;
! 1209: }
! 1210:
! 1211: liberation(s_etat_processus, (*((struct_socket *)
! 1212: (*s_objet).objet)).format);
! 1213: free((unsigned char *) (*((struct_socket *) (*s_objet).objet))
! 1214: .adresse);
! 1215: free((unsigned char *) (*((struct_socket *) (*s_objet).objet))
! 1216: .adresse_distante);
! 1217: free((struct_socket *) ((*s_objet).objet));
! 1218: break;
! 1219: }
! 1220:
! 1221: case SLB :
! 1222: {
! 1223: if (decrementation_atomique(s_objet) > 0)
! 1224: {
! 1225: return;
! 1226: }
! 1227:
! 1228: free((*((struct_bibliotheque *) (*s_objet).objet)).nom);
! 1229: free((struct_bibliotheque *) (*s_objet).objet);
! 1230: break;
! 1231: }
! 1232:
! 1233: case SPH :
! 1234: {
! 1235: if (decrementation_atomique(s_objet) > 0)
! 1236: {
! 1237: return;
! 1238: }
! 1239:
! 1240: free((*((struct_semaphore *) (*s_objet).objet)).nom);
! 1241: free((struct_bibliotheque *) (*s_objet).objet);
! 1242: break;
! 1243: }
! 1244:
! 1245: case SQL :
! 1246: {
! 1247: if (decrementation_atomique(s_objet) > 0)
! 1248: {
! 1249: return;
! 1250: }
! 1251:
! 1252: free((*((struct_connecteur_sql *) (*s_objet).objet)).type);
! 1253: free((*((struct_connecteur_sql *) (*s_objet).objet)).locale);
! 1254: free((struct_connecteur_sql *) (*s_objet).objet);
! 1255: break;
! 1256: }
! 1257:
! 1258: case TBL :
! 1259: {
! 1260: if (decrementation_atomique(s_objet) > 0)
! 1261: {
! 1262: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
! 1263: .nombre_elements; i++)
! 1264: {
! 1265: BUG((*((*((struct_tableau *)
! 1266: (*s_objet).objet)).elements[i]))
! 1267: .nombre_occurrences <= 1,
! 1268: pthread_mutex_unlock(&((*s_objet).mutex)),
! 1269: printf("(*((*((struct_tableau *) (*s_objet).objet))"
! 1270: ".element[%lu])).nombre_occurrences=%ld\n", i,
! 1271: (*((*((struct_tableau *) (*s_objet).objet))
! 1272: .elements[i])).nombre_occurrences));
! 1273: liberation(s_etat_processus, (*((struct_tableau *)
! 1274: (*s_objet).objet)).elements[i]);
! 1275: }
! 1276:
! 1277: return;
! 1278: }
! 1279:
! 1280: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
! 1281: .nombre_elements; i++)
! 1282: {
! 1283: liberation(s_etat_processus, (*((struct_tableau *)
! 1284: (*s_objet).objet)).elements[i]);
! 1285: }
! 1286:
! 1287: free((*((struct_tableau *) (*s_objet).objet)).elements);
! 1288:
! 1289: if ((*s_etat_processus).pointeur_tab < TAILLE_CACHE)
! 1290: {
! 1291: (*s_etat_processus).objets_tab
! 1292: [(*s_etat_processus).pointeur_tab++] = (*s_objet).objet;
! 1293: }
! 1294: else
! 1295: {
! 1296: free((struct_tableau *) (*s_objet).objet);
! 1297: }
! 1298:
! 1299: break;
! 1300: }
! 1301:
! 1302: case VIN :
! 1303: {
! 1304: if (decrementation_atomique(s_objet) > 0)
! 1305: {
! 1306: return;
! 1307: }
! 1308:
! 1309: free((integer8 *) (*((struct_vecteur *) (*s_objet).objet)).tableau);
! 1310:
! 1311: if ((*s_etat_processus).pointeur_vec < TAILLE_CACHE)
! 1312: {
! 1313: (*s_etat_processus).objets_vec
! 1314: [(*s_etat_processus).pointeur_vec++] = (*s_objet).objet;
! 1315: }
! 1316: else
! 1317: {
! 1318: free((struct_vecteur *) (*s_objet).objet);
! 1319: }
! 1320:
! 1321: break;
! 1322: }
! 1323:
! 1324: case VCX :
! 1325: {
! 1326: if (decrementation_atomique(s_objet) > 0)
! 1327: {
! 1328: return;
! 1329: }
! 1330:
! 1331: free((struct_complexe16 *) (*((struct_vecteur *)
! 1332: (*s_objet).objet)).tableau);
! 1333:
! 1334: if ((*s_etat_processus).pointeur_vec < TAILLE_CACHE)
! 1335: {
! 1336: (*s_etat_processus).objets_vec
! 1337: [(*s_etat_processus).pointeur_vec++] = (*s_objet).objet;
! 1338: }
! 1339: else
! 1340: {
! 1341: free((struct_vecteur *) (*s_objet).objet);
! 1342: }
! 1343:
! 1344: break;
! 1345: }
! 1346:
! 1347: case VRL :
! 1348: {
! 1349: if (decrementation_atomique(s_objet) > 0)
! 1350: {
! 1351: return;
! 1352: }
! 1353:
! 1354: free((real8 *) (*((struct_vecteur *) (*s_objet).objet)).tableau);
! 1355:
! 1356: if ((*s_etat_processus).pointeur_vec < TAILLE_CACHE)
! 1357: {
! 1358: (*s_etat_processus).objets_vec
! 1359: [(*s_etat_processus).pointeur_vec++] = (*s_objet).objet;
! 1360: }
! 1361: else
! 1362: {
! 1363: free((struct_vecteur *) (*s_objet).objet);
! 1364: }
! 1365:
! 1366: break;
! 1367: }
! 1368:
! 1369: default :
! 1370: {
! 1371: if (pthread_mutex_unlock(&((*s_objet).mutex)) != 0)
! 1372: {
! 1373: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1374: return;
! 1375: }
! 1376:
! 1377: if (pthread_mutex_destroy(&((*s_objet).mutex)) != 0)
! 1378: {
! 1379: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1380: return;
! 1381: }
! 1382:
! 1383: BUG(1, printf("Free failure (type %d)\n", (*s_objet).type));
! 1384: return;
! 1385: }
! 1386: }
! 1387:
! 1388: #undef return
! 1389:
! 1390: if (pthread_mutex_unlock(&((*s_objet).mutex)) != 0)
! 1391: {
! 1392: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1393: return;
! 1394: }
! 1395:
! 1396: if (s_etat_processus != NULL)
! 1397: {
! 1398: if ((*s_etat_processus).taille_pile_objets < TAILLE_CACHE)
! 1399: {
! 1400: (*s_objet).objet = (*s_etat_processus).pile_objets;
! 1401: (*s_etat_processus).pile_objets = s_objet;
! 1402: (*s_etat_processus).taille_pile_objets++;
! 1403: }
! 1404: else
! 1405: {
! 1406: if (pthread_mutex_destroy(&((*s_objet).mutex)) != 0)
! 1407: {
! 1408: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1409: return;
! 1410: }
! 1411:
! 1412: free(s_objet);
! 1413: }
! 1414: }
! 1415: else
! 1416: {
! 1417: free(s_objet);
! 1418: }
! 1419:
! 1420: return;
! 1421: }
! 1422:
! 1423:
! 1424: /*
! 1425: ================================================================================
! 1426: Routine de copie d'une structure *s_objet
! 1427: ================================================================================
! 1428: Entrées : structure *s_objet à copier
! 1429: type :
! 1430: 'P' : renvoie le même objet en incrémentant le nombre
! 1431: d'occurrence de chaque objet élémentaire ;
! 1432: 'O' : crée un nouvel objet en copiant chaque objet élémentaire ;
! 1433: 'N' : crée un nouvel objet mais les objets élémentaires
! 1434: sont réutilisés (voir 'P'). Dans le cas d'un objet
! 1435: élémentaire, 'N' et 'P' sont identiques.
! 1436: 'Q' : 'P' si nombre_occurrences vaut 1, 'O' sinon.
! 1437: 'R' : 'P' si nombre_occurrences vaut 1, 'N' sinon.
! 1438: --------------------------------------------------------------------------------
! 1439: Sorties : structure identique (tous les objets sont copiés)
! 1440: --------------------------------------------------------------------------------
! 1441: Effets de bord : néant
! 1442: ================================================================================
! 1443: */
! 1444:
! 1445: struct_objet *
! 1446: copie_objet(struct_processus *s_etat_processus,
! 1447: struct_objet *s_objet, unsigned char type)
! 1448: {
! 1449: struct_liste_chainee *l_element_base;
! 1450: struct_liste_chainee *l_element_courant;
! 1451: struct_liste_chainee *l_element_courant_ecriture;
! 1452: struct_liste_chainee *l_element_courant_lecture;
! 1453: struct_liste_chainee *l_element_suivant_ecriture;
! 1454: struct_liste_chainee *l_element_suivant_lecture;
! 1455:
! 1456: struct_objet *s_nouvel_objet;
! 1457: struct_objet *s_objet_tampon;
! 1458:
! 1459: unsigned long i;
! 1460: unsigned long j;
! 1461:
! 1462: if (pthread_mutex_lock(&((*s_objet).mutex)) != 0)
! 1463: {
! 1464: (*s_etat_processus).erreur_systeme = d_es_processus;
! 1465: return(NULL);
! 1466: }
! 1467:
! 1468: if (type == 'Q')
! 1469: {
! 1470: if ((*s_objet).nombre_occurrences == 1)
! 1471: {
! 1472: type = 'P';
! 1473: }
! 1474: else
! 1475: {
! 1476: type = 'O';
! 1477: }
! 1478: }
! 1479: else if (type == 'R')
! 1480: {
! 1481: if ((*s_objet).nombre_occurrences == 1)
! 1482: {
! 1483: type = 'P';
! 1484: }
! 1485: else
! 1486: {
! 1487: type = 'N';
! 1488: }
! 1489: }
! 1490:
! 1491: #define return(pointeur) \
! 1492: if (pthread_mutex_unlock(&((*s_objet).mutex))) \
! 1493: { (*s_etat_processus).erreur_systeme = d_es_processus; return(NULL); } \
! 1494: return(pointeur)
! 1495:
! 1496: switch((*s_objet).type)
! 1497: {
! 1498: case ADR :
! 1499: {
! 1500: if (type != 'O')
! 1501: {
! 1502: incrementation_atomique(s_objet);
! 1503: return(s_objet);
! 1504: }
! 1505:
! 1506: if ((s_nouvel_objet = allocation(s_etat_processus, ADR)) == NULL)
! 1507: {
! 1508: return(NULL);
! 1509: }
! 1510:
! 1511: (*((unsigned long *) ((*s_nouvel_objet).objet))) =
! 1512: (*((unsigned long *) ((*s_objet).objet)));
! 1513: break;
! 1514: }
! 1515:
! 1516: case ALG :
! 1517: {
! 1518: if (type != 'P')
! 1519: {
! 1520: if ((s_nouvel_objet = allocation(s_etat_processus, ALG))
! 1521: == NULL)
! 1522: {
! 1523: return(NULL);
! 1524: }
! 1525:
! 1526: l_element_courant_lecture = (struct_liste_chainee *)
! 1527: ((*s_objet).objet);
! 1528:
! 1529: l_element_base = NULL;
! 1530: l_element_courant_ecriture = l_element_base;
! 1531:
! 1532: while(l_element_courant_lecture != NULL)
! 1533: {
! 1534: s_objet_tampon = copie_objet(s_etat_processus,
! 1535: (*l_element_courant_lecture).donnee, type);
! 1536: l_element_suivant_ecriture = (struct_liste_chainee *)
! 1537: malloc(sizeof(struct_liste_chainee));
! 1538:
! 1539: if ((s_objet_tampon == NULL) ||
! 1540: (l_element_suivant_ecriture == NULL))
! 1541: {
! 1542: l_element_courant_lecture = (struct_liste_chainee *)
! 1543: ((*s_nouvel_objet).objet);
! 1544:
! 1545: while(l_element_courant_lecture != NULL)
! 1546: {
! 1547: l_element_suivant_lecture =
! 1548: (*l_element_courant_lecture).suivant;
! 1549: liberation(s_etat_processus,
! 1550: (*l_element_courant_lecture).donnee);
! 1551: free(l_element_courant_lecture);
! 1552: l_element_courant_lecture =
! 1553: l_element_suivant_lecture;
! 1554: }
! 1555:
! 1556: return(NULL);
! 1557: }
! 1558:
! 1559: if (l_element_courant_ecriture == NULL)
! 1560: {
! 1561: l_element_base = l_element_suivant_ecriture;
! 1562: }
! 1563: else
! 1564: {
! 1565: (*l_element_courant_ecriture).suivant =
! 1566: l_element_suivant_ecriture;
! 1567: }
! 1568:
! 1569: l_element_courant_ecriture = l_element_suivant_ecriture;
! 1570:
! 1571: (*l_element_courant_ecriture).donnee = s_objet_tampon;
! 1572: (*l_element_courant_ecriture).suivant = NULL;
! 1573: l_element_courant_lecture =
! 1574: (*l_element_courant_lecture).suivant;
! 1575: }
! 1576:
! 1577: (*s_nouvel_objet).objet = (void *) ((struct_liste_chainee *)
! 1578: l_element_base);
! 1579: }
! 1580: else // type == 'P'
! 1581: {
! 1582: incrementation_atomique(s_objet);
! 1583: l_element_courant = (*s_objet).objet;
! 1584:
! 1585: while(l_element_courant != NULL)
! 1586: {
! 1587: (*l_element_courant).donnee = copie_objet(s_etat_processus,
! 1588: (*l_element_courant).donnee, 'P');
! 1589: l_element_courant = (*l_element_courant).suivant;
! 1590: }
! 1591:
! 1592: return(s_objet);
! 1593: }
! 1594:
! 1595: break;
! 1596: }
! 1597:
! 1598: case BIN :
! 1599: {
! 1600: if (type != 'O')
! 1601: {
! 1602: incrementation_atomique(s_objet);
! 1603: return(s_objet);
! 1604: }
! 1605:
! 1606: if ((s_nouvel_objet = allocation(s_etat_processus, BIN)) == NULL)
! 1607: {
! 1608: return(NULL);
! 1609: }
! 1610:
! 1611: (*((logical8 *) ((*s_nouvel_objet).objet))) =
! 1612: (*((logical8 *) ((*s_objet).objet)));
! 1613: break;
! 1614: }
! 1615:
! 1616: case CHN :
! 1617: {
! 1618: if (type != 'O')
! 1619: {
! 1620: incrementation_atomique(s_objet);
! 1621: return(s_objet);
! 1622: }
! 1623:
! 1624: if ((s_nouvel_objet = allocation(s_etat_processus, CHN)) == NULL)
! 1625: {
! 1626: return(NULL);
! 1627: }
! 1628:
! 1629: (*s_nouvel_objet).objet = (void *) ((unsigned char *)
! 1630: malloc((strlen((unsigned char *) ((*s_objet).objet)) + 1)
! 1631: * sizeof(unsigned char)));
! 1632:
! 1633: if ((*s_nouvel_objet).objet == NULL)
! 1634: {
! 1635: free(s_nouvel_objet);
! 1636: return(NULL);
! 1637: }
! 1638:
! 1639: strcpy((unsigned char *) ((*s_nouvel_objet).objet),
! 1640: (unsigned char *) ((*s_objet).objet));
! 1641: break;
! 1642: }
! 1643:
! 1644: case CPL :
! 1645: {
! 1646: if (type != 'O')
! 1647: {
! 1648: incrementation_atomique(s_objet);
! 1649: return(s_objet);
! 1650: }
! 1651:
! 1652: if ((s_nouvel_objet = allocation(s_etat_processus, CPL)) == NULL)
! 1653: {
! 1654: return(NULL);
! 1655: }
! 1656:
! 1657: (*((struct_complexe16 *) ((*s_nouvel_objet).objet))) =
! 1658: (*((struct_complexe16 *) ((*s_objet).objet)));
! 1659: break;
! 1660: }
! 1661:
! 1662: case RPN :
! 1663: {
! 1664: if (type != 'P')
! 1665: {
! 1666: if ((s_nouvel_objet = allocation(s_etat_processus, RPN))
! 1667: == NULL)
! 1668: {
! 1669: return(NULL);
! 1670: }
! 1671:
! 1672: l_element_courant_lecture = (struct_liste_chainee *)
! 1673: ((*s_objet).objet);
! 1674:
! 1675: l_element_base = NULL;
! 1676: l_element_courant_ecriture = l_element_base;
! 1677:
! 1678: while(l_element_courant_lecture != NULL)
! 1679: {
! 1680: s_objet_tampon = copie_objet(s_etat_processus,
! 1681: (*l_element_courant_lecture).donnee, type);
! 1682: l_element_suivant_ecriture = (struct_liste_chainee *)
! 1683: malloc(sizeof(struct_liste_chainee));
! 1684:
! 1685: if ((s_objet_tampon == NULL) ||
! 1686: (l_element_suivant_ecriture == NULL))
! 1687: {
! 1688: l_element_courant_lecture = (struct_liste_chainee *)
! 1689: ((*s_nouvel_objet).objet);
! 1690:
! 1691: while(l_element_courant_lecture != NULL)
! 1692: {
! 1693: l_element_suivant_lecture =
! 1694: (*l_element_courant_lecture).suivant;
! 1695: liberation(s_etat_processus,
! 1696: (*l_element_courant_lecture).donnee);
! 1697: free(l_element_courant_lecture);
! 1698: l_element_courant_lecture =
! 1699: l_element_suivant_lecture;
! 1700: }
! 1701:
! 1702: return(NULL);
! 1703: }
! 1704:
! 1705: if (l_element_courant_ecriture == NULL)
! 1706: {
! 1707: l_element_base = l_element_suivant_ecriture;
! 1708: }
! 1709: else
! 1710: {
! 1711: (*l_element_courant_ecriture).suivant =
! 1712: l_element_suivant_ecriture;
! 1713: }
! 1714:
! 1715: l_element_courant_ecriture = l_element_suivant_ecriture;
! 1716:
! 1717: (*l_element_courant_ecriture).donnee = s_objet_tampon;
! 1718: (*l_element_courant_ecriture).suivant = NULL;
! 1719: l_element_courant_lecture =
! 1720: (*l_element_courant_lecture).suivant;
! 1721: }
! 1722:
! 1723: (*s_nouvel_objet).objet = (void *) ((struct_liste_chainee *)
! 1724: l_element_base);
! 1725: }
! 1726: else // type == 'P'
! 1727: {
! 1728: incrementation_atomique(s_objet);
! 1729: l_element_courant = (*s_objet).objet;
! 1730:
! 1731: while(l_element_courant != NULL)
! 1732: {
! 1733: (*l_element_courant).donnee = copie_objet(s_etat_processus,
! 1734: (*l_element_courant).donnee, 'P');
! 1735: l_element_courant = (*l_element_courant).suivant;
! 1736: }
! 1737:
! 1738: return(s_objet);
! 1739: }
! 1740:
! 1741: break;
! 1742: }
! 1743:
! 1744: case FCH :
! 1745: {
! 1746: if (type == 'P')
! 1747: {
! 1748: incrementation_atomique(s_objet);
! 1749: return(s_objet);
! 1750: }
! 1751:
! 1752: if ((s_nouvel_objet = allocation(s_etat_processus, FCH)) == NULL)
! 1753: {
! 1754: return(NULL);
! 1755: }
! 1756:
! 1757: (*((struct_fichier *) ((*s_nouvel_objet).objet))).descripteur =
! 1758: (*((struct_fichier *) ((*s_objet).objet))).descripteur;
! 1759: (*((struct_fichier *) ((*s_nouvel_objet).objet))).acces =
! 1760: (*((struct_fichier *) ((*s_objet).objet))).acces;
! 1761: (*((struct_fichier *) ((*s_nouvel_objet).objet))).binaire =
! 1762: (*((struct_fichier *) ((*s_objet).objet))).binaire;
! 1763: (*((struct_fichier *) ((*s_nouvel_objet).objet))).ouverture =
! 1764: (*((struct_fichier *) ((*s_objet).objet))).ouverture;
! 1765: (*((struct_fichier *) ((*s_nouvel_objet).objet))).protection =
! 1766: (*((struct_fichier *) ((*s_objet).objet))).protection;
! 1767: (*((struct_fichier *) ((*s_nouvel_objet).objet)))
! 1768: .position_clef = (*((struct_fichier *)
! 1769: ((*s_objet).objet))).position_clef;
! 1770: (*((struct_fichier *) ((*s_nouvel_objet).objet))).pid =
! 1771: (*((struct_fichier *) ((*s_objet).objet))).pid;
! 1772: (*((struct_fichier *) ((*s_nouvel_objet).objet))).tid =
! 1773: (*((struct_fichier *) ((*s_objet).objet))).tid;
! 1774:
! 1775: if (((*((struct_fichier *) ((*s_nouvel_objet).objet))).format =
! 1776: copie_objet(s_etat_processus, (*((struct_fichier *)
! 1777: ((*s_objet).objet))).format, type)) == NULL)
! 1778: {
! 1779: free((*s_nouvel_objet).objet);
! 1780: free(s_nouvel_objet);
! 1781: return(NULL);
! 1782: }
! 1783:
! 1784: if (((*((struct_fichier *) ((*s_nouvel_objet).objet))).nom =
! 1785: (unsigned char *) malloc((strlen((*((struct_fichier *)
! 1786: ((*s_objet).objet))).nom) + 1) * sizeof(unsigned char)))
! 1787: == NULL)
! 1788: {
! 1789: liberation(s_etat_processus, (*((struct_fichier *)
! 1790: (*s_nouvel_objet).objet)).format);
! 1791: free((*s_nouvel_objet).objet);
! 1792: free(s_nouvel_objet);
! 1793: return(NULL);
! 1794: }
! 1795:
! 1796: strcpy((*((struct_fichier *) ((*s_nouvel_objet).objet))).nom,
! 1797: (*((struct_fichier *) ((*s_objet).objet))).nom);
! 1798: break;
! 1799: }
! 1800:
! 1801: case FCT :
! 1802: {
! 1803: if (type != 'O')
! 1804: {
! 1805: /*
! 1806: * Remise à zéro de la prédiction pour respecter la cohérence
! 1807: * du saut dans les cas EXSUB et OBSUB.
! 1808: */
! 1809:
! 1810: (*((struct_fonction *) ((*s_objet).objet)))
! 1811: .prediction_saut = NULL;
! 1812: incrementation_atomique(s_objet);
! 1813: return(s_objet);
! 1814: }
! 1815:
! 1816: if ((s_nouvel_objet = allocation(s_etat_processus, FCT)) == NULL)
! 1817: {
! 1818: return(NULL);
! 1819: }
! 1820:
! 1821: if (((*((struct_fonction *) ((*s_nouvel_objet).objet)))
! 1822: .nom_fonction = (unsigned char *)
! 1823: malloc((strlen((*((struct_fonction *)
! 1824: ((*s_objet).objet))).nom_fonction) + 1) *
! 1825: sizeof(unsigned char))) == NULL)
! 1826: {
! 1827: free(s_nouvel_objet);
! 1828: return(NULL);
! 1829: }
! 1830:
! 1831: strcpy((unsigned char *) (*((struct_fonction *)
! 1832: ((*s_nouvel_objet).objet))).nom_fonction,
! 1833: (unsigned char *) (*((struct_fonction *)
! 1834: ((*s_objet).objet))).nom_fonction);
! 1835: (*((struct_fonction *) ((*s_nouvel_objet).objet)))
! 1836: .nombre_arguments = (*((struct_fonction *)
! 1837: ((*s_objet).objet))).nombre_arguments;
! 1838: (*((struct_fonction *) ((*s_nouvel_objet).objet))).fonction =
! 1839: (*((struct_fonction *) ((*s_objet).objet))).fonction;
! 1840: break;
! 1841: }
! 1842:
! 1843: case INT :
! 1844: {
! 1845: if (type != 'O')
! 1846: {
! 1847: incrementation_atomique(s_objet);
! 1848: return(s_objet);
! 1849: }
! 1850:
! 1851: if ((s_nouvel_objet = allocation(s_etat_processus, INT)) == NULL)
! 1852: {
! 1853: return(NULL);
! 1854: }
! 1855:
! 1856: (*((integer8 *) ((*s_nouvel_objet).objet))) =
! 1857: (*((integer8 *) ((*s_objet).objet)));
! 1858: break;
! 1859: }
! 1860:
! 1861: case LST :
! 1862: {
! 1863: if (type != 'P')
! 1864: {
! 1865: if ((s_nouvel_objet = allocation(s_etat_processus, LST))
! 1866: == NULL)
! 1867: {
! 1868: return(NULL);
! 1869: }
! 1870:
! 1871: l_element_courant_lecture = (struct_liste_chainee *)
! 1872: ((*s_objet).objet);
! 1873:
! 1874: l_element_base = NULL;
! 1875: l_element_courant_ecriture = l_element_base;
! 1876:
! 1877: while(l_element_courant_lecture != NULL)
! 1878: {
! 1879: s_objet_tampon = copie_objet(s_etat_processus,
! 1880: (*l_element_courant_lecture).donnee, type);
! 1881: l_element_suivant_ecriture = (struct_liste_chainee *)
! 1882: malloc(sizeof(struct_liste_chainee));
! 1883:
! 1884: if ((s_objet_tampon == NULL) ||
! 1885: (l_element_suivant_ecriture == NULL))
! 1886: {
! 1887: l_element_courant_lecture = (struct_liste_chainee *)
! 1888: ((*s_nouvel_objet).objet);
! 1889:
! 1890: while(l_element_courant_lecture != NULL)
! 1891: {
! 1892: l_element_suivant_lecture =
! 1893: (*l_element_courant_lecture).suivant;
! 1894: liberation(s_etat_processus,
! 1895: (*l_element_courant_lecture).donnee);
! 1896: free(l_element_courant_lecture);
! 1897: l_element_courant_lecture =
! 1898: l_element_suivant_lecture;
! 1899: }
! 1900:
! 1901: return(NULL);
! 1902: }
! 1903:
! 1904: if (l_element_courant_ecriture == NULL)
! 1905: {
! 1906: l_element_base = l_element_suivant_ecriture;
! 1907: }
! 1908: else
! 1909: {
! 1910: (*l_element_courant_ecriture).suivant =
! 1911: l_element_suivant_ecriture;
! 1912: }
! 1913:
! 1914: l_element_courant_ecriture = l_element_suivant_ecriture;
! 1915:
! 1916: (*l_element_courant_ecriture).donnee = s_objet_tampon;
! 1917: (*l_element_courant_ecriture).suivant = NULL;
! 1918: l_element_courant_lecture =
! 1919: (*l_element_courant_lecture).suivant;
! 1920: }
! 1921:
! 1922: (*s_nouvel_objet).objet = (void *) ((struct_liste_chainee *)
! 1923: l_element_base);
! 1924: }
! 1925: else
! 1926: {
! 1927: incrementation_atomique(s_objet);
! 1928: l_element_courant = (*s_objet).objet;
! 1929:
! 1930: while(l_element_courant != NULL)
! 1931: {
! 1932: (*l_element_courant).donnee = copie_objet(s_etat_processus,
! 1933: (*l_element_courant).donnee, 'P');
! 1934: l_element_courant = (*l_element_courant).suivant;
! 1935: }
! 1936:
! 1937: return(s_objet);
! 1938: }
! 1939:
! 1940: break;
! 1941: }
! 1942:
! 1943: case MIN :
! 1944: {
! 1945: if (type != 'O')
! 1946: {
! 1947: incrementation_atomique(s_objet);
! 1948: return(s_objet);
! 1949: }
! 1950:
! 1951: if ((s_nouvel_objet = allocation(s_etat_processus, MIN)) == NULL)
! 1952: {
! 1953: return(NULL);
! 1954: }
! 1955:
! 1956: (*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau =
! 1957: (void **) ((integer8 **) malloc(
! 1958: ((*((struct_matrice *) ((*s_objet).objet))).nombre_lignes)
! 1959: * sizeof(integer8 *)));
! 1960:
! 1961: if ((*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau
! 1962: == NULL)
! 1963: {
! 1964: free((*s_nouvel_objet).objet);
! 1965: free(s_nouvel_objet);
! 1966: return(NULL);
! 1967: }
! 1968:
! 1969: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_colonnes =
! 1970: (*((struct_matrice *) ((*s_objet).objet))).nombre_colonnes;
! 1971: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_lignes =
! 1972: (*((struct_matrice *) ((*s_objet).objet))).nombre_lignes;
! 1973: (*((struct_matrice *) ((*s_nouvel_objet).objet))).type =
! 1974: (*((struct_matrice *) ((*s_objet).objet))).type;
! 1975:
! 1976: for(i = 0; i < (*((struct_matrice *)
! 1977: ((*s_objet).objet))).nombre_lignes; i++)
! 1978: {
! 1979: if ((((integer8 **) ((*((struct_matrice *)
! 1980: ((*s_nouvel_objet).objet))).tableau))[i] =
! 1981: (void *) ((integer8 *) malloc(
! 1982: ((*((struct_matrice *) ((*s_objet).objet)))
! 1983: .nombre_colonnes) * sizeof(integer8)))) == NULL)
! 1984: {
! 1985: for(j = 0; j < i; j++)
! 1986: {
! 1987: free(((integer8 **) ((*((struct_matrice *)
! 1988: ((*s_nouvel_objet).objet))).tableau))[j]);
! 1989: }
! 1990:
! 1991: free((*s_nouvel_objet).objet);
! 1992: free(s_nouvel_objet);
! 1993: return(NULL);
! 1994: }
! 1995:
! 1996: for(j = 0; j < (*((struct_matrice *)
! 1997: ((*s_objet).objet))).nombre_colonnes; j++)
! 1998: {
! 1999: ((integer8 **) ((*((struct_matrice *)
! 2000: ((*s_nouvel_objet).objet))).tableau))[i][j] =
! 2001: ((integer8 **) ((*((struct_matrice *)
! 2002: ((*s_objet).objet))).tableau))[i][j];
! 2003: }
! 2004: }
! 2005:
! 2006: break;
! 2007: }
! 2008:
! 2009: case MCX :
! 2010: {
! 2011: if (type != 'O')
! 2012: {
! 2013: incrementation_atomique(s_objet);
! 2014: return(s_objet);
! 2015: }
! 2016:
! 2017: if ((s_nouvel_objet = allocation(s_etat_processus, MCX))
! 2018: == NULL)
! 2019: {
! 2020: return(NULL);
! 2021: }
! 2022:
! 2023: (*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau =
! 2024: (void **) ((struct_complexe16 **) malloc(
! 2025: ((*((struct_matrice *) ((*s_objet).objet))).nombre_lignes)
! 2026: * sizeof(struct_complexe16 *)));
! 2027:
! 2028: if ((*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau
! 2029: == NULL)
! 2030: {
! 2031: free((*s_nouvel_objet).objet);
! 2032: free(s_nouvel_objet);
! 2033: return(NULL);
! 2034: }
! 2035:
! 2036: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_colonnes =
! 2037: (*((struct_matrice *) ((*s_objet).objet))).nombre_colonnes;
! 2038: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_lignes =
! 2039: (*((struct_matrice *) ((*s_objet).objet))).nombre_lignes;
! 2040: (*((struct_matrice *) ((*s_nouvel_objet).objet))).type =
! 2041: (*((struct_matrice *) ((*s_objet).objet))).type;
! 2042:
! 2043: for(i = 0; i < (*((struct_matrice *)
! 2044: ((*s_objet).objet))).nombre_lignes; i++)
! 2045: {
! 2046: if ((((struct_complexe16 **) ((*((struct_matrice *)
! 2047: ((*s_nouvel_objet).objet))).tableau))[i] =
! 2048: (void *) ((struct_complexe16 *) malloc(
! 2049: ((*((struct_matrice *) ((*s_objet).objet)))
! 2050: .nombre_colonnes) * sizeof(struct_complexe16))))
! 2051: == NULL)
! 2052: {
! 2053: for(j = 0; j < i; j++)
! 2054: {
! 2055: free(((struct_complexe16 **) ((*((struct_matrice *)
! 2056: ((*s_nouvel_objet).objet))).tableau))[j]);
! 2057: }
! 2058:
! 2059: free((*s_nouvel_objet).objet);
! 2060: free(s_nouvel_objet);
! 2061: return(NULL);
! 2062: }
! 2063:
! 2064: for(j = 0; j < (*((struct_matrice *)
! 2065: ((*s_objet).objet))).nombre_colonnes; j++)
! 2066: {
! 2067: ((struct_complexe16 **) ((*((struct_matrice *)
! 2068: ((*s_nouvel_objet).objet))).tableau))[i][j] =
! 2069: ((struct_complexe16 **) ((*((struct_matrice *)
! 2070: ((*s_objet).objet))).tableau))[i][j];
! 2071: }
! 2072: }
! 2073:
! 2074: break;
! 2075: }
! 2076:
! 2077: case MRL :
! 2078: {
! 2079: if (type != 'O')
! 2080: {
! 2081: incrementation_atomique(s_objet);
! 2082: return(s_objet);
! 2083: }
! 2084:
! 2085: if ((s_nouvel_objet = allocation(s_etat_processus, MRL)) == NULL)
! 2086: {
! 2087: return(NULL);
! 2088: }
! 2089:
! 2090: (*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau =
! 2091: (void **) ((real8 **) malloc(
! 2092: ((*((struct_matrice *) ((*s_objet).objet))).nombre_lignes)
! 2093: * sizeof(real8 *)));
! 2094:
! 2095: if ((*((struct_matrice *) ((*s_nouvel_objet).objet))).tableau
! 2096: == NULL)
! 2097: {
! 2098: free((*s_nouvel_objet).objet);
! 2099: free(s_nouvel_objet);
! 2100: return(NULL);
! 2101: }
! 2102:
! 2103: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_colonnes =
! 2104: (*((struct_matrice *) ((*s_objet).objet))).nombre_colonnes;
! 2105: (*((struct_matrice *) ((*s_nouvel_objet).objet))).nombre_lignes =
! 2106: (*((struct_matrice *) ((*s_objet).objet))).nombre_lignes;
! 2107: (*((struct_matrice *) ((*s_nouvel_objet).objet))).type =
! 2108: (*((struct_matrice *) ((*s_objet).objet))).type;
! 2109:
! 2110: for(i = 0; i < (*((struct_matrice *)
! 2111: ((*s_objet).objet))).nombre_lignes; i++)
! 2112: {
! 2113: if ((((real8 **) ((*((struct_matrice *)
! 2114: ((*s_nouvel_objet).objet))).tableau))[i] =
! 2115: (void *) ((real8 *) malloc(
! 2116: ((*((struct_matrice *) ((*s_objet).objet)))
! 2117: .nombre_colonnes) * sizeof(real8)))) == NULL)
! 2118: {
! 2119: for(j = 0; j < i; j++)
! 2120: {
! 2121: free(((real8 **) ((*((struct_matrice *)
! 2122: ((*s_nouvel_objet).objet))).tableau))[j]);
! 2123: }
! 2124:
! 2125: free((*s_nouvel_objet).objet);
! 2126: free(s_nouvel_objet);
! 2127: return(NULL);
! 2128: }
! 2129:
! 2130: for(j = 0; j < (*((struct_matrice *)
! 2131: ((*s_objet).objet))).nombre_colonnes; j++)
! 2132: {
! 2133: ((real8 **) ((*((struct_matrice *)
! 2134: ((*s_nouvel_objet).objet))).tableau))[i][j] =
! 2135: ((real8 **) ((*((struct_matrice *)
! 2136: ((*s_objet).objet))).tableau))[i][j];
! 2137: }
! 2138: }
! 2139:
! 2140: break;
! 2141: }
! 2142:
! 2143: case MTX :
! 2144: {
! 2145: if (type != 'O')
! 2146: {
! 2147: incrementation_atomique(s_objet);
! 2148: return(s_objet);
! 2149: }
! 2150:
! 2151: if ((s_nouvel_objet = allocation(s_etat_processus, MTX)) == NULL)
! 2152: {
! 2153: return(NULL);
! 2154: }
! 2155:
! 2156: (*((struct_mutex *) ((*s_nouvel_objet).objet))).mutex =
! 2157: (*((struct_mutex *) ((*s_objet).objet))).mutex;
! 2158: break;
! 2159: }
! 2160:
! 2161: case NOM :
! 2162: {
! 2163: if (type != 'O')
! 2164: {
! 2165: incrementation_atomique(s_objet);
! 2166: return(s_objet);
! 2167: }
! 2168:
! 2169: if ((s_nouvel_objet = allocation(s_etat_processus, NOM)) == NULL)
! 2170: {
! 2171: return(NULL);
! 2172: }
! 2173:
! 2174: (*((struct_nom *) (*s_nouvel_objet).objet)).nom = malloc((
! 2175: strlen((*((struct_nom *) (*s_objet).objet)).nom) + 1) *
! 2176: sizeof(unsigned char));
! 2177:
! 2178: if ((*((struct_nom *) (*s_nouvel_objet).objet)).nom == NULL)
! 2179: {
! 2180: free((*s_nouvel_objet).objet);
! 2181: free(s_nouvel_objet);
! 2182: return(NULL);
! 2183: }
! 2184:
! 2185: strcpy((*((struct_nom *) (*s_nouvel_objet).objet)).nom,
! 2186: (*((struct_nom *) (*s_objet).objet)).nom);
! 2187: (*((struct_nom *) (*s_nouvel_objet).objet)).symbole =
! 2188: (*((struct_nom *) (*s_objet).objet)).symbole;
! 2189: break;
! 2190: }
! 2191:
! 2192: case NON :
! 2193: {
! 2194: if (type != 'O')
! 2195: {
! 2196: incrementation_atomique(s_objet);
! 2197: return(s_objet);
! 2198: }
! 2199:
! 2200: if ((s_nouvel_objet = allocation(s_etat_processus, NON)) == NULL)
! 2201: {
! 2202: return(NULL);
! 2203: }
! 2204:
! 2205: (*s_nouvel_objet).objet = NULL;
! 2206: break;
! 2207: }
! 2208:
! 2209: case PRC :
! 2210: {
! 2211: if (pthread_mutex_lock(&((*(*((struct_processus_fils *)
! 2212: (*s_objet).objet)).thread).mutex)) != 0)
! 2213: {
! 2214: return(NULL);
! 2215: }
! 2216:
! 2217: (*(*((struct_processus_fils *) (*s_objet).objet)).thread)
! 2218: .nombre_references++;
! 2219:
! 2220: if (pthread_mutex_unlock(&((*(*((struct_processus_fils *)
! 2221: (*s_objet).objet)).thread).mutex)) != 0)
! 2222: {
! 2223: return(NULL);
! 2224: }
! 2225:
! 2226: if (type != 'O')
! 2227: {
! 2228: incrementation_atomique(s_objet);
! 2229: return(s_objet);
! 2230: }
! 2231:
! 2232: if ((s_nouvel_objet = allocation(s_etat_processus, PRC)) == NULL)
! 2233: {
! 2234: return(NULL);
! 2235: }
! 2236:
! 2237: (*((struct_processus_fils *) (*s_nouvel_objet).objet)) =
! 2238: (*((struct_processus_fils *) (*s_objet).objet));
! 2239: break;
! 2240: }
! 2241:
! 2242: case REL :
! 2243: {
! 2244: if (type != 'O')
! 2245: {
! 2246: incrementation_atomique(s_objet);
! 2247: return(s_objet);
! 2248: }
! 2249:
! 2250: if ((s_nouvel_objet = allocation(s_etat_processus, REL)) == NULL)
! 2251: {
! 2252: return(NULL);
! 2253: }
! 2254:
! 2255: (*((real8 *) ((*s_nouvel_objet).objet))) =
! 2256: (*((real8 *) ((*s_objet).objet)));
! 2257: break;
! 2258: }
! 2259:
! 2260: case SCK :
! 2261: {
! 2262: if (type == 'P')
! 2263: {
! 2264: incrementation_atomique(s_objet);
! 2265: return(s_objet);
! 2266: }
! 2267:
! 2268: if ((s_nouvel_objet = allocation(s_etat_processus, SCK)) == NULL)
! 2269: {
! 2270: return(NULL);
! 2271: }
! 2272:
! 2273: (*((struct_socket *) ((*s_nouvel_objet).objet))).socket =
! 2274: (*((struct_socket *) ((*s_objet).objet))).socket;
! 2275: (*((struct_socket *) ((*s_nouvel_objet).objet))).domaine =
! 2276: (*((struct_socket *) ((*s_objet).objet))).domaine;
! 2277: (*((struct_socket *) ((*s_nouvel_objet).objet))).socket_en_ecoute =
! 2278: (*((struct_socket *) ((*s_objet).objet))).socket_en_ecoute;
! 2279: (*((struct_socket *) ((*s_nouvel_objet).objet))).socket_connectee =
! 2280: (*((struct_socket *) ((*s_objet).objet))).socket_connectee;
! 2281: (*((struct_socket *) ((*s_nouvel_objet).objet))).pid =
! 2282: (*((struct_socket *) ((*s_objet).objet))).pid;
! 2283: (*((struct_socket *) ((*s_nouvel_objet).objet))).binaire =
! 2284: (*((struct_socket *) ((*s_objet).objet))).binaire;
! 2285: (*((struct_socket *) ((*s_nouvel_objet).objet))).effacement =
! 2286: (*((struct_socket *) ((*s_objet).objet))).effacement;
! 2287: (*((struct_socket *) ((*s_nouvel_objet).objet))).protection =
! 2288: (*((struct_socket *) ((*s_objet).objet))).protection;
! 2289: (*((struct_socket *) ((*s_nouvel_objet).objet))).localisation =
! 2290: (*((struct_socket *) ((*s_objet).objet))).localisation;
! 2291: (*((struct_socket *) ((*s_nouvel_objet).objet))).pid =
! 2292: (*((struct_socket *) ((*s_objet).objet))).pid;
! 2293: (*((struct_socket *) ((*s_nouvel_objet).objet))).tid =
! 2294: (*((struct_socket *) ((*s_objet).objet))).tid;
! 2295:
! 2296: if (((*((struct_socket *) ((*s_nouvel_objet).objet))).format =
! 2297: copie_objet(s_etat_processus, (*((struct_socket *)
! 2298: ((*s_objet).objet))).format, type)) == NULL)
! 2299: {
! 2300: free((*s_nouvel_objet).objet);
! 2301: free(s_nouvel_objet);
! 2302: return(NULL);
! 2303: }
! 2304:
! 2305: if (((*((struct_socket *) ((*s_nouvel_objet).objet))).adresse =
! 2306: (unsigned char *) malloc((strlen((*((struct_socket *)
! 2307: ((*s_objet).objet))).adresse) + 1) * sizeof(unsigned char)))
! 2308: == NULL)
! 2309: {
! 2310: liberation(s_etat_processus, (*((struct_fichier *)
! 2311: (*s_nouvel_objet).objet)).format);
! 2312: free((*s_nouvel_objet).objet);
! 2313: free(s_nouvel_objet);
! 2314: return(NULL);
! 2315: }
! 2316:
! 2317: strcpy((*((struct_socket *) ((*s_nouvel_objet).objet)))
! 2318: .adresse, (*((struct_socket *) ((*s_objet).objet)))
! 2319: .adresse);
! 2320:
! 2321: if (((*((struct_socket *) ((*s_nouvel_objet).objet)))
! 2322: .adresse_distante = malloc((strlen((*((struct_socket *)
! 2323: ((*s_objet).objet))).adresse_distante) + 1) *
! 2324: sizeof(unsigned char))) == NULL)
! 2325: {
! 2326: liberation(s_etat_processus, (*((struct_fichier *)
! 2327: (*s_nouvel_objet).objet)).format);
! 2328: free((*s_nouvel_objet).objet);
! 2329: free(s_nouvel_objet);
! 2330: return(NULL);
! 2331: }
! 2332:
! 2333: strcpy((*((struct_socket *) ((*s_nouvel_objet).objet)))
! 2334: .adresse_distante, (*((struct_socket *) ((*s_objet).objet)))
! 2335: .adresse_distante);
! 2336:
! 2337: strcpy((*((struct_socket *) ((*s_nouvel_objet).objet))).type,
! 2338: (*((struct_socket *) ((*s_objet).objet))).type);
! 2339: break;
! 2340: }
! 2341:
! 2342: case SLB :
! 2343: {
! 2344: if (type != 'O')
! 2345: {
! 2346: incrementation_atomique(s_objet);
! 2347: return(s_objet);
! 2348: }
! 2349:
! 2350: if ((s_nouvel_objet = allocation(s_etat_processus, SLB)) == NULL)
! 2351: {
! 2352: return(NULL);
! 2353: }
! 2354:
! 2355: if (((*((struct_bibliotheque *) ((*s_nouvel_objet).objet))).nom =
! 2356: (unsigned char *) malloc((strlen((*((struct_bibliotheque *)
! 2357: ((*s_objet).objet))).nom) + 1) * sizeof(unsigned char)))
! 2358: == NULL)
! 2359: {
! 2360: free((*s_nouvel_objet).objet);
! 2361: free(s_nouvel_objet);
! 2362: return(NULL);
! 2363: }
! 2364:
! 2365: strcpy((*((struct_bibliotheque *) ((*s_nouvel_objet).objet))).nom,
! 2366: (*((struct_bibliotheque *) ((*s_objet).objet))).nom);
! 2367:
! 2368: /*
! 2369: * C'est objet est non modifiable et est un pointeur
! 2370: * sur un objet système. Seul la référence est copiée.
! 2371: */
! 2372:
! 2373: (*((struct_bibliotheque *) (*s_nouvel_objet).objet)).descripteur =
! 2374: (*((struct_bibliotheque *) (*s_objet).objet)).descripteur;
! 2375: (*((struct_bibliotheque *) (*s_nouvel_objet).objet)).pid =
! 2376: (*((struct_bibliotheque *) (*s_objet).objet)).pid;
! 2377: (*((struct_bibliotheque *) (*s_nouvel_objet).objet)).tid =
! 2378: (*((struct_bibliotheque *) (*s_objet).objet)).tid;
! 2379: break;
! 2380: }
! 2381:
! 2382: case SPH :
! 2383: {
! 2384: if (type != 'O')
! 2385: {
! 2386: incrementation_atomique(s_objet);
! 2387: return(s_objet);
! 2388: }
! 2389:
! 2390: if ((s_nouvel_objet = allocation(s_etat_processus, SPH)) == NULL)
! 2391: {
! 2392: return(NULL);
! 2393: }
! 2394:
! 2395: if (((*((struct_semaphore *) (*s_nouvel_objet).objet)).nom =
! 2396: malloc((strlen((*((struct_semaphore *) (*s_objet).objet))
! 2397: .nom) + 1) * sizeof(unsigned char))) == NULL)
! 2398: {
! 2399: free((*s_nouvel_objet).objet);
! 2400: free(s_nouvel_objet);
! 2401: return(NULL);
! 2402: }
! 2403:
! 2404: strcpy((*((struct_semaphore *) (*s_nouvel_objet).objet)).nom,
! 2405: (*((struct_semaphore *) (*s_objet).objet)).nom);
! 2406: break;
! 2407: }
! 2408:
! 2409: case SQL :
! 2410: {
! 2411: if (type != 'O')
! 2412: {
! 2413: incrementation_atomique(s_objet);
! 2414: return(s_objet);
! 2415: }
! 2416:
! 2417: if ((s_nouvel_objet = allocation(s_etat_processus, SQL)) == NULL)
! 2418: {
! 2419: return(NULL);
! 2420: }
! 2421:
! 2422: (*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).pid =
! 2423: (*((struct_connecteur_sql *) (*s_objet).objet)).pid;
! 2424: (*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).tid =
! 2425: (*((struct_connecteur_sql *) (*s_objet).objet)).tid;
! 2426: (*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).descripteur =
! 2427: (*((struct_connecteur_sql *) (*s_objet).objet)).descripteur;
! 2428:
! 2429: if (((*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).type =
! 2430: malloc((strlen((*((struct_connecteur_sql *)
! 2431: (*s_objet).objet)).type) + 1) * sizeof(unsigned char)))
! 2432: == NULL)
! 2433: {
! 2434: free(s_nouvel_objet);
! 2435: return(NULL);
! 2436: }
! 2437:
! 2438: strcpy((*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).type,
! 2439: (*((struct_connecteur_sql *) (*s_objet).objet)).type);
! 2440:
! 2441: if ((*((struct_connecteur_sql *) (*s_objet).objet)).locale != NULL)
! 2442: {
! 2443: if (((*((struct_connecteur_sql *) (*s_nouvel_objet).objet))
! 2444: .locale = malloc((strlen((*((struct_connecteur_sql *)
! 2445: (*s_objet).objet)).locale) + 1) *
! 2446: sizeof(unsigned char))) == NULL)
! 2447: {
! 2448: free((*((struct_connecteur_sql *) (*s_nouvel_objet).objet))
! 2449: .locale);
! 2450: free(s_nouvel_objet);
! 2451: return(NULL);
! 2452: }
! 2453:
! 2454: strcpy((*((struct_connecteur_sql *) (*s_nouvel_objet).objet))
! 2455: .locale, (*((struct_connecteur_sql *)
! 2456: (*s_objet).objet)).locale);
! 2457: }
! 2458: else
! 2459: {
! 2460: (*((struct_connecteur_sql *) (*s_nouvel_objet).objet)).locale
! 2461: = NULL;
! 2462: }
! 2463:
! 2464: break;
! 2465: }
! 2466:
! 2467: case TBL :
! 2468: {
! 2469: if (type != 'P')
! 2470: {
! 2471: if ((s_nouvel_objet = allocation(s_etat_processus, TBL))
! 2472: == NULL)
! 2473: {
! 2474: return(NULL);
! 2475: }
! 2476:
! 2477: (*((struct_tableau *) (*s_nouvel_objet).objet))
! 2478: .nombre_elements = (*((struct_tableau *)
! 2479: (*s_objet).objet)).nombre_elements;
! 2480:
! 2481: if (((*((struct_tableau *) (*s_nouvel_objet).objet)).elements =
! 2482: malloc((*((struct_tableau *) (*s_objet).objet))
! 2483: .nombre_elements * sizeof(struct_objet *))) == NULL)
! 2484: {
! 2485: return(NULL);
! 2486: }
! 2487:
! 2488: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
! 2489: .nombre_elements; i++)
! 2490: {
! 2491: if (((*((struct_tableau *) (*s_nouvel_objet).objet))
! 2492: .elements[i] = copie_objet(s_etat_processus,
! 2493: (*((struct_tableau *) (*s_objet).objet))
! 2494: .elements[i], type)) == NULL)
! 2495: {
! 2496: for(j = 0; j < i; j++)
! 2497: {
! 2498: liberation(s_etat_processus, (*((struct_tableau *)
! 2499: (*s_nouvel_objet).objet)).elements[j]);
! 2500: }
! 2501:
! 2502: free((*((struct_tableau *) (*s_nouvel_objet).objet))
! 2503: .elements);
! 2504: free((*s_nouvel_objet).objet);
! 2505: free(s_nouvel_objet);
! 2506:
! 2507: return(NULL);
! 2508: }
! 2509: }
! 2510: }
! 2511: else
! 2512: {
! 2513: incrementation_atomique(s_objet);
! 2514:
! 2515: for(i = 0; i < (*((struct_tableau *) (*s_objet).objet))
! 2516: .nombre_elements; i++)
! 2517: {
! 2518: (*((struct_tableau *) (*s_objet).objet)).elements[i] =
! 2519: copie_objet(s_etat_processus, (*((struct_tableau *)
! 2520: (*s_objet).objet)).elements[i], 'P');
! 2521: }
! 2522:
! 2523: return(s_objet);
! 2524: }
! 2525:
! 2526: break;
! 2527: }
! 2528:
! 2529: case VIN :
! 2530: {
! 2531: if (type != 'O')
! 2532: {
! 2533: incrementation_atomique(s_objet);
! 2534: return(s_objet);
! 2535: }
! 2536:
! 2537: if ((s_nouvel_objet = allocation(s_etat_processus, VIN)) == NULL)
! 2538: {
! 2539: return(NULL);
! 2540: }
! 2541:
! 2542: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau =
! 2543: (void *) ((integer8 *) malloc(
! 2544: ((*((struct_vecteur *) ((*s_objet).objet))).taille)
! 2545: * sizeof(integer8)));
! 2546:
! 2547: if ((*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau
! 2548: == NULL)
! 2549: {
! 2550: free((*s_nouvel_objet).objet);
! 2551: free(s_nouvel_objet);
! 2552: return(NULL);
! 2553: }
! 2554:
! 2555: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).taille =
! 2556: (*((struct_vecteur *) ((*s_objet).objet))).taille;
! 2557: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).type =
! 2558: (*((struct_vecteur *) ((*s_objet).objet))).type;
! 2559:
! 2560: for(i = 0; i < (*((struct_vecteur *) ((*s_objet).objet))).taille;
! 2561: i++)
! 2562: {
! 2563: ((integer8 *) ((*((struct_vecteur *)
! 2564: ((*s_nouvel_objet).objet))).tableau))[i] =
! 2565: ((integer8 *) ((*((struct_vecteur *)
! 2566: ((*s_objet).objet))).tableau))[i];
! 2567: }
! 2568:
! 2569: break;
! 2570: }
! 2571:
! 2572: case VCX :
! 2573: {
! 2574: if (type != 'O')
! 2575: {
! 2576: incrementation_atomique(s_objet);
! 2577: return(s_objet);
! 2578: }
! 2579:
! 2580: if ((s_nouvel_objet = allocation(s_etat_processus, VCX)) == NULL)
! 2581: {
! 2582: return(NULL);
! 2583: }
! 2584:
! 2585: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau =
! 2586: (void *) ((struct_complexe16 *) malloc(
! 2587: ((*((struct_vecteur *) ((*s_objet).objet))).taille)
! 2588: * sizeof(struct_complexe16)));
! 2589:
! 2590: if ((*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau
! 2591: == NULL)
! 2592: {
! 2593: free((*s_nouvel_objet).objet);
! 2594: free(s_nouvel_objet);
! 2595: return(NULL);
! 2596: }
! 2597:
! 2598: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).taille =
! 2599: (*((struct_vecteur *) ((*s_objet).objet))).taille;
! 2600: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).type =
! 2601: (*((struct_vecteur *) ((*s_objet).objet))).type;
! 2602:
! 2603: for(i = 0; i < (*((struct_vecteur *) ((*s_objet).objet))).taille;
! 2604: i++)
! 2605: {
! 2606: ((struct_complexe16 *) ((*((struct_vecteur *)
! 2607: ((*s_nouvel_objet).objet))).tableau))[i] =
! 2608: ((struct_complexe16 *) ((*((struct_vecteur *)
! 2609: ((*s_objet).objet))).tableau))[i];
! 2610: }
! 2611:
! 2612: break;
! 2613: }
! 2614:
! 2615: case VRL :
! 2616: {
! 2617: if (type != 'O')
! 2618: {
! 2619: incrementation_atomique(s_objet);
! 2620: return(s_objet);
! 2621: }
! 2622:
! 2623: if ((s_nouvel_objet = allocation(s_etat_processus, VRL)) == NULL)
! 2624: {
! 2625: return(NULL);
! 2626: }
! 2627:
! 2628: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau =
! 2629: (void *) ((real8 *) malloc(
! 2630: ((*((struct_vecteur *) ((*s_objet).objet))).taille)
! 2631: * sizeof(real8)));
! 2632:
! 2633: if ((*((struct_vecteur *) ((*s_nouvel_objet).objet))).tableau
! 2634: == NULL)
! 2635: {
! 2636: free((*s_nouvel_objet).objet);
! 2637: free(s_nouvel_objet);
! 2638: return(NULL);
! 2639: }
! 2640:
! 2641: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).taille =
! 2642: (*((struct_vecteur *) ((*s_objet).objet))).taille;
! 2643: (*((struct_vecteur *) ((*s_nouvel_objet).objet))).type =
! 2644: (*((struct_vecteur *) ((*s_objet).objet))).type;
! 2645:
! 2646: for(i = 0; i < (*((struct_vecteur *) ((*s_objet).objet))).taille;
! 2647: i++)
! 2648: {
! 2649: ((real8 *) ((*((struct_vecteur *)
! 2650: ((*s_nouvel_objet).objet))).tableau))[i] =
! 2651: ((real8 *) ((*((struct_vecteur *)
! 2652: ((*s_objet).objet))).tableau))[i];
! 2653: }
! 2654:
! 2655: break;
! 2656: }
! 2657:
! 2658: default :
! 2659: {
! 2660: return(NULL);
! 2661: }
! 2662: }
! 2663:
! 2664: return(s_nouvel_objet);
! 2665:
! 2666: #undef return
! 2667: }
! 2668:
! 2669:
! 2670: /*
! 2671: ================================================================================
! 2672: Routine de copie d'une structure de description d'un processus
! 2673: ================================================================================
! 2674: Entrées : pointeur sur la structure de description d'un processus
! 2675: --------------------------------------------------------------------------------
! 2676: Sorties : structure identique (tous les objets sont copiés)
! 2677: --------------------------------------------------------------------------------
! 2678: Effets de bord : néant
! 2679: ================================================================================
! 2680: */
! 2681:
! 2682: struct_processus *
! 2683: copie_etat_processus(struct_processus *s_etat_processus)
! 2684: {
! 2685: pthread_mutexattr_t attributs_mutex;
! 2686:
! 2687: struct_liste_chainee *l_element_lecture;
! 2688: struct_liste_chainee *l_element_precedent;
! 2689: struct_liste_chainee *l_element_suivant;
! 2690:
! 2691: struct_processus *s_nouvel_etat_processus;
! 2692:
! 2693: unsigned long i;
! 2694:
! 2695: if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
! 2696: {
! 2697: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2698: return(NULL);
! 2699: }
! 2700:
! 2701: if ((s_nouvel_etat_processus = malloc(sizeof(struct_processus))) == NULL)
! 2702: {
! 2703: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2704: return(NULL);
! 2705: }
! 2706:
! 2707: (*s_nouvel_etat_processus) = (*s_etat_processus);
! 2708:
! 2709: // On réinitialise l'allocateur.
! 2710:
! 2711: initialisation_allocateur(s_nouvel_etat_processus);
! 2712:
! 2713: /*
! 2714: * (*s_etat_processus).definition_chainee,
! 2715: * (*s_etat_processus).nom_fichier_source,
! 2716: * (*s_etat_processus).nom_fichier_historique et
! 2717: * (*s_etat_processus).chemin_fichier_temporaires
! 2718: * n'ont aucune raison de changer.
! 2719: */
! 2720:
! 2721: sem_init(&((*s_nouvel_etat_processus).semaphore_fork), 0, 0);
! 2722:
! 2723: (*s_nouvel_etat_processus).var_volatile_processus_pere = 0;
! 2724: (*s_nouvel_etat_processus).fichiers_graphiques = NULL;
! 2725: (*s_nouvel_etat_processus).entree_standard = NULL;
! 2726: (*s_nouvel_etat_processus).s_marques = NULL;
! 2727: (*s_nouvel_etat_processus).requete_nouveau_plan = d_vrai;
! 2728: (*s_nouvel_etat_processus).mise_a_jour_trace_requise = d_faux;
! 2729: (*s_nouvel_etat_processus).nom_fichier_impression = NULL;
! 2730: (*s_nouvel_etat_processus).expression_courante = NULL;
! 2731: (*s_nouvel_etat_processus).objet_courant = NULL;
! 2732: (*s_nouvel_etat_processus).processus_detache = d_faux;
! 2733:
! 2734: (*s_nouvel_etat_processus).nombre_objets_envoyes_non_lus = 0;
! 2735: (*s_nouvel_etat_processus).nombre_objets_injectes = 0;
! 2736: (*s_nouvel_etat_processus).presence_fusible = d_faux;
! 2737: (*s_nouvel_etat_processus).thread_fusible = 0;
! 2738: (*s_nouvel_etat_processus).niveau_initial =
! 2739: (*s_etat_processus).niveau_courant;
! 2740: (*s_nouvel_etat_processus).presence_pipes = d_faux;
! 2741: (*s_nouvel_etat_processus).debug_programme = d_faux;
! 2742: (*s_nouvel_etat_processus).s_fichiers = NULL;
! 2743: (*s_nouvel_etat_processus).s_connecteurs_sql = NULL;
! 2744:
! 2745: // On réinitialise toutes les interruptions.
! 2746:
! 2747: (*s_nouvel_etat_processus).traitement_interruption = 'N';
! 2748: (*s_nouvel_etat_processus).traitement_interruptible = 'Y';
! 2749: (*s_nouvel_etat_processus).nombre_interruptions_en_queue = 0;
! 2750: (*s_nouvel_etat_processus).nombre_interruptions_non_affectees = 0;
! 2751:
! 2752: for(i = 0; i < d_NOMBRE_INTERRUPTIONS; i++)
! 2753: {
! 2754: (*s_nouvel_etat_processus).corps_interruptions[i] = NULL;
! 2755: (*s_nouvel_etat_processus).masque_interruptions[i] = 'N';
! 2756: (*s_nouvel_etat_processus).queue_interruptions[i] = 0;
! 2757: (*s_nouvel_etat_processus).pile_origine_interruptions[i] = NULL;
! 2758: }
! 2759:
! 2760: if ((*s_nouvel_etat_processus).generateur_aleatoire != NULL)
! 2761: {
! 2762: (*s_nouvel_etat_processus).generateur_aleatoire = NULL;
! 2763: }
! 2764:
! 2765: (*s_nouvel_etat_processus).type_generateur_aleatoire = NULL;
! 2766:
! 2767: // Copie de la localisation
! 2768:
! 2769: if (((*s_nouvel_etat_processus).localisation = malloc((strlen(
! 2770: (*s_etat_processus).localisation) + 1) * sizeof(unsigned char)))
! 2771: == NULL)
! 2772: {
! 2773: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2774: return(NULL);
! 2775: }
! 2776:
! 2777: strcpy((*s_nouvel_etat_processus).localisation,
! 2778: (*s_etat_processus).localisation);
! 2779:
! 2780: if ((*s_etat_processus).indep != NULL)
! 2781: {
! 2782: if (((*s_nouvel_etat_processus).indep = copie_objet(s_etat_processus,
! 2783: (*s_etat_processus).indep, 'P')) == NULL)
! 2784: {
! 2785: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2786: {
! 2787: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2788: return(NULL);
! 2789: }
! 2790:
! 2791: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2792: return(NULL);
! 2793: }
! 2794: }
! 2795: else
! 2796: {
! 2797: (*s_nouvel_etat_processus).indep = NULL;
! 2798: }
! 2799:
! 2800: if ((*s_etat_processus).depend != NULL)
! 2801: {
! 2802: if (((*s_nouvel_etat_processus).depend = copie_objet(s_etat_processus,
! 2803: (*s_etat_processus).depend, 'P')) == NULL)
! 2804: {
! 2805: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2806: {
! 2807: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2808: return(NULL);
! 2809: }
! 2810:
! 2811: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2812: return(NULL);
! 2813: }
! 2814: }
! 2815: else
! 2816: {
! 2817: (*s_nouvel_etat_processus).depend = NULL;
! 2818: }
! 2819:
! 2820: if ((*s_etat_processus).parametres_courbes_de_niveau != NULL)
! 2821: {
! 2822: if (((*s_nouvel_etat_processus).parametres_courbes_de_niveau =
! 2823: copie_objet(s_etat_processus, (*s_etat_processus)
! 2824: .parametres_courbes_de_niveau, 'P')) == NULL)
! 2825: {
! 2826: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2827: {
! 2828: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2829: return(NULL);
! 2830: }
! 2831:
! 2832: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2833: return(NULL);
! 2834: }
! 2835: }
! 2836: else
! 2837: {
! 2838: (*s_nouvel_etat_processus).parametres_courbes_de_niveau = NULL;
! 2839: }
! 2840:
! 2841: (*s_nouvel_etat_processus).instruction_derniere_erreur = NULL;
! 2842:
! 2843: if (((*s_etat_processus).instruction_courante != NULL) &&
! 2844: (*s_etat_processus).evaluation_expression_compilee == 'N')
! 2845: {
! 2846: if (((*s_nouvel_etat_processus).instruction_courante = malloc((strlen(
! 2847: (*s_etat_processus).instruction_courante) + 1) *
! 2848: sizeof(unsigned char))) == NULL)
! 2849: {
! 2850: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2851: {
! 2852: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2853: return(NULL);
! 2854: }
! 2855:
! 2856: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2857: return(NULL);
! 2858: }
! 2859:
! 2860: strcpy((*s_nouvel_etat_processus).instruction_courante,
! 2861: (*s_etat_processus).instruction_courante);
! 2862: }
! 2863: else
! 2864: {
! 2865: (*s_nouvel_etat_processus).instruction_courante = NULL;
! 2866: }
! 2867:
! 2868: if ((*s_etat_processus).label_x != NULL)
! 2869: {
! 2870: if (((*s_nouvel_etat_processus).label_x = malloc((strlen(
! 2871: (*s_etat_processus).label_x) + 1) *
! 2872: sizeof(unsigned char))) == NULL)
! 2873: {
! 2874: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2875: {
! 2876: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2877: return(NULL);
! 2878: }
! 2879:
! 2880: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2881: return(NULL);
! 2882: }
! 2883:
! 2884: strcpy((*s_nouvel_etat_processus).label_x,
! 2885: (*s_etat_processus).label_x);
! 2886: }
! 2887: else
! 2888: {
! 2889: (*s_nouvel_etat_processus).label_x = NULL;
! 2890: }
! 2891:
! 2892: if ((*s_etat_processus).label_y != NULL)
! 2893: {
! 2894: if (((*s_nouvel_etat_processus).label_y = malloc((strlen(
! 2895: (*s_etat_processus).label_y) + 1) *
! 2896: sizeof(unsigned char))) == NULL)
! 2897: {
! 2898: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2899: {
! 2900: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2901: return(NULL);
! 2902: }
! 2903:
! 2904: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2905: return(NULL);
! 2906: }
! 2907:
! 2908: strcpy((*s_nouvel_etat_processus).label_y,
! 2909: (*s_etat_processus).label_y);
! 2910: }
! 2911: else
! 2912: {
! 2913: (*s_nouvel_etat_processus).label_y = NULL;
! 2914: }
! 2915:
! 2916: if ((*s_etat_processus).label_z != NULL)
! 2917: {
! 2918: if (((*s_nouvel_etat_processus).label_z = malloc((strlen(
! 2919: (*s_etat_processus).label_z) + 1) *
! 2920: sizeof(unsigned char))) == NULL)
! 2921: {
! 2922: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2923: {
! 2924: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2925: return(NULL);
! 2926: }
! 2927:
! 2928: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2929: return(NULL);
! 2930: }
! 2931:
! 2932: strcpy((*s_nouvel_etat_processus).label_z,
! 2933: (*s_etat_processus).label_z);
! 2934: }
! 2935: else
! 2936: {
! 2937: (*s_nouvel_etat_processus).label_z = NULL;
! 2938: }
! 2939:
! 2940: if ((*s_etat_processus).titre != NULL)
! 2941: {
! 2942: if (((*s_nouvel_etat_processus).titre = malloc((strlen(
! 2943: (*s_etat_processus).titre) + 1) *
! 2944: sizeof(unsigned char))) == NULL)
! 2945: {
! 2946: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2947: {
! 2948: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2949: return(NULL);
! 2950: }
! 2951:
! 2952: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2953: return(NULL);
! 2954: }
! 2955:
! 2956: strcpy((*s_nouvel_etat_processus).titre,
! 2957: (*s_etat_processus).titre);
! 2958: }
! 2959: else
! 2960: {
! 2961: (*s_nouvel_etat_processus).titre = NULL;
! 2962: }
! 2963:
! 2964: if ((*s_etat_processus).legende != NULL)
! 2965: {
! 2966: if (((*s_nouvel_etat_processus).legende = malloc((strlen(
! 2967: (*s_etat_processus).legende) + 1) *
! 2968: sizeof(unsigned char))) == NULL)
! 2969: {
! 2970: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2971: {
! 2972: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2973: return(NULL);
! 2974: }
! 2975:
! 2976: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 2977: return(NULL);
! 2978: }
! 2979:
! 2980: strcpy((*s_nouvel_etat_processus).legende,
! 2981: (*s_etat_processus).legende);
! 2982: }
! 2983: else
! 2984: {
! 2985: (*s_nouvel_etat_processus).legende = NULL;
! 2986: }
! 2987:
! 2988: /*
! 2989: * Copie de la table des variables
! 2990: */
! 2991:
! 2992: if (((*s_nouvel_etat_processus).s_liste_variables =
! 2993: malloc((*s_etat_processus).nombre_variables_allouees *
! 2994: sizeof(struct_variable))) == NULL)
! 2995: {
! 2996: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 2997: {
! 2998: (*s_etat_processus).erreur_systeme = d_es_processus;
! 2999: return(NULL);
! 3000: }
! 3001:
! 3002: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3003: return(NULL);
! 3004: }
! 3005:
! 3006: for(i = 0; i < (*s_etat_processus).nombre_variables; i++)
! 3007: {
! 3008: if (((*s_nouvel_etat_processus).s_liste_variables[i].nom =
! 3009: malloc((strlen((*s_etat_processus).s_liste_variables[i].nom)
! 3010: + 1) * sizeof(unsigned char))) == NULL)
! 3011: {
! 3012: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3013: {
! 3014: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3015: return(NULL);
! 3016: }
! 3017:
! 3018: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3019: return(NULL);
! 3020: }
! 3021:
! 3022: strcpy((*s_nouvel_etat_processus).s_liste_variables[i].nom,
! 3023: (*s_etat_processus).s_liste_variables[i].nom);
! 3024:
! 3025: (*s_nouvel_etat_processus).s_liste_variables[i].origine =
! 3026: (*s_etat_processus).s_liste_variables[i].origine;
! 3027: (*s_nouvel_etat_processus).s_liste_variables[i].niveau =
! 3028: (*s_etat_processus).s_liste_variables[i].niveau;
! 3029: (*s_nouvel_etat_processus).s_liste_variables[i].variable_statique =
! 3030: (*s_etat_processus).s_liste_variables[i].variable_statique;
! 3031: (*s_nouvel_etat_processus).s_liste_variables[i].variable_verrouillee =
! 3032: (*s_etat_processus).s_liste_variables[i].variable_verrouillee;
! 3033:
! 3034: // Les définitions sont partagées entre tous les threads.
! 3035:
! 3036: if ((*s_etat_processus).s_liste_variables[i].niveau == 0)
! 3037: {
! 3038: (*s_nouvel_etat_processus).s_liste_variables[i].objet =
! 3039: (*s_etat_processus).s_liste_variables[i].objet;
! 3040: }
! 3041: else
! 3042: {
! 3043: if (((*s_nouvel_etat_processus).s_liste_variables[i].objet =
! 3044: copie_objet(s_etat_processus,
! 3045: (*s_etat_processus).s_liste_variables[i]
! 3046: .objet, 'P')) == NULL)
! 3047: {
! 3048: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3049: {
! 3050: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3051: return(NULL);
! 3052: }
! 3053:
! 3054: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3055: return(NULL);
! 3056: }
! 3057: }
! 3058: }
! 3059:
! 3060: /*
! 3061: * Copie de la table des variables statiques
! 3062: */
! 3063:
! 3064: if (((*s_nouvel_etat_processus).s_liste_variables_statiques =
! 3065: malloc((*s_etat_processus).nombre_variables_statiques_allouees *
! 3066: sizeof(struct_variable_statique))) == NULL)
! 3067: {
! 3068: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3069: {
! 3070: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3071: return(NULL);
! 3072: }
! 3073:
! 3074: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3075: return(NULL);
! 3076: }
! 3077:
! 3078: for(i = 0; i < (*s_etat_processus).nombre_variables_statiques; i++)
! 3079: {
! 3080: if (((*s_nouvel_etat_processus).s_liste_variables_statiques[i].nom =
! 3081: malloc((strlen((*s_etat_processus).s_liste_variables_statiques
! 3082: [i].nom) + 1) * sizeof(unsigned char))) == NULL)
! 3083: {
! 3084: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3085: {
! 3086: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3087: return(NULL);
! 3088: }
! 3089:
! 3090: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3091: return(NULL);
! 3092: }
! 3093:
! 3094: strcpy((*s_nouvel_etat_processus).s_liste_variables_statiques[i].nom,
! 3095: (*s_etat_processus).s_liste_variables_statiques[i].nom);
! 3096:
! 3097: (*s_nouvel_etat_processus).s_liste_variables_statiques[i].origine =
! 3098: (*s_etat_processus).s_liste_variables_statiques[i].origine;
! 3099: (*s_nouvel_etat_processus).s_liste_variables_statiques[i].niveau =
! 3100: (*s_etat_processus).s_liste_variables_statiques[i].niveau;
! 3101: (*s_nouvel_etat_processus).s_liste_variables_statiques[i]
! 3102: .variable_statique = (*s_etat_processus)
! 3103: .s_liste_variables_statiques[i].variable_statique;
! 3104:
! 3105: if (((*s_nouvel_etat_processus).s_liste_variables_statiques[i].objet =
! 3106: copie_objet(s_etat_processus, (*s_etat_processus)
! 3107: .s_liste_variables_statiques[i].objet, 'P')) == NULL)
! 3108: {
! 3109: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3110: {
! 3111: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3112: return(NULL);
! 3113: }
! 3114:
! 3115: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3116: return(NULL);
! 3117: }
! 3118: }
! 3119:
! 3120: /*
! 3121: * Copie de la pile opérationnelle
! 3122: */
! 3123:
! 3124: (*s_nouvel_etat_processus).l_base_pile = NULL;
! 3125: l_element_lecture = (*s_etat_processus).l_base_pile;
! 3126: l_element_precedent = NULL;
! 3127:
! 3128: while(l_element_lecture != NULL)
! 3129: {
! 3130: if ((l_element_suivant = malloc(sizeof(struct_liste_chainee))) == NULL)
! 3131: {
! 3132: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3133: {
! 3134: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3135: return(NULL);
! 3136: }
! 3137:
! 3138: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3139: return(NULL);
! 3140: }
! 3141:
! 3142: if (((*l_element_suivant).donnee = copie_objet(s_etat_processus,
! 3143: (*l_element_lecture).donnee, 'P')) == NULL)
! 3144: {
! 3145: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3146: {
! 3147: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3148: return(NULL);
! 3149: }
! 3150:
! 3151: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3152: return(NULL);
! 3153: }
! 3154:
! 3155: (*l_element_suivant).suivant = NULL;
! 3156:
! 3157: if ((*s_nouvel_etat_processus).l_base_pile == NULL)
! 3158: {
! 3159: (*s_nouvel_etat_processus).l_base_pile = l_element_suivant;
! 3160: }
! 3161: else
! 3162: {
! 3163: (*l_element_precedent).suivant = l_element_suivant;
! 3164: }
! 3165:
! 3166: l_element_precedent = l_element_suivant;
! 3167: l_element_lecture = (*l_element_lecture).suivant;
! 3168: }
! 3169:
! 3170: /*
! 3171: * Copie de la pile système
! 3172: */
! 3173:
! 3174: (*s_nouvel_etat_processus).l_base_pile_systeme = NULL;
! 3175: (*s_nouvel_etat_processus).hauteur_pile_systeme = 0;
! 3176:
! 3177: empilement_pile_systeme(s_nouvel_etat_processus);
! 3178:
! 3179: if ((*s_nouvel_etat_processus).erreur_systeme != d_es)
! 3180: {
! 3181: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3182: {
! 3183: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3184: return(NULL);
! 3185: }
! 3186:
! 3187: (*s_etat_processus).erreur_systeme =
! 3188: (*s_nouvel_etat_processus).erreur_systeme;
! 3189: return(NULL);
! 3190: }
! 3191:
! 3192: (*(*s_nouvel_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
! 3193:
! 3194: /*
! 3195: * On empile deux valeurs retour_definition pour pouvoir récupérer
! 3196: * les variables dans le cas d'un programme compilé.
! 3197: */
! 3198:
! 3199: empilement_pile_systeme(s_nouvel_etat_processus);
! 3200:
! 3201: if ((*s_nouvel_etat_processus).erreur_systeme != d_es)
! 3202: {
! 3203: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3204: {
! 3205: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3206: return(NULL);
! 3207: }
! 3208:
! 3209: (*s_etat_processus).erreur_systeme =
! 3210: (*s_nouvel_etat_processus).erreur_systeme;
! 3211: return(NULL);
! 3212: }
! 3213:
! 3214: (*(*s_nouvel_etat_processus).l_base_pile_systeme).retour_definition = 'Y';
! 3215:
! 3216: /*
! 3217: * Destruction de la pile last pour le thread en cours.
! 3218: */
! 3219:
! 3220: (*s_nouvel_etat_processus).l_base_pile_last = NULL;
! 3221: (*s_nouvel_etat_processus).l_base_pile_processus = NULL;
! 3222:
! 3223: /*
! 3224: * Copie des différents contextes
! 3225: */
! 3226:
! 3227: (*s_nouvel_etat_processus).l_base_pile_contextes = NULL;
! 3228: l_element_lecture = (*s_etat_processus).l_base_pile_contextes;
! 3229:
! 3230: while(l_element_lecture != NULL)
! 3231: {
! 3232: if ((l_element_suivant = malloc(sizeof(struct_liste_chainee))) == NULL)
! 3233: {
! 3234: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3235: {
! 3236: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3237: return(NULL);
! 3238: }
! 3239:
! 3240: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3241: return(NULL);
! 3242: }
! 3243:
! 3244: if (((*l_element_suivant).donnee = copie_objet(s_etat_processus,
! 3245: (*l_element_lecture).donnee, 'P')) == NULL)
! 3246: {
! 3247: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3248: {
! 3249: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3250: return(NULL);
! 3251: }
! 3252:
! 3253: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3254: return(NULL);
! 3255: }
! 3256:
! 3257: (*l_element_suivant).suivant = NULL;
! 3258:
! 3259: if ((*s_nouvel_etat_processus).l_base_pile_contextes == NULL)
! 3260: {
! 3261: (*s_nouvel_etat_processus).l_base_pile_contextes =
! 3262: l_element_suivant;
! 3263: }
! 3264: else
! 3265: {
! 3266: (*l_element_precedent).suivant = l_element_suivant;
! 3267: }
! 3268:
! 3269: l_element_precedent = l_element_suivant;
! 3270: l_element_lecture = (*l_element_lecture).suivant;
! 3271: }
! 3272:
! 3273: (*s_nouvel_etat_processus).l_base_pile_taille_contextes = NULL;
! 3274: l_element_lecture = (*s_etat_processus).l_base_pile_taille_contextes;
! 3275:
! 3276: while(l_element_lecture != NULL)
! 3277: {
! 3278: if ((l_element_suivant = malloc(sizeof(struct_liste_chainee))) == NULL)
! 3279: {
! 3280: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3281: {
! 3282: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3283: return(NULL);
! 3284: }
! 3285:
! 3286: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3287: return(NULL);
! 3288: }
! 3289:
! 3290: if (((*l_element_suivant).donnee = copie_objet(s_etat_processus,
! 3291: (*l_element_lecture).donnee, 'P')) == NULL)
! 3292: {
! 3293: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3294: {
! 3295: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3296: return(NULL);
! 3297: }
! 3298:
! 3299: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3300: return(NULL);
! 3301: }
! 3302:
! 3303: (*l_element_suivant).suivant = NULL;
! 3304:
! 3305: if ((*s_nouvel_etat_processus).l_base_pile_taille_contextes == NULL)
! 3306: {
! 3307: (*s_nouvel_etat_processus).l_base_pile_taille_contextes =
! 3308: l_element_suivant;
! 3309: }
! 3310: else
! 3311: {
! 3312: (*l_element_precedent).suivant = l_element_suivant;
! 3313: }
! 3314:
! 3315: l_element_precedent = l_element_suivant;
! 3316: l_element_lecture = (*l_element_lecture).suivant;
! 3317: }
! 3318:
! 3319: /*
! 3320: * Copies des piles s_sockets, s_bibliotheques et
! 3321: * s_instructions_externes.
! 3322: */
! 3323:
! 3324: (*s_nouvel_etat_processus).s_sockets = NULL;
! 3325: l_element_lecture = (*s_etat_processus).s_sockets;
! 3326:
! 3327: while(l_element_lecture != NULL)
! 3328: {
! 3329: if ((l_element_suivant = malloc(sizeof(struct_liste_chainee))) == NULL)
! 3330: {
! 3331: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3332: {
! 3333: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3334: return(NULL);
! 3335: }
! 3336:
! 3337: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3338: return(NULL);
! 3339: }
! 3340:
! 3341: if (((*l_element_suivant).donnee = copie_objet(s_etat_processus,
! 3342: (*l_element_lecture).donnee, 'P')) == NULL)
! 3343: {
! 3344: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3345: {
! 3346: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3347: return(NULL);
! 3348: }
! 3349:
! 3350: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3351: return(NULL);
! 3352: }
! 3353:
! 3354: (*l_element_suivant).suivant = NULL;
! 3355:
! 3356: if ((*s_nouvel_etat_processus).s_sockets == NULL)
! 3357: {
! 3358: (*s_nouvel_etat_processus).s_sockets = l_element_suivant;
! 3359: }
! 3360: else
! 3361: {
! 3362: (*l_element_precedent).suivant = l_element_suivant;
! 3363: }
! 3364:
! 3365: l_element_precedent = l_element_suivant;
! 3366: l_element_lecture = (*l_element_lecture).suivant;
! 3367: }
! 3368:
! 3369: (*s_nouvel_etat_processus).s_bibliotheques = NULL;
! 3370: l_element_precedent = NULL;
! 3371: l_element_lecture = (*s_etat_processus).s_bibliotheques;
! 3372:
! 3373: while(l_element_lecture != NULL)
! 3374: {
! 3375: if ((l_element_suivant = malloc(sizeof(struct_liste_chainee))) == NULL)
! 3376: {
! 3377: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3378: {
! 3379: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3380: return(NULL);
! 3381: }
! 3382:
! 3383: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3384: return(NULL);
! 3385: }
! 3386:
! 3387: if (((*l_element_suivant).donnee = malloc(sizeof(struct_bibliotheque)))
! 3388: == NULL)
! 3389: {
! 3390: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3391: return(NULL);
! 3392: }
! 3393:
! 3394: (*((struct_bibliotheque *) (*l_element_suivant).donnee)).descripteur
! 3395: = (*((struct_bibliotheque *) (*l_element_lecture).donnee))
! 3396: .descripteur;
! 3397: (*((struct_bibliotheque *) (*l_element_suivant).donnee)).pid
! 3398: = (*((struct_bibliotheque *) (*l_element_lecture).donnee)).pid;
! 3399: (*((struct_bibliotheque *) (*l_element_suivant).donnee)).tid
! 3400: = (*((struct_bibliotheque *) (*l_element_lecture).donnee)).tid;
! 3401:
! 3402: if (((*((struct_bibliotheque *) (*l_element_suivant).donnee)).nom =
! 3403: malloc((strlen((*((struct_bibliotheque *) (*l_element_lecture)
! 3404: .donnee)).nom) + 1) * sizeof(unsigned char))) == NULL)
! 3405: {
! 3406: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3407: {
! 3408: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3409: return(NULL);
! 3410: }
! 3411:
! 3412: (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
! 3413: return(NULL);
! 3414: }
! 3415:
! 3416: strcpy((*((struct_bibliotheque *) (*l_element_suivant).donnee)).nom,
! 3417: (*((struct_bibliotheque *) (*l_element_lecture).donnee)).nom);
! 3418:
! 3419: (*l_element_suivant).suivant = NULL;
! 3420:
! 3421: if ((*s_nouvel_etat_processus).s_bibliotheques == NULL)
! 3422: {
! 3423: (*s_nouvel_etat_processus).s_bibliotheques = l_element_suivant;
! 3424: }
! 3425: else
! 3426: {
! 3427: (*l_element_precedent).suivant = l_element_suivant;
! 3428: }
! 3429:
! 3430: l_element_precedent = l_element_suivant;
! 3431: l_element_lecture = (*l_element_lecture).suivant;
! 3432: }
! 3433:
! 3434: if ((*s_etat_processus).nombre_instructions_externes != 0)
! 3435: {
! 3436: if (((*s_nouvel_etat_processus).s_instructions_externes =
! 3437: malloc((*s_etat_processus).nombre_instructions_externes *
! 3438: sizeof(struct_instruction_externe))) == NULL)
! 3439: {
! 3440: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3441: return(NULL);
! 3442: }
! 3443:
! 3444: for(i = 0; i < (*s_etat_processus).nombre_instructions_externes; i++)
! 3445: {
! 3446: if (((*s_nouvel_etat_processus).s_instructions_externes[i].nom =
! 3447: malloc((strlen((*s_etat_processus).s_instructions_externes
! 3448: [i].nom) + 1) * sizeof(unsigned char))) == NULL)
! 3449: {
! 3450: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3451: return(NULL);
! 3452: }
! 3453:
! 3454: strcpy((*s_nouvel_etat_processus).s_instructions_externes[i].nom,
! 3455: (*s_etat_processus).s_instructions_externes[i].nom);
! 3456:
! 3457: if (((*s_nouvel_etat_processus).s_instructions_externes[i]
! 3458: .nom_bibliotheque = malloc((strlen((*s_etat_processus)
! 3459: .s_instructions_externes[i].nom_bibliotheque) + 1) *
! 3460: sizeof(unsigned char))) == NULL)
! 3461: {
! 3462: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3463: return(NULL);
! 3464: }
! 3465:
! 3466: strcpy((*s_nouvel_etat_processus).s_instructions_externes[i]
! 3467: .nom_bibliotheque, (*s_etat_processus)
! 3468: .s_instructions_externes[i].nom_bibliotheque);
! 3469:
! 3470: (*s_nouvel_etat_processus).s_instructions_externes[i]
! 3471: .descripteur_bibliotheque = (*s_etat_processus)
! 3472: .s_instructions_externes[i].descripteur_bibliotheque;
! 3473: }
! 3474: }
! 3475: else
! 3476: {
! 3477: (*s_nouvel_etat_processus).s_instructions_externes = NULL;
! 3478: }
! 3479:
! 3480: pthread_mutexattr_init(&attributs_mutex);
! 3481: pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL);
! 3482: pthread_mutex_init(&((*s_nouvel_etat_processus).mutex), &attributs_mutex);
! 3483: pthread_mutexattr_destroy(&attributs_mutex);
! 3484:
! 3485: if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
! 3486: {
! 3487: (*s_etat_processus).erreur_systeme = d_es_processus;
! 3488: return(NULL);
! 3489: }
! 3490:
! 3491: return(s_nouvel_etat_processus);
! 3492:
! 3493: #undef return
! 3494: }
! 3495:
! 3496: // vim: ts=4
CVSweb interface <joel.bertrand@systella.fr>