Annotation of rpl/src/instructions_s10.c, revision 1.75

1.1       bertrand    1: /*
                      2: ================================================================================
1.73      bertrand    3:   RPL/2 (R) version 4.1.14
1.68      bertrand    4:   Copyright (C) 1989-2013 Dr. BERTRAND Joël
1.1       bertrand    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: 
1.19      bertrand   23: #include "rpl-conv.h"
1.1       bertrand   24: 
                     25: 
                     26: /*
                     27: ================================================================================
                     28:   Fonction 'spawn'
                     29: ================================================================================
                     30:   Entrées :
                     31: --------------------------------------------------------------------------------
                     32:   Sorties :
                     33: --------------------------------------------------------------------------------
                     34:   Effets de bord : néant
                     35: ================================================================================
                     36: */
                     37: 
                     38: void
                     39: instruction_spawn(struct_processus *s_etat_processus)
                     40: {
                     41:    logical1                    drapeau;
                     42:    logical1                    variable_partagee;
                     43: 
                     44:    pthread_attr_t              attributs;
                     45: 
                     46:    pthread_mutexattr_t         attributs_mutex;
                     47: 
                     48:    pthread_t                   thread_surveillance;
                     49: 
                     50:    struct_descripteur_thread   *s_argument_thread;
                     51: 
                     52:    struct_liste_chainee        *l_element_courant;
                     53: 
                     54:    struct_objet                *s_copie;
                     55:    struct_objet                *s_objet;
                     56:    struct_objet                *s_objet_resultat;
                     57:    struct_objet                *s_objet_systeme;
                     58: 
                     59:    struct_processus            *s_nouvel_etat_processus;
                     60: 
                     61:    struct timespec             attente;
                     62: 
                     63:    (*s_etat_processus).erreur_execution = d_ex;
                     64: 
                     65:    if ((*s_etat_processus).affichage_arguments == 'Y')
                     66:    {
                     67:        printf("\n  SPAWN ");
                     68: 
                     69:        if ((*s_etat_processus).langue == 'F')
                     70:        {
                     71:            printf("(lancement d'un thread)\n\n");
                     72:        }
                     73:        else
                     74:        {
                     75:            printf("(create thread)\n\n");
                     76:        }
                     77: 
                     78:        printf("    1: %s, %s\n", d_NOM, d_RPN);
                     79:        printf("->  1: %s\n", d_PRC);
                     80: 
                     81:        return;
                     82:    }
                     83:    else if ((*s_etat_processus).test_instruction == 'Y')
                     84:    {
                     85:        (*s_etat_processus).nombre_arguments = -1;
                     86:        return;
                     87:    }
                     88: 
                     89:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                     90:    {
                     91:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                     92:        {
                     93:            return;
                     94:        }
                     95:    }
                     96: 
                     97:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                     98:            &s_objet) == d_erreur)
                     99:    {
                    100:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    101:        return;
                    102:    }
                    103: 
                    104:    /*
                    105:     * Une routine fille doit pouvoir renvoyer des objets au processus
                    106:     * père au travers de la fonction SEND. Il ne peut donc s'agir que
                    107:     * d'une fonction ou d'une expression RPN.
                    108:     */
                    109: 
1.8       bertrand  110:    if (((*s_objet).type != NOM) && ((*s_objet).type != RPN))
1.1       bertrand  111:    {
                    112:        liberation(s_etat_processus, s_objet);
                    113: 
                    114:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    115:        return;
                    116:    }
                    117: 
                    118:    /*
                    119:     * Si l'argument est de type NOM, il faut que la variable correspondante
                    120:     * soit une variable de type RPN.
                    121:     */
                    122: 
                    123:    variable_partagee = d_faux;
                    124:    s_copie = NULL;
                    125: 
                    126:    if ((*s_objet).type == NOM)
                    127:    {
                    128:        if (recherche_variable(s_etat_processus, (*((struct_nom *)
                    129:                (*s_objet).objet)).nom) == d_vrai)
                    130:        {
1.33      bertrand  131:            if ((*(*s_etat_processus).pointeur_variable_courante).objet == NULL)
1.1       bertrand  132:            {
                    133:                if (recherche_variable_partagee(s_etat_processus,
1.33      bertrand  134:                        (*(*s_etat_processus).pointeur_variable_courante).nom,
                    135:                        (*(*s_etat_processus).pointeur_variable_courante)
                    136:                        .variable_partagee, (*(*s_etat_processus)
1.64      bertrand  137:                        .pointeur_variable_courante).origine) == NULL)
1.1       bertrand  138:                {
                    139:                    liberation(s_etat_processus, s_objet);
                    140: 
                    141:                    (*s_etat_processus).erreur_systeme = d_es;
                    142:                    (*s_etat_processus).erreur_execution =
                    143:                            d_ex_argument_invalide;
                    144:                    return;
                    145:                }
                    146: 
1.63      bertrand  147:                if (((*(*(*s_etat_processus)
                    148:                        .pointeur_variable_partagee_courante).objet).type
                    149:                        != RPN) && ((*(*(*s_etat_processus)
                    150:                        .pointeur_variable_partagee_courante).objet).type
                    151:                        != ADR))
1.1       bertrand  152:                {
                    153:                    if (pthread_mutex_unlock(&((*(*s_etat_processus)
1.63      bertrand  154:                            .pointeur_variable_partagee_courante).mutex)) != 0)
1.1       bertrand  155:                    {
                    156:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                    157:                        return;
                    158:                    }
                    159: 
                    160:                    liberation(s_etat_processus, s_objet);
                    161: 
                    162:                    (*s_etat_processus).erreur_execution =
                    163:                            d_ex_argument_invalide;
                    164:                    return;
                    165:                }
                    166: 
                    167:                if ((s_copie = copie_objet(s_etat_processus,
                    168:                        (*(*s_etat_processus)
1.63      bertrand  169:                        .pointeur_variable_partagee_courante).objet, 'P'))
                    170:                        == NULL)
1.1       bertrand  171:                {
                    172:                    if (pthread_mutex_unlock(&((*(*s_etat_processus)
1.63      bertrand  173:                            .pointeur_variable_partagee_courante).mutex)) != 0)
1.1       bertrand  174:                    {
                    175:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                    176:                        return;
                    177:                    }
                    178: 
                    179:                    (*s_etat_processus).erreur_systeme =
                    180:                            d_es_allocation_memoire;
                    181: 
                    182:                    return;
                    183:                }
                    184: 
                    185:                variable_partagee = d_vrai;
                    186: 
                    187:                if (pthread_mutex_unlock(&((*(*s_etat_processus)
1.63      bertrand  188:                        .pointeur_variable_partagee_courante).mutex)) != 0)
1.1       bertrand  189:                {
                    190:                    (*s_etat_processus).erreur_systeme = d_es_processus;
                    191:                    return;
                    192:                }
                    193:            }
                    194:            else
                    195:            {
1.33      bertrand  196:                if (((*(*(*s_etat_processus).pointeur_variable_courante).objet)
                    197:                        .type != RPN) && ((*(*(*s_etat_processus)
                    198:                        .pointeur_variable_courante).objet).type != ADR))
1.1       bertrand  199:                {
                    200:                    liberation(s_etat_processus, s_objet);
                    201: 
                    202:                    (*s_etat_processus).erreur_execution =
                    203:                            d_ex_argument_invalide;
                    204:                    return;
                    205:                }
                    206:            }
                    207:        }
                    208:        else // Variable inexistante
                    209:        {
                    210:            liberation(s_etat_processus, s_objet);
                    211: 
                    212:            (*s_etat_processus).erreur_systeme = d_es;
                    213:            (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                    214:            return;
                    215:        }
                    216:    }
                    217: 
                    218:    if ((s_argument_thread = malloc(sizeof(struct_descripteur_thread))) == NULL)
                    219:    {
                    220:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    221:        return;
                    222:    }
                    223: 
                    224:    if (pipe((*s_argument_thread).pipe_erreurs) != 0)
                    225:    {
                    226:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    227:        return;
                    228:    }
                    229: 
                    230:    if (pipe((*s_argument_thread).pipe_interruptions) != 0)
                    231:    {
                    232:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    233:        return;
                    234:    }
                    235: 
1.74      bertrand  236:    if (pipe((*s_argument_thread).pipe_nombre_elements_attente) != 0)
1.1       bertrand  237:    {
                    238:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    239:        return;
                    240:    }
                    241: 
                    242:    if (pipe((*s_argument_thread).pipe_objets) != 0)
                    243:    {
                    244:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    245:        return;
                    246:    }
                    247: 
                    248:    if (pipe((*s_argument_thread).pipe_acquittement) != 0)
                    249:    {
                    250:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    251:        return;
                    252:    }
                    253: 
                    254:    if (pipe((*s_argument_thread).pipe_injections) != 0)
                    255:    {
                    256:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    257:        return;
                    258:    }
                    259: 
                    260:    if (pipe((*s_argument_thread).pipe_nombre_injections) != 0)
                    261:    {
                    262:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    263:        return;
                    264:    }
                    265: 
                    266:    if ((s_nouvel_etat_processus = copie_etat_processus(s_etat_processus))
                    267:            == NULL)
                    268:    {
                    269:        return;
                    270:    }
                    271: 
                    272:    pthread_mutexattr_init(&attributs_mutex);
                    273:    pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
                    274:    pthread_mutex_init(&((*s_argument_thread).mutex), &attributs_mutex);
                    275:    pthread_mutexattr_destroy(&attributs_mutex);
                    276: 
1.25      bertrand  277:    pthread_mutexattr_init(&attributs_mutex);
                    278:    pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE);
                    279:    pthread_mutex_init(&((*s_argument_thread).mutex_nombre_references),
                    280:            &attributs_mutex);
                    281:    pthread_mutexattr_destroy(&attributs_mutex);
                    282: 
1.1       bertrand  283:    (*s_argument_thread).processus_detache = d_faux;
                    284:    (*s_argument_thread).thread_actif = d_faux;
                    285:    (*s_argument_thread).thread_pere = pthread_self();
                    286:    (*s_argument_thread).pid = getpid();
                    287: 
                    288:    (*s_nouvel_etat_processus).pipe_donnees =
                    289:            (*s_argument_thread).pipe_objets[1];
1.74      bertrand  290:    (*s_nouvel_etat_processus).pipe_nombre_elements_attente =
                    291:            (*s_argument_thread).pipe_nombre_elements_attente[1];
1.1       bertrand  292:    (*s_nouvel_etat_processus).pipe_interruptions =
                    293:            (*s_argument_thread).pipe_interruptions[1];
                    294:    (*s_nouvel_etat_processus).pipe_injections =
                    295:            (*s_argument_thread).pipe_injections[0];
                    296:    (*s_nouvel_etat_processus).pipe_nombre_injections =
                    297:            (*s_argument_thread).pipe_nombre_injections[0];
                    298:    (*s_nouvel_etat_processus).pipe_acquittement =
                    299:            (*s_argument_thread).pipe_acquittement[0];
                    300:    (*s_nouvel_etat_processus).presence_pipes = d_vrai;
                    301: 
                    302:    (*s_nouvel_etat_processus).niveau_initial =
                    303:            (*s_etat_processus).niveau_courant;
                    304:    (*s_nouvel_etat_processus).debug_programme = d_faux;
                    305:    (*s_nouvel_etat_processus).nombre_objets_injectes = 0;
                    306:    (*s_nouvel_etat_processus).nombre_objets_envoyes_non_lus = 0;
                    307:    (*s_nouvel_etat_processus).temps_maximal_cpu = 0;
                    308:    (*s_nouvel_etat_processus).presence_fusible = d_faux;
                    309:    (*s_nouvel_etat_processus).thread_fusible = 0;
                    310: 
                    311:    (*s_nouvel_etat_processus).pile_profilage = NULL;
                    312:    (*s_nouvel_etat_processus).pile_profilage_fonctions = NULL;
                    313: 
                    314:    /*
                    315:     * Lancement du thread fils et du thread de surveillance
                    316:     */
                    317: 
                    318:    if (pthread_attr_init(&attributs) != 0)
                    319:    {
                    320:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    321:        return;
                    322:    }
                    323: 
                    324:    if (pthread_attr_setdetachstate(&attributs, PTHREAD_CREATE_JOINABLE) != 0)
                    325:    {
                    326:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    327:        return;
                    328:    }
                    329: 
1.50      bertrand  330: #  ifdef SCHED_OTHER
1.1       bertrand  331:    if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
                    332:    {
                    333:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    334:        return;
                    335:    }
1.50      bertrand  336: #  endif
1.1       bertrand  337: 
1.50      bertrand  338: #  ifdef PTHREAD_EXPLICIT_SCHED
1.1       bertrand  339:    if (pthread_attr_setinheritsched(&attributs, PTHREAD_EXPLICIT_SCHED) != 0)
                    340:    {
                    341:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    342:        return;
                    343:    }
1.50      bertrand  344: #  endif
1.1       bertrand  345: 
1.50      bertrand  346: #  ifdef PTHREAD_SCOPE_SYSTEM
1.1       bertrand  347:    if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
                    348:    {
                    349:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    350:        return;
                    351:    }
1.19      bertrand  352: #  endif
1.1       bertrand  353: 
                    354:    /*
                    355:     * Création de l'objet à retourner
                    356:     */
                    357: 
                    358:    if ((s_objet_resultat = allocation(s_etat_processus, PRC)) == NULL)
                    359:    {
                    360:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    361:        return;
                    362:    }
                    363: 
                    364:    (*((struct_processus_fils *) (*s_objet_resultat).objet)).thread
                    365:            = s_argument_thread;
                    366: 
                    367:    (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
                    368:            .nombre_objets_dans_pipe = 0;
                    369:    (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
                    370:            .nombre_interruptions_dans_pipe = 0;
                    371:    (*(*((struct_processus_fils *) (*s_objet_resultat).objet)).thread)
                    372:            .nombre_references = 1;
                    373: 
                    374:    // Lancement du thread fils
                    375: 
                    376:    (*s_argument_thread).s_nouvel_etat_processus = s_nouvel_etat_processus;
                    377:    (*s_argument_thread).s_etat_processus = s_etat_processus;
                    378: 
                    379:    if (variable_partagee == d_vrai)
                    380:    {
                    381:        (*s_argument_thread).argument = s_copie;
                    382:        (*s_argument_thread).destruction_objet = d_vrai;
                    383:    }
                    384:    else
                    385:    {
                    386:        (*s_argument_thread).argument = s_objet;
                    387:        (*s_argument_thread).destruction_objet = d_faux;
                    388:    }
                    389: 
1.15      bertrand  390:    (*s_argument_thread).thread_actif = d_faux;
1.1       bertrand  391: 
1.52      bertrand  392:    if (pthread_create(&(*s_nouvel_etat_processus).tid,
                    393:            &attributs, lancement_thread, s_argument_thread) != 0)
1.1       bertrand  394:    {
                    395:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    396:        return;
                    397:    }
                    398: 
1.15      bertrand  399:    attente.tv_sec = 0;
                    400:    attente.tv_nsec = GRANULARITE_us * 1000;
                    401: 
1.75    ! bertrand  402:    if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0)
        !           403:    {
        !           404:        (*s_etat_processus).erreur_systeme = d_es_processus;
        !           405:        return;
        !           406:    }
        !           407: 
1.15      bertrand  408:    while((*s_argument_thread).thread_actif == d_faux)
                    409:    {
1.45      bertrand  410:        scrutation_interruptions(s_etat_processus);
1.75    ! bertrand  411:        pthread_mutex_lock(&((*s_argument_thread).mutex));
1.15      bertrand  412:        nanosleep(&attente, NULL);
1.75    ! bertrand  413:        pthread_mutex_unlock(&((*s_argument_thread).mutex));
1.15      bertrand  414:        INCR_GRANULARITE(attente.tv_nsec);
                    415:    }
                    416: 
1.75    ! bertrand  417:    if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
        !           418:    {
        !           419:        (*s_etat_processus).erreur_systeme = d_es_processus;
        !           420:        return;
        !           421:    }
        !           422: 
1.1       bertrand  423:    if (pthread_attr_destroy(&attributs) != 0)
                    424:    {
                    425:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    426:        return;
                    427:    }
                    428: 
                    429:    if (pthread_attr_init(&attributs) != 0)
                    430:    {
                    431:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    432:        return;
                    433:    }
                    434: 
                    435:    if (pthread_attr_setdetachstate(&attributs,
                    436:            PTHREAD_CREATE_DETACHED) != 0)
                    437:    {
                    438:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    439:        return;
                    440:    }
                    441: 
1.50      bertrand  442: #  ifdef SCHED_OTHER
1.1       bertrand  443:    if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
                    444:    {
                    445:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    446:        return;
                    447:    }
1.50      bertrand  448: #  endif
1.1       bertrand  449: 
1.50      bertrand  450: #  ifdef PTHREAD_EXPLICIT_SCHED
1.1       bertrand  451:    if (pthread_attr_setinheritsched(&attributs,
                    452:            PTHREAD_EXPLICIT_SCHED) != 0)
                    453:    {
                    454:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    455:        return;
                    456:    }
1.50      bertrand  457: #  endif
1.1       bertrand  458: 
1.50      bertrand  459: #  ifdef PTHREAD_SCOPE_SYSTEM
1.1       bertrand  460:    if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
                    461:    {
                    462:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    463:        return;
                    464:    }
1.19      bertrand  465: #  endif
1.1       bertrand  466: 
                    467:    /*
                    468:     * On copie l'objet plutôt que le pointeur car cet objet peut être
                    469:     * accédé depuis deux threads distincts et aboutir à un blocage lors d'une
                    470:     * copie.
                    471:     */
                    472: 
                    473:    if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet_resultat, 'O'))
                    474:            == NULL)
                    475:    {
                    476:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    477:        return;
                    478:    }
                    479: 
                    480:    if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
                    481:    {
1.46      bertrand  482:        pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
1.1       bertrand  483:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    484:        return;
                    485:    }
                    486: 
                    487:    // Si le tid existe déjà  dans la pile des processus, il s'agit forcement
                    488:    // d'un processus moribond. On attend donc qu'il soit effectivement
                    489:    // libéré.
                    490: 
                    491:    do
                    492:    {
                    493:        l_element_courant = (struct_liste_chainee *)
                    494:                (*s_etat_processus).l_base_pile_processus;
                    495:        drapeau = d_faux;
                    496: 
                    497:        attente.tv_sec = 0;
                    498:        attente.tv_nsec = GRANULARITE_us * 1000;
                    499: 
                    500:        while(l_element_courant != NULL)
                    501:        {
                    502:            if (((*(*((struct_processus_fils *)
                    503:                    (*(*l_element_courant).donnee).objet)).thread)
                    504:                    .processus_detache == d_faux) &&
                    505:                    ((*s_argument_thread).processus_detache == d_faux))
                    506:            {
                    507:                if (pthread_equal((*(*((struct_processus_fils *)
                    508:                        (*(*l_element_courant).donnee).objet)).thread)
                    509:                        .tid, (*s_argument_thread).tid) != 0)
                    510:                {
                    511:                    if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
                    512:                    {
                    513:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                    514:                        return;
                    515:                    }
                    516: 
                    517:                    scrutation_injection(s_etat_processus);
                    518: 
                    519:                    if ((*s_etat_processus).nombre_interruptions_non_affectees
                    520:                            != 0)
                    521:                    {
                    522:                        affectation_interruptions_logicielles(s_etat_processus);
                    523:                    }
                    524: 
                    525:                    if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
                    526:                    {
                    527:                        traitement_interruptions_logicielles(s_etat_processus);
                    528:                    }
                    529: 
                    530:                    nanosleep(&attente, NULL);
                    531:                    INCR_GRANULARITE(attente.tv_nsec);
                    532: 
                    533:                    if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
                    534:                    {
                    535:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                    536:                        return;
                    537:                    }
                    538: 
                    539:                    drapeau = d_vrai;
                    540:                    break;
                    541:                }
                    542:            }
                    543: 
1.45      bertrand  544:            scrutation_interruptions(s_etat_processus);
1.1       bertrand  545:            l_element_courant = (*l_element_courant).suivant;
                    546:        }
                    547:    } while(drapeau == d_vrai);
                    548: 
                    549:    if (empilement(s_etat_processus,
                    550:            (struct_liste_chainee **) &((*s_etat_processus)
                    551:            .l_base_pile_processus), s_objet_systeme) == d_erreur)
                    552:    {
                    553:        pthread_mutex_unlock(&((*s_etat_processus).mutex));
                    554:        return;
                    555:    }
                    556: 
                    557:    if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
                    558:    {
                    559:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    560:        return;
                    561:    }
                    562: 
                    563:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    564:            s_objet_resultat) == d_erreur)
                    565:    {
                    566:        return;
                    567:    }
                    568: 
                    569:    if (pthread_mutex_lock(&(*s_argument_thread).mutex) != 0)
                    570:    {
                    571:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    572:        return;
                    573:    }
                    574: 
                    575:    if ((*s_argument_thread).thread_actif == d_faux)
                    576:    {
                    577:        // Le thread n'existe plus.
                    578: 
                    579:        pthread_join((*s_argument_thread).tid, NULL);
                    580:        pthread_mutex_unlock(&(*s_argument_thread).mutex);
                    581:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    582:        return;
                    583:    }
                    584: 
                    585:    if (pthread_mutex_unlock(&(*s_argument_thread).mutex) != 0)
                    586:    {
                    587:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    588:        return;
                    589:    }
                    590: 
                    591:    // Lancement du thread de surveillance
                    592: 
                    593:    if (pthread_create(&thread_surveillance, &attributs,
                    594:            surveillance_processus, s_argument_thread) != 0)
                    595:    {
                    596:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    597:        return;
                    598:    }
                    599: 
                    600:    if (pthread_attr_destroy(&attributs) != 0)
                    601:    {
                    602:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    603:        return;
                    604:    }
                    605: 
                    606:    // Le fils peut être présent sans être en attente du signal de départ.
                    607: 
1.43      bertrand  608:    if (envoi_signal_thread((*s_argument_thread).tid, rpl_sigstart) != 0)
1.1       bertrand  609:    {
                    610:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    611:        return;
                    612:    }
                    613: 
                    614:    return;
                    615: }
                    616: 
                    617: 
                    618: /*
                    619: ================================================================================
                    620:   Fonction 'sqlconnect'
                    621: ================================================================================
                    622:   Entrées :
                    623: --------------------------------------------------------------------------------
                    624:   Sorties :
                    625: --------------------------------------------------------------------------------
                    626:   Effets de bord : néant
                    627: ================================================================================
                    628: */
                    629: 
                    630: void
                    631: instruction_sqlconnect(struct_processus *s_etat_processus)
                    632: {
                    633:    struct_objet            *s_objet_argument;
                    634:    struct_objet            *s_objet_resultat;
                    635:    struct_objet            *s_objet_systeme;
                    636: 
                    637:    (*s_etat_processus).erreur_execution = d_ex;
                    638: 
                    639:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    640:    {
                    641:        printf("\n  SQLCONNECT ");
                    642: 
                    643:        if ((*s_etat_processus).langue == 'F')
                    644:        {
                    645:            printf("(connexion à une base de données SQL)\n\n");
                    646:        }
                    647:        else
                    648:        {
                    649:            printf("(connect to SQL database)\n\n");
                    650:        }
                    651: 
                    652:        printf("    1: %s\n", d_LST);
                    653:        printf("->  1: %s\n\n", d_SQL);
                    654: 
                    655:        if ((*s_etat_processus).langue == 'F')
                    656:        {
                    657:            printf("  Utilisation :\n\n");
                    658:        }
                    659:        else
                    660:        {
                    661:            printf("  Usage:\n\n");
                    662:        }
                    663: 
                    664:        printf("    { \"mysql\" \"server\" \"database\" "
                    665:                "\"user\" \"password\" } SQLCONNECT\n");
1.67      bertrand  666:        printf("    { \"sqlite\" \"file\" } SQLCONNECT\n");
1.1       bertrand  667:        printf("    { \"postgresql:iso-8859-1\" \"server\" "
                    668:                "\"database\" \"user\" \"password\" port }\n");
                    669:        printf("          SQLCONNECT\n");
                    670: 
                    671:        return;
                    672:    }
                    673:    else if ((*s_etat_processus).test_instruction == 'Y')
                    674:    {
                    675:        (*s_etat_processus).nombre_arguments = -1;
                    676:        return;
                    677:    }
                    678:    
                    679:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    680:    {
                    681:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    682:        {
                    683:            return;
                    684:        }
                    685:    }
                    686: 
                    687:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    688:            &s_objet_argument) == d_erreur)
                    689:    {
                    690:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    691:        return;
                    692:    }
                    693: 
                    694:    if ((*s_objet_argument).type == LST)
                    695:    {
                    696:        if ((s_objet_resultat = parametres_sql(s_etat_processus,
                    697:                s_objet_argument)) == NULL)
                    698:        {
1.56      bertrand  699:            liberation(s_etat_processus, s_objet_resultat);
1.1       bertrand  700:            liberation(s_etat_processus, s_objet_argument);
                    701:            return;
                    702:        }
                    703: 
1.56      bertrand  704:        if ((*s_etat_processus).erreur_execution ==
                    705:                d_ex_instruction_indisponible)
                    706:        {
                    707:            liberation(s_etat_processus, s_objet_resultat);
                    708:            return;
                    709:        }
                    710: 
1.1       bertrand  711:        if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet_resultat,
                    712:                'O')) == NULL)
                    713:        {
                    714:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    715:            return;
                    716:        }
                    717: 
                    718:        if (empilement(s_etat_processus,
                    719:                (struct_liste_chainee **) &((*s_etat_processus)
                    720:                .s_connecteurs_sql), s_objet_systeme) == d_erreur)
                    721:        {
                    722:            return;
                    723:        }
                    724: 
                    725:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    726:                s_objet_resultat) == d_erreur)
                    727:        {
                    728:            return;
                    729:        }
                    730:    }
                    731:    else
                    732:    {
                    733:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    734: 
                    735:        liberation(s_etat_processus, s_objet_argument);
                    736:        return;
                    737:    }
                    738: 
                    739:    liberation(s_etat_processus, s_objet_argument);
                    740:    return;
                    741: }
                    742: 
                    743: 
                    744: /*
                    745: ================================================================================
1.8       bertrand  746:   Fonction 'sqldisconnect'
1.1       bertrand  747: ================================================================================
                    748:   Entrées :
                    749: --------------------------------------------------------------------------------
                    750:   Sorties :
                    751: --------------------------------------------------------------------------------
                    752:   Effets de bord : néant
                    753: ================================================================================
                    754: */
                    755: 
                    756: void
                    757: instruction_sqldisconnect(struct_processus *s_etat_processus)
                    758: {
                    759:    logical1                drapeau;
                    760: 
                    761:    struct_liste_chainee    *l_element_courant;
                    762:    struct_liste_chainee    *l_element_precedent;
                    763: 
                    764:    struct_objet            *s_objet;
                    765: 
                    766:    (*s_etat_processus).erreur_execution = d_ex;
                    767: 
                    768:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    769:    {
                    770:        printf("\n  SQLDISCONNECT ");
                    771: 
                    772:        if ((*s_etat_processus).langue == 'F')
                    773:        {
                    774:            printf("(déconnexion d'une base de donnée SQL)\n\n");
                    775:        }
                    776:        else
                    777:        {
                    778:            printf("(disconnection from SQL database)\n\n");
                    779:        }
                    780: 
                    781:        printf("    1: %s\n", d_SQL);
                    782:        return;
                    783:    }
                    784:    else if ((*s_etat_processus).test_instruction == 'Y')
                    785:    {
                    786:        (*s_etat_processus).nombre_arguments = -1;
                    787:        return;
                    788:    }
                    789:    
                    790:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    791:    {
                    792:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    793:        {
                    794:            return;
                    795:        }
                    796:    }
                    797: 
                    798:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    799:            &s_objet) == d_erreur)
                    800:    {
                    801:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    802:        return;
                    803:    }
                    804: 
                    805:    if ((*s_objet).type == SQL)
                    806:    {
                    807:        if (((*((struct_connecteur_sql *) (*s_objet).objet)).pid !=
                    808:                getpid()) || (pthread_equal((*((struct_connecteur_sql *)
                    809:                (*s_objet).objet)).tid, pthread_self()) == 0))
                    810:        {
                    811:            (*s_etat_processus).erreur_execution = d_ex_fichier_hors_contexte;
                    812: 
                    813:            liberation(s_etat_processus, s_objet);
                    814:            return;
                    815:        }
                    816: 
                    817:        l_element_courant = (*s_etat_processus).s_connecteurs_sql;
                    818:        l_element_precedent = NULL;
                    819: 
                    820:        while(l_element_courant != NULL)
                    821:        {
                    822:            if (((*((struct_connecteur_sql *) (*(*l_element_courant).donnee)
                    823:                    .objet)).pid == getpid()) && (pthread_equal(
                    824:                    (*((struct_connecteur_sql *) (*(*l_element_courant).donnee)
                    825:                    .objet)).tid, pthread_self()) != 0) &&
                    826:                    (strcmp((*((struct_connecteur_sql *) (*(*l_element_courant)
                    827:                    .donnee).objet)).type, (*((struct_connecteur_sql *)
                    828:                    (*s_objet).objet)).type) == 0))
                    829:            {
                    830:                if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type,
                    831:                        "MYSQL") == 0)
                    832:                {
                    833: #                  ifdef MYSQL_SUPPORT
1.17      bertrand  834: 
1.1       bertrand  835:                    if ((*((struct_connecteur_sql *) (*(*l_element_courant)
                    836:                            .donnee).objet)).descripteur.mysql ==
                    837:                            (*((struct_connecteur_sql *) (*s_objet).objet))
                    838:                            .descripteur.mysql)
                    839:                    {
                    840:                        drapeau = d_vrai;
                    841:                    }
                    842:                    else
                    843:                    {
                    844:                        drapeau = d_faux;
                    845:                    }
1.17      bertrand  846: 
1.1       bertrand  847: #                  else
                    848: 
                    849:                    if ((*s_etat_processus).langue == 'F')
                    850:                    {
                    851:                        printf("+++Attention : Support de MySQL "
                    852:                                "non compilé !\n");
                    853:                    }
                    854:                    else
                    855:                    {
                    856:                        printf("+++Warning : MySQL support not available !\n");
                    857:                    }
                    858: 
                    859:                    fflush(stdout);
                    860: 
                    861:                    drapeau = d_faux;
                    862: #                  endif
                    863:                }
                    864:                else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet))
                    865:                        .type, "POSTGRESQL") == 0)
                    866:                {
                    867: #                  ifdef POSTGRESQL_SUPPORT
1.17      bertrand  868: 
1.1       bertrand  869:                    if ((*((struct_connecteur_sql *) (*(*l_element_courant)
                    870:                            .donnee).objet)).descripteur.postgresql ==
                    871:                            (*((struct_connecteur_sql *) (*s_objet).objet))
                    872:                            .descripteur.postgresql)
                    873:                    {
                    874:                        drapeau = d_vrai;
                    875:                    }
                    876:                    else
                    877:                    {
                    878:                        drapeau = d_faux;
                    879:                    }
                    880: 
                    881: #                  else
                    882: 
                    883:                    if ((*s_etat_processus).langue == 'F')
                    884:                    {
                    885:                        printf("+++Attention : Support de PostgreSQL "
                    886:                                "non compilé !\n");
                    887:                    }
                    888:                    else
                    889:                    {
                    890:                        printf("+++Warning : PostgreSQL support "
                    891:                                "not available !\n");
                    892:                    }
                    893: 
                    894:                    fflush(stdout);
                    895: 
                    896:                    drapeau = d_faux;
                    897: #                  endif
                    898:                }
1.67      bertrand  899:                else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet))
                    900:                        .type, "SQLITE") == 0)
                    901:                {
                    902:                    if ((*((struct_connecteur_sql *) (*(*l_element_courant)
                    903:                            .donnee).objet)).descripteur.sqlite ==
                    904:                            (*((struct_connecteur_sql *) (*s_objet).objet))
                    905:                            .descripteur.sqlite)
                    906:                    {
                    907:                        drapeau = d_vrai;
                    908:                    }
                    909:                    else
                    910:                    {
                    911:                        drapeau = d_faux;
                    912:                    }
                    913:                }
1.1       bertrand  914:                else
                    915:                {
                    916:                    BUG(1, printf("SQL type '%s' not allowed!",
                    917:                            (*((struct_connecteur_sql *) (*s_objet).objet))
                    918:                            .type));
                    919:                    return;
                    920:                }
                    921: 
                    922:                if (drapeau == d_vrai)
                    923:                {
                    924:                    if (l_element_precedent == NULL)
                    925:                    {
                    926:                        (*s_etat_processus).s_connecteurs_sql =
                    927:                                (*l_element_courant).suivant;
                    928:                    }
                    929:                    else if ((*l_element_courant).suivant == NULL)
                    930:                    {
                    931:                        (*l_element_precedent).suivant = NULL;
                    932:                    }
                    933:                    else
                    934:                    {
                    935:                        (*l_element_precedent).suivant =
                    936:                                (*l_element_courant).suivant;
                    937:                    }
                    938: 
                    939:                    liberation(s_etat_processus, (*l_element_courant).donnee);
                    940:                    free(l_element_courant);
                    941: 
                    942:                    break;
                    943:                }
                    944:            }
                    945: 
                    946:            l_element_precedent = l_element_courant;
                    947:            l_element_courant = (*l_element_courant).suivant;
                    948:        }
                    949: 
                    950:        sqlclose(s_objet);
                    951:    }
                    952:    else
                    953:    {
                    954:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    955: 
                    956:        liberation(s_etat_processus, s_objet);
                    957:        return;
                    958:    }
                    959: 
                    960:    liberation(s_etat_processus, s_objet);
                    961:    return;
                    962: }
                    963: 
                    964: 
                    965: /*
                    966: ================================================================================
                    967:   Fonction 'smphrincr'
                    968: ================================================================================
                    969:   Entrées :
                    970: --------------------------------------------------------------------------------
                    971:   Sorties :
                    972: --------------------------------------------------------------------------------
                    973:   Effets de bord : néant
                    974: ================================================================================
                    975: */
                    976: 
                    977: void
                    978: instruction_smphrincr(struct_processus *s_etat_processus)
                    979: {
                    980:    struct_objet                *s_objet_argument;
                    981: 
                    982:    (*s_etat_processus).erreur_execution = d_ex;
                    983: 
                    984:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    985:    {
                    986:        printf("\n  SMPHRINCR ");
                    987: 
                    988:        if ((*s_etat_processus).langue == 'F')
                    989:        {
                    990:            printf("(incrémentation du sémaphore)\n\n");
                    991:        }
                    992:        else
                    993:        {
                    994:            printf("(semaphore incrementation)\n\n");
                    995:        }
                    996: 
                    997:        printf("    1: %s\n", d_SPH);
                    998:        return;
                    999:    }
                   1000:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1001:    {
                   1002:        (*s_etat_processus).nombre_arguments = -1;
                   1003:        return;
                   1004:    }
                   1005:    
                   1006:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1007:    {
                   1008:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1009:        {
                   1010:            return;
                   1011:        }
                   1012:    }
                   1013: 
                   1014:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1015:            &s_objet_argument) == d_erreur)
                   1016:    {
                   1017:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1018:        return;
                   1019:    }
                   1020: 
                   1021:    if ((*s_objet_argument).type == SPH)
                   1022:    {
                   1023:        if (sem_post((*((struct_semaphore *) (*s_objet_argument).objet))
                   1024:                .semaphore) != 0)
                   1025:        {
                   1026:            (*s_etat_processus).erreur_execution = d_ex_semaphore;
                   1027: 
                   1028:            liberation(s_etat_processus, s_objet_argument);
                   1029:            return;
                   1030:        }
                   1031: 
                   1032:        liberation(s_etat_processus, s_objet_argument);
                   1033:    }
                   1034:    else
                   1035:    {
                   1036:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1037: 
                   1038:        liberation(s_etat_processus, s_objet_argument);
                   1039:        return;
                   1040:    }
                   1041: 
                   1042:    return;
                   1043: }
                   1044: 
                   1045: 
                   1046: /*
                   1047: ================================================================================
                   1048:   Fonction 'smphrdecr'
                   1049: ================================================================================
                   1050:   Entrées :
                   1051: --------------------------------------------------------------------------------
                   1052:   Sorties :
                   1053: --------------------------------------------------------------------------------
                   1054:   Effets de bord : néant
                   1055: ================================================================================
                   1056: */
                   1057: 
                   1058: void
                   1059: instruction_smphrdecr(struct_processus *s_etat_processus)
                   1060: {
                   1061:    struct_objet                *s_objet_argument;
                   1062: 
                   1063:    unsigned char               *tampon;
                   1064: 
                   1065:    (*s_etat_processus).erreur_execution = d_ex;
                   1066: 
                   1067:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1068:    {
                   1069:        printf("\n  SMPHRDECR ");
                   1070: 
                   1071:        if ((*s_etat_processus).langue == 'F')
                   1072:        {
                   1073:            printf("(decrémentation du sémaphore)\n\n");
                   1074:        }
                   1075:        else
                   1076:        {
                   1077:            printf("(semaphore decrementation)\n\n");
                   1078:        }
                   1079: 
                   1080:        printf("    1: %s\n", d_SPH);
                   1081:        return;
                   1082:    }
                   1083:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1084:    {
                   1085:        (*s_etat_processus).nombre_arguments = -1;
                   1086:        return;
                   1087:    }
                   1088:    
                   1089:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1090:    {
                   1091:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1092:        {
                   1093:            return;
                   1094:        }
                   1095:    }
                   1096: 
                   1097:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1098:            &s_objet_argument) == d_erreur)
                   1099:    {
                   1100:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1101:        return;
                   1102:    }
                   1103: 
                   1104:    if ((*s_objet_argument).type == SPH)
                   1105:    {
                   1106:        if ((*s_etat_processus).profilage == d_vrai)
                   1107:        {
                   1108:            if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
                   1109:                    == NULL)
                   1110:            {
                   1111:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1112:                return;
                   1113:            }
                   1114: 
                   1115:            profilage(s_etat_processus, tampon);
                   1116:            free(tampon);
                   1117: 
                   1118:            if ((*s_etat_processus).erreur_systeme != d_es)
                   1119:            {
                   1120:                return;
                   1121:            }
                   1122:        }
                   1123: 
1.48      bertrand 1124: #      ifndef SEMAPHORES_NOMMES
                   1125:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                   1126: #      else
                   1127:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   1128: #      endif
1.1       bertrand 1129:        {
                   1130:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   1131:            return;
                   1132:        }
                   1133: 
                   1134:        while(sem_wait((*((struct_semaphore *) (*s_objet_argument).objet))
                   1135:                .semaphore) == -1)
                   1136:        {
                   1137:            if (errno != EINTR)
                   1138:            {
1.48      bertrand 1139: #              ifndef SEMAPHORES_NOMMES
                   1140:                    sem_post(&((*s_etat_processus).semaphore_fork));
                   1141: #              else
                   1142:                    sem_post((*s_etat_processus).semaphore_fork);
                   1143: #              endif
                   1144: 
1.1       bertrand 1145:                (*s_etat_processus).erreur_execution = d_ex_semaphore;
                   1146: 
                   1147:                if ((*s_etat_processus).profilage == d_vrai)
                   1148:                {
                   1149:                    profilage(s_etat_processus, NULL);
                   1150:                }
                   1151: 
                   1152:                liberation(s_etat_processus, s_objet_argument);
                   1153:                return;
                   1154:            }
                   1155:        }
                   1156: 
1.48      bertrand 1157: #      ifndef SEMAPHORES_NOMMES
                   1158:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   1159: #      else
                   1160:            while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   1161: #      endif
1.1       bertrand 1162:        {
1.47      bertrand 1163:            if (errno != EINTR)
1.1       bertrand 1164:            {
1.47      bertrand 1165:                if ((*s_etat_processus).profilage == d_vrai)
                   1166:                {
                   1167:                    profilage(s_etat_processus, NULL);
                   1168:                }
                   1169: 
                   1170:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1171:                return;
1.44      bertrand 1172:            }
1.1       bertrand 1173:        }
                   1174: 
                   1175:        if ((*s_etat_processus).profilage == d_vrai)
                   1176:        {
                   1177:            profilage(s_etat_processus, NULL);
                   1178:        }
                   1179: 
                   1180:        liberation(s_etat_processus, s_objet_argument);
                   1181:    }
                   1182:    else
                   1183:    {
                   1184:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1185: 
                   1186:        liberation(s_etat_processus, s_objet_argument);
                   1187:        return;
                   1188:    }
                   1189: 
                   1190:    return;
                   1191: }
                   1192: 
                   1193: 
                   1194: /*
                   1195: ================================================================================
                   1196:   Fonction 'smphrtrydecr'
                   1197: ================================================================================
                   1198:   Entrées :
                   1199: --------------------------------------------------------------------------------
                   1200:   Sorties :
                   1201: --------------------------------------------------------------------------------
                   1202:   Effets de bord : néant
                   1203: ================================================================================
                   1204: */
                   1205: 
                   1206: void
                   1207: instruction_smphrtrydecr(struct_processus *s_etat_processus)
                   1208: {
1.58      bertrand 1209:    real8                       partie_entiere;
                   1210: 
                   1211:    struct_objet                *s_objet_argument_1;
                   1212:    struct_objet                *s_objet_argument_2;
1.1       bertrand 1213:    struct_objet                *s_objet_resultat;
                   1214: 
1.58      bertrand 1215:    struct timeval              horodatage;
                   1216: 
                   1217:    struct timespec             horodatage_absolu;
                   1218: 
1.1       bertrand 1219:    unsigned char               *tampon;
                   1220: 
                   1221:    (*s_etat_processus).erreur_execution = d_ex;
                   1222: 
                   1223:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1224:    {
                   1225:        printf("\n  SMPHRTRYDECR ");
                   1226: 
                   1227:        if ((*s_etat_processus).langue == 'F')
                   1228:        {
                   1229:            printf("(essai de decrémentation du sémaphore)\n\n");
                   1230:        }
                   1231:        else
                   1232:        {
                   1233:            printf("(try to decremente semaphore)\n\n");
                   1234:        }
                   1235: 
1.58      bertrand 1236:        printf("    2: %s\n", d_SPH);
                   1237:        printf("    1: %s, %s\n", d_INT, d_REL);
1.1       bertrand 1238:        printf("->  1: %s\n", d_INT);
                   1239:        return;
                   1240:    }
                   1241:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1242:    {
                   1243:        (*s_etat_processus).nombre_arguments = -1;
                   1244:        return;
                   1245:    }
                   1246:    
                   1247:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1248:    {
1.58      bertrand 1249:        if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1.1       bertrand 1250:        {
                   1251:            return;
                   1252:        }
                   1253:    }
                   1254: 
                   1255:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1.58      bertrand 1256:            &s_objet_argument_1) == d_erreur)
                   1257:    {
                   1258:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1259:        return;
                   1260:    }
                   1261: 
                   1262:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1263:            &s_objet_argument_2) == d_erreur)
1.1       bertrand 1264:    {
                   1265:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1266:        return;
                   1267:    }
                   1268: 
1.58      bertrand 1269:    if (((*s_objet_argument_2).type == SPH) && (((*s_objet_argument_1).type
                   1270:            == INT) || ((*s_objet_argument_1).type == REL)))
1.1       bertrand 1271:    {
1.58      bertrand 1272:        gettimeofday(&horodatage, NULL);
                   1273: 
                   1274:        if ((*s_objet_argument_1).type == INT)
                   1275:        {
                   1276:            if ((*((integer8 *) (*s_objet_argument_1).objet)) < 0)
                   1277:            {
                   1278:                (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                   1279: 
                   1280:                liberation(s_etat_processus, s_objet_argument_1);
                   1281:                liberation(s_etat_processus, s_objet_argument_2);
                   1282:                return;
                   1283:            }
                   1284: 
1.72      bertrand 1285:            horodatage.tv_sec += (time_t) (*((integer8 *)
                   1286:                    (*s_objet_argument_1).objet));
1.58      bertrand 1287:        }
                   1288:        else
                   1289:        {
                   1290:            if ((*((real8 *) (*s_objet_argument_1).objet)) < 0)
                   1291:            {
                   1292:                (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                   1293: 
                   1294:                liberation(s_etat_processus, s_objet_argument_1);
                   1295:                liberation(s_etat_processus, s_objet_argument_2);
                   1296:                return;
                   1297:            }
                   1298: 
                   1299:            partie_entiere = floor((*((real8 *) (*s_objet_argument_1).objet)));
1.71      bertrand 1300:            horodatage.tv_sec += (time_t) partie_entiere;
1.59      bertrand 1301:            horodatage.tv_usec += ((suseconds_t) ((*((real8 *)
                   1302:                    (*s_objet_argument_1).objet)) - partie_entiere)) * 1000000;
1.58      bertrand 1303: 
                   1304:            if (horodatage.tv_usec > 1000000)
                   1305:            {
                   1306:                horodatage.tv_usec -= 1000000;
                   1307:                horodatage.tv_sec += 1;
                   1308:            }
                   1309:        }
                   1310: 
                   1311:        horodatage_absolu.tv_sec = horodatage.tv_sec;
                   1312:        horodatage_absolu.tv_nsec = horodatage.tv_usec * 1000;
                   1313: 
1.1       bertrand 1314:        if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
                   1315:        {
                   1316:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1317:            return;
                   1318:        }
                   1319: 
                   1320:        if ((*s_etat_processus).profilage == d_vrai)
                   1321:        {
1.58      bertrand 1322:            if ((tampon = formateur(s_etat_processus, 0, s_objet_argument_2))
1.1       bertrand 1323:                    == NULL)
                   1324:            {
                   1325:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1326:                return;
                   1327:            }
                   1328: 
                   1329:            profilage(s_etat_processus, tampon);
                   1330:            free(tampon);
                   1331: 
                   1332:            if ((*s_etat_processus).erreur_systeme != d_es)
                   1333:            {
                   1334:                return;
                   1335:            }
                   1336:        }
                   1337: 
1.48      bertrand 1338: #      ifndef SEMAPHORES_NOMMES
                   1339:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                   1340: #      else
                   1341:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   1342: #      endif
1.7       bertrand 1343:        {
1.44      bertrand 1344:            if ((*s_etat_processus).profilage == d_vrai)
                   1345:            {
                   1346:                profilage(s_etat_processus, NULL);
                   1347:            }
                   1348: 
1.7       bertrand 1349:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   1350:            return;
                   1351:        }
1.1       bertrand 1352: 
1.58      bertrand 1353:        (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1.1       bertrand 1354: 
1.58      bertrand 1355:        while(sem_timedwait((*((struct_semaphore *) (*s_objet_argument_2)
                   1356:                .objet)).semaphore, &horodatage_absolu) == -1)
1.1       bertrand 1357:        {
                   1358:            switch(errno)
                   1359:            {
                   1360:                case EINTR :
                   1361:                {
                   1362:                    break;
                   1363:                }
                   1364: 
                   1365:                case EINVAL :
                   1366:                {
                   1367:                    (*s_etat_processus).erreur_execution = d_ex_semaphore;
                   1368: 
                   1369:                    if ((*s_etat_processus).profilage == d_vrai)
                   1370:                    {
                   1371:                        profilage(s_etat_processus, NULL);
                   1372:                    }
                   1373: 
1.58      bertrand 1374:                    liberation(s_etat_processus, s_objet_argument_1);
                   1375:                    liberation(s_etat_processus, s_objet_argument_2);
1.1       bertrand 1376:                    return;
                   1377:                }
                   1378: 
1.58      bertrand 1379:                case ETIMEDOUT :
1.1       bertrand 1380:                {
1.58      bertrand 1381:                    (*((integer8 *) (*s_objet_resultat).objet)) = 0;
1.1       bertrand 1382:                    break;
                   1383:                }
                   1384:            }
                   1385: 
1.58      bertrand 1386:            if ((*((integer8 *) (*s_objet_resultat).objet)) == 0)
1.1       bertrand 1387:            {
                   1388:                break;
                   1389:            }
                   1390:        }
                   1391: 
1.48      bertrand 1392: #      ifndef SEMAPHORES_NOMMES
                   1393:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   1394: #      else
                   1395:            while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   1396: #      endif
1.1       bertrand 1397:        {
1.47      bertrand 1398:            if (errno != EINTR)
1.1       bertrand 1399:            {
1.47      bertrand 1400:                if ((*s_etat_processus).profilage == d_vrai)
                   1401:                {
                   1402:                    profilage(s_etat_processus, NULL);
                   1403:                }
                   1404: 
                   1405:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1406:                return;
1.44      bertrand 1407:            }
1.1       bertrand 1408:        }
                   1409: 
                   1410:        if ((*s_etat_processus).profilage == d_vrai)
                   1411:        {
                   1412:            profilage(s_etat_processus, NULL);
                   1413:        }
                   1414: 
1.58      bertrand 1415:        liberation(s_etat_processus, s_objet_argument_1);
                   1416:        liberation(s_etat_processus, s_objet_argument_2);
1.1       bertrand 1417:    }
                   1418:    else
                   1419:    {
                   1420:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1421: 
1.58      bertrand 1422:        liberation(s_etat_processus, s_objet_argument_1);
                   1423:        liberation(s_etat_processus, s_objet_argument_2);
1.1       bertrand 1424:        return;
                   1425:    }
                   1426: 
                   1427:    return;
                   1428: }
                   1429: 
                   1430: 
                   1431: /*
                   1432: ================================================================================
                   1433:   Fonction 'smphrgetv'
                   1434: ================================================================================
                   1435:   Entrées :
                   1436: --------------------------------------------------------------------------------
                   1437:   Sorties :
                   1438: --------------------------------------------------------------------------------
                   1439:   Effets de bord : néant
                   1440: ================================================================================
                   1441: */
                   1442: 
                   1443: void
                   1444: instruction_smphrgetv(struct_processus *s_etat_processus)
                   1445: {
                   1446:    int                         valeur;
                   1447: 
                   1448:    struct_objet                *s_objet_argument;
                   1449:    struct_objet                *s_objet_resultat;
                   1450: 
                   1451:    (*s_etat_processus).erreur_execution = d_ex;
                   1452: 
                   1453:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1454:    {
                   1455:        printf("\n  SMPHRGETV ");
                   1456: 
                   1457:        if ((*s_etat_processus).langue == 'F')
                   1458:        {
                   1459:            printf("(valeur du sémaphore)\n\n");
                   1460:        }
                   1461:        else
                   1462:        {
                   1463:            printf("(semaphore value)\n\n");
                   1464:        }
                   1465: 
                   1466:        printf("    1: %s\n", d_SPH);
                   1467:        return;
                   1468:    }
                   1469:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1470:    {
                   1471:        (*s_etat_processus).nombre_arguments = -1;
                   1472:        return;
                   1473:    }
                   1474:    
                   1475:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1476:    {
                   1477:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1478:        {
                   1479:            return;
                   1480:        }
                   1481:    }
                   1482: 
                   1483:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1484:            &s_objet_argument) == d_erreur)
                   1485:    {
                   1486:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1487:        return;
                   1488:    }
                   1489: 
                   1490:    if ((*s_objet_argument).type == SPH)
                   1491:    {
                   1492:        if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
                   1493:        {
                   1494:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1495: 
                   1496:            liberation(s_etat_processus, s_objet_argument);
                   1497:            return;
                   1498:        }
                   1499: 
                   1500:        if (sem_getvalue((*((struct_semaphore *) (*s_objet_argument).objet))
                   1501:                .semaphore, &valeur) != 0)
                   1502:        {
                   1503:            (*s_etat_processus).erreur_execution = d_ex_semaphore;
                   1504: 
                   1505:            liberation(s_etat_processus, s_objet_argument);
                   1506:            return;
                   1507:        }
                   1508: 
                   1509:        (*((integer8 *) (*s_objet_resultat).objet)) = valeur;
                   1510: 
                   1511:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1512:                s_objet_resultat) == d_erreur)
                   1513:        {
                   1514:            return;
                   1515:        }
                   1516: 
                   1517:        liberation(s_etat_processus, s_objet_argument);
                   1518:    }
                   1519:    else
                   1520:    {
                   1521:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1522: 
                   1523:        liberation(s_etat_processus, s_objet_argument);
                   1524:        return;
                   1525:    }
                   1526: 
                   1527:    return;
                   1528: }
                   1529: 
                   1530: 
                   1531: /*
                   1532: ================================================================================
                   1533:   Fonction 'svl'
                   1534: ================================================================================
                   1535:   Entrées :
                   1536: --------------------------------------------------------------------------------
                   1537:   Sorties :
                   1538: --------------------------------------------------------------------------------
                   1539:   Effets de bord : néant
                   1540: ================================================================================
                   1541: */
                   1542: 
                   1543: void
                   1544: instruction_svl(struct_processus *s_etat_processus)
                   1545: {
                   1546:    struct_objet                *s_objet_argument;
                   1547:    struct_objet                *s_objet_resultat;
                   1548: 
                   1549:    (*s_etat_processus).erreur_execution = d_ex;
                   1550: 
                   1551:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1552:    {
                   1553:        printf("\n  SVL ");
                   1554: 
                   1555:        if ((*s_etat_processus).langue == 'F')
                   1556:        {
                   1557:            printf("(valeurs singulières)\n\n");
                   1558:        }
                   1559:        else
                   1560:        {
                   1561:            printf("(singular values)\n\n");
                   1562:        }
                   1563: 
                   1564:        printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
                   1565:        printf("->  1: %s\n", d_VRL);
                   1566:        return;
                   1567:    }
                   1568:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1569:    {
                   1570:        (*s_etat_processus).nombre_arguments = -1;
                   1571:        return;
                   1572:    }
                   1573:    
                   1574:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1575:    {
                   1576:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1577:        {
                   1578:            return;
                   1579:        }
                   1580:    }
                   1581: 
                   1582:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1583:            &s_objet_argument) == d_erreur)
                   1584:    {
                   1585:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1586:        return;
                   1587:    }
                   1588: 
                   1589:    if (((*s_objet_argument).type == MIN) ||
                   1590:            ((*s_objet_argument).type == MRL) ||
                   1591:            ((*s_objet_argument).type == MCX))
                   1592:    {
                   1593:        if ((s_objet_resultat = allocation(s_etat_processus, VRL)) == NULL)
                   1594:        {
                   1595:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1596:            return;
                   1597:        }
                   1598: 
                   1599:        valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
                   1600:                NULL, (*s_objet_resultat).objet, NULL);
                   1601: 
                   1602:        if ((*s_etat_processus).erreur_systeme != d_es)
                   1603:        {
                   1604:            return;
                   1605:        }
                   1606: 
                   1607:        if (((*s_etat_processus).erreur_execution != d_ex) ||
                   1608:                ((*s_etat_processus).exception != d_ep))
                   1609:        {
                   1610:            liberation(s_etat_processus, s_objet_resultat);
                   1611:            liberation(s_etat_processus, s_objet_argument);
                   1612:            return;
                   1613:        }
                   1614: 
                   1615:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1616:                s_objet_resultat) == d_erreur)
                   1617:        {
                   1618:            return;
                   1619:        }
                   1620:    }
                   1621:    else
                   1622:    {
                   1623:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1624: 
                   1625:        liberation(s_etat_processus, s_objet_argument);
                   1626:        return;
                   1627:    }
                   1628: 
                   1629:    liberation(s_etat_processus, s_objet_argument);
                   1630: 
                   1631:    return;
                   1632: }
                   1633: 
                   1634: 
                   1635: /*
                   1636: ================================================================================
                   1637:   Fonction 'svd'
                   1638: ================================================================================
                   1639:   Entrées :
                   1640: --------------------------------------------------------------------------------
                   1641:   Sorties :
                   1642: --------------------------------------------------------------------------------
                   1643:   Effets de bord : néant
                   1644: ================================================================================
                   1645: */
                   1646: 
                   1647: void
                   1648: instruction_svd(struct_processus *s_etat_processus)
                   1649: {
                   1650:    struct_objet                *s_objet_argument;
                   1651:    struct_objet                *s_objet_resultat_1;
                   1652:    struct_objet                *s_objet_resultat_2;
                   1653:    struct_objet                *s_objet_resultat_3;
                   1654: 
                   1655:    struct_vecteur              s_vecteur;
                   1656: 
1.70      bertrand 1657:    integer8                    i;
                   1658:    integer8                    j;
1.1       bertrand 1659: 
                   1660:    (*s_etat_processus).erreur_execution = d_ex;
                   1661: 
                   1662:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1663:    {
                   1664:        printf("\n  SVD ");
                   1665: 
                   1666:        if ((*s_etat_processus).langue == 'F')
                   1667:        {
                   1668:            printf("(décomposition en valeurs singulières)\n\n");
                   1669:        }
                   1670:        else
                   1671:        {
                   1672:            printf("(singular value decomposition)\n\n");
                   1673:        }
                   1674: 
                   1675:        printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
                   1676:        printf("->  3: %s, %s\n", d_MRL, d_MCX);
                   1677:        printf("    2: %s, %s\n", d_MRL, d_MCX);
                   1678:        printf("    1: %s\n", d_VRL);
                   1679:        return;
                   1680:    }
                   1681:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1682:    {
                   1683:        (*s_etat_processus).nombre_arguments = -1;
                   1684:        return;
                   1685:    }
                   1686:    
                   1687:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1688:    {
                   1689:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1690:        {
                   1691:            return;
                   1692:        }
                   1693:    }
                   1694: 
                   1695:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1696:            &s_objet_argument) == d_erreur)
                   1697:    {
                   1698:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1699:        return;
                   1700:    }
                   1701: 
                   1702:    if (((*s_objet_argument).type == MIN) ||
                   1703:            ((*s_objet_argument).type == MRL))
                   1704:    {
                   1705:        if ((s_objet_resultat_1 = allocation(s_etat_processus, MRL)) == NULL)
                   1706:        {
                   1707:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1708:            return;
                   1709:        }
                   1710: 
                   1711:        if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
                   1712:        {
                   1713:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1714:            return;
                   1715:        }
                   1716: 
                   1717:        if ((s_objet_resultat_3 = allocation(s_etat_processus, MRL)) == NULL)
                   1718:        {
                   1719:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1720:            return;
                   1721:        }
                   1722: 
                   1723:        valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
                   1724:                (*s_objet_resultat_3).objet, &s_vecteur,
                   1725:                (*s_objet_resultat_1).objet);
                   1726: 
                   1727:        if ((*s_etat_processus).erreur_systeme != d_es)
                   1728:        {
                   1729:            return;
                   1730:        }
                   1731: 
                   1732:        if (((*s_etat_processus).erreur_execution != d_ex) ||
                   1733:                ((*s_etat_processus).exception != d_ep))
                   1734:        {
                   1735:            liberation(s_etat_processus, s_objet_resultat_1);
                   1736:            liberation(s_etat_processus, s_objet_resultat_2);
                   1737:            liberation(s_etat_processus, s_objet_resultat_3);
                   1738:            liberation(s_etat_processus, s_objet_argument);
                   1739:            return;
                   1740:        }
                   1741: 
                   1742:        (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
                   1743:                (*((struct_matrice *) (*s_objet_argument).objet))
                   1744:                .nombre_colonnes;
                   1745:        (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
                   1746:                (*((struct_matrice *) (*s_objet_argument).objet))
                   1747:                .nombre_lignes;
                   1748: 
                   1749:        if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
1.70      bertrand 1750:                malloc(((size_t) (*((struct_matrice *) (*s_objet_resultat_2)
                   1751:                .objet)).nombre_lignes) * sizeof(real8 *))) == NULL)
1.1       bertrand 1752:        {
                   1753:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1754:            return;
                   1755:        }
                   1756: 
                   1757:        for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1758:                .nombre_lignes; i++)
                   1759:        {
                   1760:            if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1.70      bertrand 1761:                    .objet)).tableau)[i] = malloc(((size_t)
                   1762:                    (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1763:                    .nombre_colonnes) * sizeof(real8 *))) == NULL)
1.1       bertrand 1764:            {
                   1765:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1766:                return;
                   1767:            }
                   1768: 
                   1769:            for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1770:                    .nombre_colonnes; j++)
                   1771:            {
                   1772:                ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
                   1773:                        .objet)).tableau)[i][j] = 0;
                   1774:            }
                   1775:        }
                   1776: 
                   1777:        for(i = 0; i < s_vecteur.taille; i++)
                   1778:        {
                   1779:            ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1780:                    .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
                   1781:        }
                   1782: 
                   1783:        free(s_vecteur.tableau);
                   1784: 
                   1785:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1786:                s_objet_resultat_3) == d_erreur)
                   1787:        {
                   1788:            return;
                   1789:        }
                   1790: 
                   1791:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1792:                s_objet_resultat_2) == d_erreur)
                   1793:        {
                   1794:            return;
                   1795:        }
                   1796: 
                   1797:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1798:                s_objet_resultat_1) == d_erreur)
                   1799:        {
                   1800:            return;
                   1801:        }
                   1802:    }
                   1803:    else if ((*s_objet_argument).type == MCX)
                   1804:    {
                   1805:        if ((s_objet_resultat_1 = allocation(s_etat_processus, MCX)) == NULL)
                   1806:        {
                   1807:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1808:            return;
                   1809:        }
                   1810: 
                   1811:        if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
                   1812:        {
                   1813:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1814:            return;
                   1815:        }
                   1816: 
                   1817:        if ((s_objet_resultat_3 = allocation(s_etat_processus, MCX)) == NULL)
                   1818:        {
                   1819:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1820:            return;
                   1821:        }
                   1822: 
                   1823:        valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
                   1824:                (*s_objet_resultat_3).objet, &s_vecteur,
                   1825:                (*s_objet_resultat_1).objet);
                   1826: 
                   1827:        if ((*s_etat_processus).erreur_systeme != d_es)
                   1828:        {
                   1829:            return;
                   1830:        }
                   1831: 
                   1832:        if (((*s_etat_processus).erreur_execution != d_ex) ||
                   1833:                ((*s_etat_processus).exception != d_ep))
                   1834:        {
                   1835:            liberation(s_etat_processus, s_objet_resultat_1);
                   1836:            liberation(s_etat_processus, s_objet_resultat_2);
                   1837:            liberation(s_etat_processus, s_objet_resultat_3);
                   1838:            liberation(s_etat_processus, s_objet_argument);
                   1839:            return;
                   1840:        }
                   1841: 
                   1842:        (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
                   1843:                (*((struct_matrice *) (*s_objet_argument).objet))
                   1844:                .nombre_colonnes;
                   1845:        (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
                   1846:                (*((struct_matrice *) (*s_objet_argument).objet))
                   1847:                .nombre_lignes;
                   1848: 
                   1849:        if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
1.70      bertrand 1850:                malloc(((size_t) (*((struct_matrice *) (*s_objet_resultat_2)
                   1851:                .objet)).nombre_lignes) * sizeof(real8 *))) == NULL)
1.1       bertrand 1852:        {
                   1853:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1854:            return;
                   1855:        }
                   1856: 
                   1857:        for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1858:                .nombre_lignes; i++)
                   1859:        {
                   1860:            if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1.70      bertrand 1861:                    .objet)).tableau)[i] = malloc(((size_t)
                   1862:                    (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1863:                    .nombre_colonnes) * sizeof(real8 *))) == NULL)
1.1       bertrand 1864:            {
                   1865:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1866:                return;
                   1867:            }
                   1868: 
                   1869:            for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1870:                    .nombre_colonnes; j++)
                   1871:            {
                   1872:                ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
                   1873:                        .objet)).tableau)[i][j] = 0;
                   1874:            }
                   1875:        }
                   1876: 
                   1877:        for(i = 0; i < s_vecteur.taille; i++)
                   1878:        {
                   1879:            ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1880:                    .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
                   1881:        }
                   1882: 
                   1883:        free(s_vecteur.tableau);
                   1884: 
                   1885:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1886:                s_objet_resultat_3) == d_erreur)
                   1887:        {
                   1888:            return;
                   1889:        }
                   1890: 
                   1891:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1892:                s_objet_resultat_2) == d_erreur)
                   1893:        {
                   1894:            return;
                   1895:        }
                   1896: 
                   1897:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1898:                s_objet_resultat_1) == d_erreur)
                   1899:        {
                   1900:            return;
                   1901:        }
                   1902:    }
                   1903:    else
                   1904:    {
                   1905:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1906: 
                   1907:        liberation(s_etat_processus, s_objet_argument);
                   1908:        return;
                   1909:    }
                   1910: 
                   1911:    liberation(s_etat_processus, s_objet_argument);
                   1912:    return;
                   1913: }
                   1914: 
                   1915: 
                   1916: /*
                   1917: ================================================================================
                   1918:   Fonction 'swapcntxt'
                   1919: ================================================================================
                   1920:   Entrées :
                   1921: --------------------------------------------------------------------------------
                   1922:   Sorties :
                   1923: --------------------------------------------------------------------------------
                   1924:   Effets de bord : néant
                   1925: ================================================================================
                   1926: */
                   1927: 
                   1928: void
                   1929: instruction_swapcntxt(struct_processus *s_etat_processus)
                   1930: {
                   1931:    integer8                    i;
                   1932:    integer8                    registre_taille;
                   1933: 
                   1934:    struct_liste_chainee        *l_element_courant;
                   1935:    struct_liste_chainee        *l_element_courant_taille;
                   1936:    struct_liste_chainee        *registre;
                   1937: 
                   1938:    struct_objet                *s_objet_argument;
                   1939: 
                   1940:    (*s_etat_processus).erreur_execution = d_ex;
                   1941: 
                   1942:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1943:    {
                   1944:        printf("\n  SWAPCNTXT ");
                   1945: 
                   1946:        if ((*s_etat_processus).langue == 'F')
                   1947:        {
                   1948:            printf("(échange de contextes)\n\n");
                   1949:        }
                   1950:        else
                   1951:        {
                   1952:            printf("(swap contexts)\n\n");
                   1953:        }
                   1954: 
                   1955:        printf("    1: %s\n", d_INT);
                   1956:        return;
                   1957:    }
                   1958:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1959:    {
                   1960:        (*s_etat_processus).nombre_arguments = -1;
                   1961:        return;
                   1962:    }
                   1963:    
                   1964:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1965:    {
                   1966:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1967:        {
                   1968:            return;
                   1969:        }
                   1970:    }
                   1971: 
                   1972:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1973:            &s_objet_argument) == d_erreur)
                   1974:    {
                   1975:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1976:        return;
                   1977:    }
                   1978: 
                   1979:    if ((*s_objet_argument).type == INT)
                   1980:    {
                   1981:        l_element_courant = (*s_etat_processus).l_base_pile_contextes;
                   1982:        l_element_courant_taille = (*s_etat_processus)
                   1983:                .l_base_pile_taille_contextes;
                   1984: 
                   1985:        i = (*((integer8 *) (*s_objet_argument).objet));
                   1986: 
                   1987:        while((l_element_courant != NULL) && (l_element_courant_taille != NULL))
                   1988:        {
                   1989:            i--;
                   1990: 
                   1991:            if (i == 0)
                   1992:            {
                   1993:                break;
                   1994:            }
                   1995: 
                   1996:            l_element_courant = (*l_element_courant).suivant;
                   1997:            l_element_courant_taille = (*l_element_courant_taille).suivant;
                   1998:        }
                   1999: 
                   2000:        if ((l_element_courant == NULL) || (l_element_courant_taille == NULL))
                   2001:        {
                   2002:            liberation(s_etat_processus, s_objet_argument);
                   2003: 
                   2004:            (*s_etat_processus).erreur_execution = d_ex_contexte;
                   2005:            return;
                   2006:        }
                   2007: 
                   2008:        if ((*(*l_element_courant).donnee).type != LST)
                   2009:        {
                   2010:            (*s_etat_processus).erreur_systeme = d_es_contexte;
                   2011:            return;
                   2012:        }
                   2013: 
                   2014:        if ((*(*l_element_courant_taille).donnee).type != INT)
                   2015:        {
                   2016:            (*s_etat_processus).erreur_systeme = d_es_contexte;
                   2017:            return;
                   2018:        }
                   2019: 
                   2020:        registre = (*s_etat_processus).l_base_pile;
                   2021:        registre_taille = (*s_etat_processus).hauteur_pile_operationnelle;
                   2022: 
                   2023:        (*s_etat_processus).l_base_pile = (*(*l_element_courant).donnee).objet;
                   2024:        (*s_etat_processus).hauteur_pile_operationnelle =
                   2025:                (*((integer8 *) (*(*l_element_courant_taille).donnee).objet));
                   2026: 
                   2027:        (*(*l_element_courant).donnee).objet = registre;
                   2028:        (*((integer8 *) (*(*l_element_courant_taille).donnee).objet)) =
                   2029:                registre_taille;
                   2030:    }
                   2031:    else
                   2032:    {
                   2033:        liberation(s_etat_processus, s_objet_argument);
                   2034: 
                   2035:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   2036:        return;
                   2037:    }
                   2038: 
                   2039:    liberation(s_etat_processus, s_objet_argument);
                   2040: }
                   2041: 
                   2042: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>