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>