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

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.76      bertrand  411: 
                    412:        if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
                    413:        {
                    414:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    415:            return;
                    416:        }
                    417: 
1.15      bertrand  418:        nanosleep(&attente, NULL);
1.76      bertrand  419: 
                    420:        if (pthread_mutex_lock(&((*s_argument_thread).mutex)) != 0)
                    421:        {
                    422:            (*s_etat_processus).erreur_systeme = d_es_processus;
                    423:            return;
                    424:        }
                    425: 
1.15      bertrand  426:        INCR_GRANULARITE(attente.tv_nsec);
                    427:    }
                    428: 
1.75      bertrand  429:    if (pthread_mutex_unlock(&((*s_argument_thread).mutex)) != 0)
                    430:    {
                    431:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    432:        return;
                    433:    }
                    434: 
1.1       bertrand  435:    if (pthread_attr_destroy(&attributs) != 0)
                    436:    {
                    437:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    438:        return;
                    439:    }
                    440: 
                    441:    if (pthread_attr_init(&attributs) != 0)
                    442:    {
                    443:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    444:        return;
                    445:    }
                    446: 
                    447:    if (pthread_attr_setdetachstate(&attributs,
                    448:            PTHREAD_CREATE_DETACHED) != 0)
                    449:    {
                    450:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    451:        return;
                    452:    }
                    453: 
1.50      bertrand  454: #  ifdef SCHED_OTHER
1.1       bertrand  455:    if (pthread_attr_setschedpolicy(&attributs, SCHED_OTHER) != 0)
                    456:    {
                    457:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    458:        return;
                    459:    }
1.50      bertrand  460: #  endif
1.1       bertrand  461: 
1.50      bertrand  462: #  ifdef PTHREAD_EXPLICIT_SCHED
1.1       bertrand  463:    if (pthread_attr_setinheritsched(&attributs,
                    464:            PTHREAD_EXPLICIT_SCHED) != 0)
                    465:    {
                    466:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    467:        return;
                    468:    }
1.50      bertrand  469: #  endif
1.1       bertrand  470: 
1.50      bertrand  471: #  ifdef PTHREAD_SCOPE_SYSTEM
1.1       bertrand  472:    if (pthread_attr_setscope(&attributs, PTHREAD_SCOPE_SYSTEM) != 0)
                    473:    {
                    474:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    475:        return;
                    476:    }
1.19      bertrand  477: #  endif
1.1       bertrand  478: 
                    479:    /*
                    480:     * On copie l'objet plutôt que le pointeur car cet objet peut être
                    481:     * accédé depuis deux threads distincts et aboutir à un blocage lors d'une
                    482:     * copie.
                    483:     */
                    484: 
                    485:    if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet_resultat, 'O'))
                    486:            == NULL)
                    487:    {
                    488:        (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    489:        return;
                    490:    }
                    491: 
                    492:    if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
                    493:    {
1.46      bertrand  494:        pthread_mutex_unlock(&((*s_nouvel_etat_processus).mutex));
1.1       bertrand  495:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    496:        return;
                    497:    }
                    498: 
                    499:    // Si le tid existe déjà  dans la pile des processus, il s'agit forcement
                    500:    // d'un processus moribond. On attend donc qu'il soit effectivement
                    501:    // libéré.
                    502: 
                    503:    do
                    504:    {
                    505:        l_element_courant = (struct_liste_chainee *)
                    506:                (*s_etat_processus).l_base_pile_processus;
                    507:        drapeau = d_faux;
                    508: 
                    509:        attente.tv_sec = 0;
                    510:        attente.tv_nsec = GRANULARITE_us * 1000;
                    511: 
                    512:        while(l_element_courant != NULL)
                    513:        {
                    514:            if (((*(*((struct_processus_fils *)
                    515:                    (*(*l_element_courant).donnee).objet)).thread)
                    516:                    .processus_detache == d_faux) &&
                    517:                    ((*s_argument_thread).processus_detache == d_faux))
                    518:            {
                    519:                if (pthread_equal((*(*((struct_processus_fils *)
                    520:                        (*(*l_element_courant).donnee).objet)).thread)
                    521:                        .tid, (*s_argument_thread).tid) != 0)
                    522:                {
                    523:                    scrutation_injection(s_etat_processus);
                    524: 
1.78    ! bertrand  525:                    if (pthread_mutex_lock(&((*s_etat_processus)
        !           526:                            .mutex_interruptions)) != 0)
        !           527:                    {
        !           528:                        pthread_mutex_unlock(&((*s_etat_processus).mutex));
        !           529:                        (*s_etat_processus).erreur_systeme = d_es_processus;
        !           530:                        return;
        !           531:                    }
        !           532: 
1.1       bertrand  533:                    if ((*s_etat_processus).nombre_interruptions_non_affectees
                    534:                            != 0)
                    535:                    {
                    536:                        affectation_interruptions_logicielles(s_etat_processus);
                    537:                    }
                    538: 
1.78    ! bertrand  539:                    if (pthread_mutex_unlock(&((*s_etat_processus)
        !           540:                            .mutex_interruptions)) != 0)
        !           541:                    {
        !           542:                        pthread_mutex_unlock(&((*s_etat_processus).mutex));
        !           543:                        (*s_etat_processus).erreur_systeme = d_es_processus;
        !           544:                        return;
        !           545:                    }
        !           546: 
1.1       bertrand  547:                    if ((*s_etat_processus).nombre_interruptions_en_queue != 0)
                    548:                    {
                    549:                        traitement_interruptions_logicielles(s_etat_processus);
                    550:                    }
                    551: 
1.77      bertrand  552:                    if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
                    553:                    {
                    554:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                    555:                        return;
                    556:                    }
                    557: 
1.1       bertrand  558:                    nanosleep(&attente, NULL);
                    559:                    INCR_GRANULARITE(attente.tv_nsec);
                    560: 
                    561:                    if (pthread_mutex_lock(&((*s_etat_processus).mutex)) != 0)
                    562:                    {
                    563:                        (*s_etat_processus).erreur_systeme = d_es_processus;
                    564:                        return;
                    565:                    }
                    566: 
                    567:                    drapeau = d_vrai;
                    568:                    break;
                    569:                }
                    570:            }
                    571: 
1.45      bertrand  572:            scrutation_interruptions(s_etat_processus);
1.1       bertrand  573:            l_element_courant = (*l_element_courant).suivant;
                    574:        }
                    575:    } while(drapeau == d_vrai);
                    576: 
                    577:    if (empilement(s_etat_processus,
                    578:            (struct_liste_chainee **) &((*s_etat_processus)
                    579:            .l_base_pile_processus), s_objet_systeme) == d_erreur)
                    580:    {
                    581:        pthread_mutex_unlock(&((*s_etat_processus).mutex));
                    582:        return;
                    583:    }
                    584: 
                    585:    if (pthread_mutex_unlock(&((*s_etat_processus).mutex)) != 0)
                    586:    {
                    587:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    588:        return;
                    589:    }
                    590: 
                    591:    if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    592:            s_objet_resultat) == d_erreur)
                    593:    {
                    594:        return;
                    595:    }
                    596: 
                    597:    if (pthread_mutex_lock(&(*s_argument_thread).mutex) != 0)
                    598:    {
                    599:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    600:        return;
                    601:    }
                    602: 
                    603:    if ((*s_argument_thread).thread_actif == d_faux)
                    604:    {
                    605:        // Le thread n'existe plus.
                    606: 
                    607:        pthread_join((*s_argument_thread).tid, NULL);
                    608:        pthread_mutex_unlock(&(*s_argument_thread).mutex);
                    609:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    610:        return;
                    611:    }
                    612: 
                    613:    if (pthread_mutex_unlock(&(*s_argument_thread).mutex) != 0)
                    614:    {
                    615:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    616:        return;
                    617:    }
                    618: 
                    619:    // Lancement du thread de surveillance
                    620: 
                    621:    if (pthread_create(&thread_surveillance, &attributs,
                    622:            surveillance_processus, s_argument_thread) != 0)
                    623:    {
                    624:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    625:        return;
                    626:    }
                    627: 
                    628:    if (pthread_attr_destroy(&attributs) != 0)
                    629:    {
                    630:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    631:        return;
                    632:    }
                    633: 
                    634:    // Le fils peut être présent sans être en attente du signal de départ.
                    635: 
1.43      bertrand  636:    if (envoi_signal_thread((*s_argument_thread).tid, rpl_sigstart) != 0)
1.1       bertrand  637:    {
                    638:        (*s_etat_processus).erreur_systeme = d_es_processus;
                    639:        return;
                    640:    }
                    641: 
                    642:    return;
                    643: }
                    644: 
                    645: 
                    646: /*
                    647: ================================================================================
                    648:   Fonction 'sqlconnect'
                    649: ================================================================================
                    650:   Entrées :
                    651: --------------------------------------------------------------------------------
                    652:   Sorties :
                    653: --------------------------------------------------------------------------------
                    654:   Effets de bord : néant
                    655: ================================================================================
                    656: */
                    657: 
                    658: void
                    659: instruction_sqlconnect(struct_processus *s_etat_processus)
                    660: {
                    661:    struct_objet            *s_objet_argument;
                    662:    struct_objet            *s_objet_resultat;
                    663:    struct_objet            *s_objet_systeme;
                    664: 
                    665:    (*s_etat_processus).erreur_execution = d_ex;
                    666: 
                    667:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    668:    {
                    669:        printf("\n  SQLCONNECT ");
                    670: 
                    671:        if ((*s_etat_processus).langue == 'F')
                    672:        {
                    673:            printf("(connexion à une base de données SQL)\n\n");
                    674:        }
                    675:        else
                    676:        {
                    677:            printf("(connect to SQL database)\n\n");
                    678:        }
                    679: 
                    680:        printf("    1: %s\n", d_LST);
                    681:        printf("->  1: %s\n\n", d_SQL);
                    682: 
                    683:        if ((*s_etat_processus).langue == 'F')
                    684:        {
                    685:            printf("  Utilisation :\n\n");
                    686:        }
                    687:        else
                    688:        {
                    689:            printf("  Usage:\n\n");
                    690:        }
                    691: 
                    692:        printf("    { \"mysql\" \"server\" \"database\" "
                    693:                "\"user\" \"password\" } SQLCONNECT\n");
1.67      bertrand  694:        printf("    { \"sqlite\" \"file\" } SQLCONNECT\n");
1.1       bertrand  695:        printf("    { \"postgresql:iso-8859-1\" \"server\" "
                    696:                "\"database\" \"user\" \"password\" port }\n");
                    697:        printf("          SQLCONNECT\n");
                    698: 
                    699:        return;
                    700:    }
                    701:    else if ((*s_etat_processus).test_instruction == 'Y')
                    702:    {
                    703:        (*s_etat_processus).nombre_arguments = -1;
                    704:        return;
                    705:    }
                    706:    
                    707:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    708:    {
                    709:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    710:        {
                    711:            return;
                    712:        }
                    713:    }
                    714: 
                    715:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    716:            &s_objet_argument) == d_erreur)
                    717:    {
                    718:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    719:        return;
                    720:    }
                    721: 
                    722:    if ((*s_objet_argument).type == LST)
                    723:    {
                    724:        if ((s_objet_resultat = parametres_sql(s_etat_processus,
                    725:                s_objet_argument)) == NULL)
                    726:        {
1.56      bertrand  727:            liberation(s_etat_processus, s_objet_resultat);
1.1       bertrand  728:            liberation(s_etat_processus, s_objet_argument);
                    729:            return;
                    730:        }
                    731: 
1.56      bertrand  732:        if ((*s_etat_processus).erreur_execution ==
                    733:                d_ex_instruction_indisponible)
                    734:        {
                    735:            liberation(s_etat_processus, s_objet_resultat);
                    736:            return;
                    737:        }
                    738: 
1.1       bertrand  739:        if ((s_objet_systeme = copie_objet(s_etat_processus, s_objet_resultat,
                    740:                'O')) == NULL)
                    741:        {
                    742:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                    743:            return;
                    744:        }
                    745: 
                    746:        if (empilement(s_etat_processus,
                    747:                (struct_liste_chainee **) &((*s_etat_processus)
                    748:                .s_connecteurs_sql), s_objet_systeme) == d_erreur)
                    749:        {
                    750:            return;
                    751:        }
                    752: 
                    753:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    754:                s_objet_resultat) == d_erreur)
                    755:        {
                    756:            return;
                    757:        }
                    758:    }
                    759:    else
                    760:    {
                    761:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    762: 
                    763:        liberation(s_etat_processus, s_objet_argument);
                    764:        return;
                    765:    }
                    766: 
                    767:    liberation(s_etat_processus, s_objet_argument);
                    768:    return;
                    769: }
                    770: 
                    771: 
                    772: /*
                    773: ================================================================================
1.8       bertrand  774:   Fonction 'sqldisconnect'
1.1       bertrand  775: ================================================================================
                    776:   Entrées :
                    777: --------------------------------------------------------------------------------
                    778:   Sorties :
                    779: --------------------------------------------------------------------------------
                    780:   Effets de bord : néant
                    781: ================================================================================
                    782: */
                    783: 
                    784: void
                    785: instruction_sqldisconnect(struct_processus *s_etat_processus)
                    786: {
                    787:    logical1                drapeau;
                    788: 
                    789:    struct_liste_chainee    *l_element_courant;
                    790:    struct_liste_chainee    *l_element_precedent;
                    791: 
                    792:    struct_objet            *s_objet;
                    793: 
                    794:    (*s_etat_processus).erreur_execution = d_ex;
                    795: 
                    796:    if ((*s_etat_processus).affichage_arguments == 'Y')
                    797:    {
                    798:        printf("\n  SQLDISCONNECT ");
                    799: 
                    800:        if ((*s_etat_processus).langue == 'F')
                    801:        {
                    802:            printf("(déconnexion d'une base de donnée SQL)\n\n");
                    803:        }
                    804:        else
                    805:        {
                    806:            printf("(disconnection from SQL database)\n\n");
                    807:        }
                    808: 
                    809:        printf("    1: %s\n", d_SQL);
                    810:        return;
                    811:    }
                    812:    else if ((*s_etat_processus).test_instruction == 'Y')
                    813:    {
                    814:        (*s_etat_processus).nombre_arguments = -1;
                    815:        return;
                    816:    }
                    817:    
                    818:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                    819:    {
                    820:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                    821:        {
                    822:            return;
                    823:        }
                    824:    }
                    825: 
                    826:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                    827:            &s_objet) == d_erreur)
                    828:    {
                    829:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                    830:        return;
                    831:    }
                    832: 
                    833:    if ((*s_objet).type == SQL)
                    834:    {
                    835:        if (((*((struct_connecteur_sql *) (*s_objet).objet)).pid !=
                    836:                getpid()) || (pthread_equal((*((struct_connecteur_sql *)
                    837:                (*s_objet).objet)).tid, pthread_self()) == 0))
                    838:        {
                    839:            (*s_etat_processus).erreur_execution = d_ex_fichier_hors_contexte;
                    840: 
                    841:            liberation(s_etat_processus, s_objet);
                    842:            return;
                    843:        }
                    844: 
                    845:        l_element_courant = (*s_etat_processus).s_connecteurs_sql;
                    846:        l_element_precedent = NULL;
                    847: 
                    848:        while(l_element_courant != NULL)
                    849:        {
                    850:            if (((*((struct_connecteur_sql *) (*(*l_element_courant).donnee)
                    851:                    .objet)).pid == getpid()) && (pthread_equal(
                    852:                    (*((struct_connecteur_sql *) (*(*l_element_courant).donnee)
                    853:                    .objet)).tid, pthread_self()) != 0) &&
                    854:                    (strcmp((*((struct_connecteur_sql *) (*(*l_element_courant)
                    855:                    .donnee).objet)).type, (*((struct_connecteur_sql *)
                    856:                    (*s_objet).objet)).type) == 0))
                    857:            {
                    858:                if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type,
                    859:                        "MYSQL") == 0)
                    860:                {
                    861: #                  ifdef MYSQL_SUPPORT
1.17      bertrand  862: 
1.1       bertrand  863:                    if ((*((struct_connecteur_sql *) (*(*l_element_courant)
                    864:                            .donnee).objet)).descripteur.mysql ==
                    865:                            (*((struct_connecteur_sql *) (*s_objet).objet))
                    866:                            .descripteur.mysql)
                    867:                    {
                    868:                        drapeau = d_vrai;
                    869:                    }
                    870:                    else
                    871:                    {
                    872:                        drapeau = d_faux;
                    873:                    }
1.17      bertrand  874: 
1.1       bertrand  875: #                  else
                    876: 
                    877:                    if ((*s_etat_processus).langue == 'F')
                    878:                    {
                    879:                        printf("+++Attention : Support de MySQL "
                    880:                                "non compilé !\n");
                    881:                    }
                    882:                    else
                    883:                    {
                    884:                        printf("+++Warning : MySQL support not available !\n");
                    885:                    }
                    886: 
                    887:                    fflush(stdout);
                    888: 
                    889:                    drapeau = d_faux;
                    890: #                  endif
                    891:                }
                    892:                else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet))
                    893:                        .type, "POSTGRESQL") == 0)
                    894:                {
                    895: #                  ifdef POSTGRESQL_SUPPORT
1.17      bertrand  896: 
1.1       bertrand  897:                    if ((*((struct_connecteur_sql *) (*(*l_element_courant)
                    898:                            .donnee).objet)).descripteur.postgresql ==
                    899:                            (*((struct_connecteur_sql *) (*s_objet).objet))
                    900:                            .descripteur.postgresql)
                    901:                    {
                    902:                        drapeau = d_vrai;
                    903:                    }
                    904:                    else
                    905:                    {
                    906:                        drapeau = d_faux;
                    907:                    }
                    908: 
                    909: #                  else
                    910: 
                    911:                    if ((*s_etat_processus).langue == 'F')
                    912:                    {
                    913:                        printf("+++Attention : Support de PostgreSQL "
                    914:                                "non compilé !\n");
                    915:                    }
                    916:                    else
                    917:                    {
                    918:                        printf("+++Warning : PostgreSQL support "
                    919:                                "not available !\n");
                    920:                    }
                    921: 
                    922:                    fflush(stdout);
                    923: 
                    924:                    drapeau = d_faux;
                    925: #                  endif
                    926:                }
1.67      bertrand  927:                else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet))
                    928:                        .type, "SQLITE") == 0)
                    929:                {
                    930:                    if ((*((struct_connecteur_sql *) (*(*l_element_courant)
                    931:                            .donnee).objet)).descripteur.sqlite ==
                    932:                            (*((struct_connecteur_sql *) (*s_objet).objet))
                    933:                            .descripteur.sqlite)
                    934:                    {
                    935:                        drapeau = d_vrai;
                    936:                    }
                    937:                    else
                    938:                    {
                    939:                        drapeau = d_faux;
                    940:                    }
                    941:                }
1.1       bertrand  942:                else
                    943:                {
                    944:                    BUG(1, printf("SQL type '%s' not allowed!",
                    945:                            (*((struct_connecteur_sql *) (*s_objet).objet))
                    946:                            .type));
                    947:                    return;
                    948:                }
                    949: 
                    950:                if (drapeau == d_vrai)
                    951:                {
                    952:                    if (l_element_precedent == NULL)
                    953:                    {
                    954:                        (*s_etat_processus).s_connecteurs_sql =
                    955:                                (*l_element_courant).suivant;
                    956:                    }
                    957:                    else if ((*l_element_courant).suivant == NULL)
                    958:                    {
                    959:                        (*l_element_precedent).suivant = NULL;
                    960:                    }
                    961:                    else
                    962:                    {
                    963:                        (*l_element_precedent).suivant =
                    964:                                (*l_element_courant).suivant;
                    965:                    }
                    966: 
                    967:                    liberation(s_etat_processus, (*l_element_courant).donnee);
                    968:                    free(l_element_courant);
                    969: 
                    970:                    break;
                    971:                }
                    972:            }
                    973: 
                    974:            l_element_precedent = l_element_courant;
                    975:            l_element_courant = (*l_element_courant).suivant;
                    976:        }
                    977: 
                    978:        sqlclose(s_objet);
                    979:    }
                    980:    else
                    981:    {
                    982:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                    983: 
                    984:        liberation(s_etat_processus, s_objet);
                    985:        return;
                    986:    }
                    987: 
                    988:    liberation(s_etat_processus, s_objet);
                    989:    return;
                    990: }
                    991: 
                    992: 
                    993: /*
                    994: ================================================================================
                    995:   Fonction 'smphrincr'
                    996: ================================================================================
                    997:   Entrées :
                    998: --------------------------------------------------------------------------------
                    999:   Sorties :
                   1000: --------------------------------------------------------------------------------
                   1001:   Effets de bord : néant
                   1002: ================================================================================
                   1003: */
                   1004: 
                   1005: void
                   1006: instruction_smphrincr(struct_processus *s_etat_processus)
                   1007: {
                   1008:    struct_objet                *s_objet_argument;
                   1009: 
                   1010:    (*s_etat_processus).erreur_execution = d_ex;
                   1011: 
                   1012:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1013:    {
                   1014:        printf("\n  SMPHRINCR ");
                   1015: 
                   1016:        if ((*s_etat_processus).langue == 'F')
                   1017:        {
                   1018:            printf("(incrémentation du sémaphore)\n\n");
                   1019:        }
                   1020:        else
                   1021:        {
                   1022:            printf("(semaphore incrementation)\n\n");
                   1023:        }
                   1024: 
                   1025:        printf("    1: %s\n", d_SPH);
                   1026:        return;
                   1027:    }
                   1028:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1029:    {
                   1030:        (*s_etat_processus).nombre_arguments = -1;
                   1031:        return;
                   1032:    }
                   1033:    
                   1034:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1035:    {
                   1036:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1037:        {
                   1038:            return;
                   1039:        }
                   1040:    }
                   1041: 
                   1042:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1043:            &s_objet_argument) == d_erreur)
                   1044:    {
                   1045:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1046:        return;
                   1047:    }
                   1048: 
                   1049:    if ((*s_objet_argument).type == SPH)
                   1050:    {
                   1051:        if (sem_post((*((struct_semaphore *) (*s_objet_argument).objet))
                   1052:                .semaphore) != 0)
                   1053:        {
                   1054:            (*s_etat_processus).erreur_execution = d_ex_semaphore;
                   1055: 
                   1056:            liberation(s_etat_processus, s_objet_argument);
                   1057:            return;
                   1058:        }
                   1059: 
                   1060:        liberation(s_etat_processus, s_objet_argument);
                   1061:    }
                   1062:    else
                   1063:    {
                   1064:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1065: 
                   1066:        liberation(s_etat_processus, s_objet_argument);
                   1067:        return;
                   1068:    }
                   1069: 
                   1070:    return;
                   1071: }
                   1072: 
                   1073: 
                   1074: /*
                   1075: ================================================================================
                   1076:   Fonction 'smphrdecr'
                   1077: ================================================================================
                   1078:   Entrées :
                   1079: --------------------------------------------------------------------------------
                   1080:   Sorties :
                   1081: --------------------------------------------------------------------------------
                   1082:   Effets de bord : néant
                   1083: ================================================================================
                   1084: */
                   1085: 
                   1086: void
                   1087: instruction_smphrdecr(struct_processus *s_etat_processus)
                   1088: {
                   1089:    struct_objet                *s_objet_argument;
                   1090: 
                   1091:    unsigned char               *tampon;
                   1092: 
                   1093:    (*s_etat_processus).erreur_execution = d_ex;
                   1094: 
                   1095:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1096:    {
                   1097:        printf("\n  SMPHRDECR ");
                   1098: 
                   1099:        if ((*s_etat_processus).langue == 'F')
                   1100:        {
                   1101:            printf("(decrémentation du sémaphore)\n\n");
                   1102:        }
                   1103:        else
                   1104:        {
                   1105:            printf("(semaphore decrementation)\n\n");
                   1106:        }
                   1107: 
                   1108:        printf("    1: %s\n", d_SPH);
                   1109:        return;
                   1110:    }
                   1111:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1112:    {
                   1113:        (*s_etat_processus).nombre_arguments = -1;
                   1114:        return;
                   1115:    }
                   1116:    
                   1117:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1118:    {
                   1119:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1120:        {
                   1121:            return;
                   1122:        }
                   1123:    }
                   1124: 
                   1125:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1126:            &s_objet_argument) == d_erreur)
                   1127:    {
                   1128:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1129:        return;
                   1130:    }
                   1131: 
                   1132:    if ((*s_objet_argument).type == SPH)
                   1133:    {
                   1134:        if ((*s_etat_processus).profilage == d_vrai)
                   1135:        {
                   1136:            if ((tampon = formateur(s_etat_processus, 0, s_objet_argument))
                   1137:                    == NULL)
                   1138:            {
                   1139:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1140:                return;
                   1141:            }
                   1142: 
                   1143:            profilage(s_etat_processus, tampon);
                   1144:            free(tampon);
                   1145: 
                   1146:            if ((*s_etat_processus).erreur_systeme != d_es)
                   1147:            {
                   1148:                return;
                   1149:            }
                   1150:        }
                   1151: 
1.48      bertrand 1152: #      ifndef SEMAPHORES_NOMMES
                   1153:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                   1154: #      else
                   1155:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   1156: #      endif
1.1       bertrand 1157:        {
                   1158:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   1159:            return;
                   1160:        }
                   1161: 
                   1162:        while(sem_wait((*((struct_semaphore *) (*s_objet_argument).objet))
                   1163:                .semaphore) == -1)
                   1164:        {
                   1165:            if (errno != EINTR)
                   1166:            {
1.48      bertrand 1167: #              ifndef SEMAPHORES_NOMMES
                   1168:                    sem_post(&((*s_etat_processus).semaphore_fork));
                   1169: #              else
                   1170:                    sem_post((*s_etat_processus).semaphore_fork);
                   1171: #              endif
                   1172: 
1.1       bertrand 1173:                (*s_etat_processus).erreur_execution = d_ex_semaphore;
                   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:                return;
                   1182:            }
                   1183:        }
                   1184: 
1.48      bertrand 1185: #      ifndef SEMAPHORES_NOMMES
                   1186:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   1187: #      else
                   1188:            while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   1189: #      endif
1.1       bertrand 1190:        {
1.47      bertrand 1191:            if (errno != EINTR)
1.1       bertrand 1192:            {
1.47      bertrand 1193:                if ((*s_etat_processus).profilage == d_vrai)
                   1194:                {
                   1195:                    profilage(s_etat_processus, NULL);
                   1196:                }
                   1197: 
                   1198:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1199:                return;
1.44      bertrand 1200:            }
1.1       bertrand 1201:        }
                   1202: 
                   1203:        if ((*s_etat_processus).profilage == d_vrai)
                   1204:        {
                   1205:            profilage(s_etat_processus, NULL);
                   1206:        }
                   1207: 
                   1208:        liberation(s_etat_processus, s_objet_argument);
                   1209:    }
                   1210:    else
                   1211:    {
                   1212:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1213: 
                   1214:        liberation(s_etat_processus, s_objet_argument);
                   1215:        return;
                   1216:    }
                   1217: 
                   1218:    return;
                   1219: }
                   1220: 
                   1221: 
                   1222: /*
                   1223: ================================================================================
                   1224:   Fonction 'smphrtrydecr'
                   1225: ================================================================================
                   1226:   Entrées :
                   1227: --------------------------------------------------------------------------------
                   1228:   Sorties :
                   1229: --------------------------------------------------------------------------------
                   1230:   Effets de bord : néant
                   1231: ================================================================================
                   1232: */
                   1233: 
                   1234: void
                   1235: instruction_smphrtrydecr(struct_processus *s_etat_processus)
                   1236: {
1.58      bertrand 1237:    real8                       partie_entiere;
                   1238: 
                   1239:    struct_objet                *s_objet_argument_1;
                   1240:    struct_objet                *s_objet_argument_2;
1.1       bertrand 1241:    struct_objet                *s_objet_resultat;
                   1242: 
1.58      bertrand 1243:    struct timeval              horodatage;
                   1244: 
                   1245:    struct timespec             horodatage_absolu;
                   1246: 
1.1       bertrand 1247:    unsigned char               *tampon;
                   1248: 
                   1249:    (*s_etat_processus).erreur_execution = d_ex;
                   1250: 
                   1251:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1252:    {
                   1253:        printf("\n  SMPHRTRYDECR ");
                   1254: 
                   1255:        if ((*s_etat_processus).langue == 'F')
                   1256:        {
                   1257:            printf("(essai de decrémentation du sémaphore)\n\n");
                   1258:        }
                   1259:        else
                   1260:        {
                   1261:            printf("(try to decremente semaphore)\n\n");
                   1262:        }
                   1263: 
1.58      bertrand 1264:        printf("    2: %s\n", d_SPH);
                   1265:        printf("    1: %s, %s\n", d_INT, d_REL);
1.1       bertrand 1266:        printf("->  1: %s\n", d_INT);
                   1267:        return;
                   1268:    }
                   1269:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1270:    {
                   1271:        (*s_etat_processus).nombre_arguments = -1;
                   1272:        return;
                   1273:    }
                   1274:    
                   1275:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1276:    {
1.58      bertrand 1277:        if (empilement_pile_last(s_etat_processus, 2) == d_erreur)
1.1       bertrand 1278:        {
                   1279:            return;
                   1280:        }
                   1281:    }
                   1282: 
                   1283:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
1.58      bertrand 1284:            &s_objet_argument_1) == d_erreur)
                   1285:    {
                   1286:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1287:        return;
                   1288:    }
                   1289: 
                   1290:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1291:            &s_objet_argument_2) == d_erreur)
1.1       bertrand 1292:    {
                   1293:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1294:        return;
                   1295:    }
                   1296: 
1.58      bertrand 1297:    if (((*s_objet_argument_2).type == SPH) && (((*s_objet_argument_1).type
                   1298:            == INT) || ((*s_objet_argument_1).type == REL)))
1.1       bertrand 1299:    {
1.58      bertrand 1300:        gettimeofday(&horodatage, NULL);
                   1301: 
                   1302:        if ((*s_objet_argument_1).type == INT)
                   1303:        {
                   1304:            if ((*((integer8 *) (*s_objet_argument_1).objet)) < 0)
                   1305:            {
                   1306:                (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                   1307: 
                   1308:                liberation(s_etat_processus, s_objet_argument_1);
                   1309:                liberation(s_etat_processus, s_objet_argument_2);
                   1310:                return;
                   1311:            }
                   1312: 
1.72      bertrand 1313:            horodatage.tv_sec += (time_t) (*((integer8 *)
                   1314:                    (*s_objet_argument_1).objet));
1.58      bertrand 1315:        }
                   1316:        else
                   1317:        {
                   1318:            if ((*((real8 *) (*s_objet_argument_1).objet)) < 0)
                   1319:            {
                   1320:                (*s_etat_processus).erreur_execution = d_ex_argument_invalide;
                   1321: 
                   1322:                liberation(s_etat_processus, s_objet_argument_1);
                   1323:                liberation(s_etat_processus, s_objet_argument_2);
                   1324:                return;
                   1325:            }
                   1326: 
                   1327:            partie_entiere = floor((*((real8 *) (*s_objet_argument_1).objet)));
1.71      bertrand 1328:            horodatage.tv_sec += (time_t) partie_entiere;
1.59      bertrand 1329:            horodatage.tv_usec += ((suseconds_t) ((*((real8 *)
                   1330:                    (*s_objet_argument_1).objet)) - partie_entiere)) * 1000000;
1.58      bertrand 1331: 
                   1332:            if (horodatage.tv_usec > 1000000)
                   1333:            {
                   1334:                horodatage.tv_usec -= 1000000;
                   1335:                horodatage.tv_sec += 1;
                   1336:            }
                   1337:        }
                   1338: 
                   1339:        horodatage_absolu.tv_sec = horodatage.tv_sec;
                   1340:        horodatage_absolu.tv_nsec = horodatage.tv_usec * 1000;
                   1341: 
1.1       bertrand 1342:        if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
                   1343:        {
                   1344:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1345:            return;
                   1346:        }
                   1347: 
                   1348:        if ((*s_etat_processus).profilage == d_vrai)
                   1349:        {
1.58      bertrand 1350:            if ((tampon = formateur(s_etat_processus, 0, s_objet_argument_2))
1.1       bertrand 1351:                    == NULL)
                   1352:            {
                   1353:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1354:                return;
                   1355:            }
                   1356: 
                   1357:            profilage(s_etat_processus, tampon);
                   1358:            free(tampon);
                   1359: 
                   1360:            if ((*s_etat_processus).erreur_systeme != d_es)
                   1361:            {
                   1362:                return;
                   1363:            }
                   1364:        }
                   1365: 
1.48      bertrand 1366: #      ifndef SEMAPHORES_NOMMES
                   1367:            if (sem_post(&((*s_etat_processus).semaphore_fork)) != 0)
                   1368: #      else
                   1369:            if (sem_post((*s_etat_processus).semaphore_fork) != 0)
                   1370: #      endif
1.7       bertrand 1371:        {
1.44      bertrand 1372:            if ((*s_etat_processus).profilage == d_vrai)
                   1373:            {
                   1374:                profilage(s_etat_processus, NULL);
                   1375:            }
                   1376: 
1.7       bertrand 1377:            (*s_etat_processus).erreur_systeme = d_es_processus;
                   1378:            return;
                   1379:        }
1.1       bertrand 1380: 
1.58      bertrand 1381:        (*((integer8 *) (*s_objet_resultat).objet)) = -1;
1.1       bertrand 1382: 
1.58      bertrand 1383:        while(sem_timedwait((*((struct_semaphore *) (*s_objet_argument_2)
                   1384:                .objet)).semaphore, &horodatage_absolu) == -1)
1.1       bertrand 1385:        {
                   1386:            switch(errno)
                   1387:            {
                   1388:                case EINTR :
                   1389:                {
                   1390:                    break;
                   1391:                }
                   1392: 
                   1393:                case EINVAL :
                   1394:                {
                   1395:                    (*s_etat_processus).erreur_execution = d_ex_semaphore;
                   1396: 
                   1397:                    if ((*s_etat_processus).profilage == d_vrai)
                   1398:                    {
                   1399:                        profilage(s_etat_processus, NULL);
                   1400:                    }
                   1401: 
1.58      bertrand 1402:                    liberation(s_etat_processus, s_objet_argument_1);
                   1403:                    liberation(s_etat_processus, s_objet_argument_2);
1.1       bertrand 1404:                    return;
                   1405:                }
                   1406: 
1.58      bertrand 1407:                case ETIMEDOUT :
1.1       bertrand 1408:                {
1.58      bertrand 1409:                    (*((integer8 *) (*s_objet_resultat).objet)) = 0;
1.1       bertrand 1410:                    break;
                   1411:                }
                   1412:            }
                   1413: 
1.58      bertrand 1414:            if ((*((integer8 *) (*s_objet_resultat).objet)) == 0)
1.1       bertrand 1415:            {
                   1416:                break;
                   1417:            }
                   1418:        }
                   1419: 
1.48      bertrand 1420: #      ifndef SEMAPHORES_NOMMES
                   1421:            while(sem_wait(&((*s_etat_processus).semaphore_fork)) != 0)
                   1422: #      else
                   1423:            while(sem_wait((*s_etat_processus).semaphore_fork) != 0)
                   1424: #      endif
1.1       bertrand 1425:        {
1.47      bertrand 1426:            if (errno != EINTR)
1.1       bertrand 1427:            {
1.47      bertrand 1428:                if ((*s_etat_processus).profilage == d_vrai)
                   1429:                {
                   1430:                    profilage(s_etat_processus, NULL);
                   1431:                }
                   1432: 
                   1433:                (*s_etat_processus).erreur_systeme = d_es_processus;
                   1434:                return;
1.44      bertrand 1435:            }
1.1       bertrand 1436:        }
                   1437: 
                   1438:        if ((*s_etat_processus).profilage == d_vrai)
                   1439:        {
                   1440:            profilage(s_etat_processus, NULL);
                   1441:        }
                   1442: 
1.58      bertrand 1443:        liberation(s_etat_processus, s_objet_argument_1);
                   1444:        liberation(s_etat_processus, s_objet_argument_2);
1.1       bertrand 1445:    }
                   1446:    else
                   1447:    {
                   1448:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1449: 
1.58      bertrand 1450:        liberation(s_etat_processus, s_objet_argument_1);
                   1451:        liberation(s_etat_processus, s_objet_argument_2);
1.1       bertrand 1452:        return;
                   1453:    }
                   1454: 
                   1455:    return;
                   1456: }
                   1457: 
                   1458: 
                   1459: /*
                   1460: ================================================================================
                   1461:   Fonction 'smphrgetv'
                   1462: ================================================================================
                   1463:   Entrées :
                   1464: --------------------------------------------------------------------------------
                   1465:   Sorties :
                   1466: --------------------------------------------------------------------------------
                   1467:   Effets de bord : néant
                   1468: ================================================================================
                   1469: */
                   1470: 
                   1471: void
                   1472: instruction_smphrgetv(struct_processus *s_etat_processus)
                   1473: {
                   1474:    int                         valeur;
                   1475: 
                   1476:    struct_objet                *s_objet_argument;
                   1477:    struct_objet                *s_objet_resultat;
                   1478: 
                   1479:    (*s_etat_processus).erreur_execution = d_ex;
                   1480: 
                   1481:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1482:    {
                   1483:        printf("\n  SMPHRGETV ");
                   1484: 
                   1485:        if ((*s_etat_processus).langue == 'F')
                   1486:        {
                   1487:            printf("(valeur du sémaphore)\n\n");
                   1488:        }
                   1489:        else
                   1490:        {
                   1491:            printf("(semaphore value)\n\n");
                   1492:        }
                   1493: 
                   1494:        printf("    1: %s\n", d_SPH);
                   1495:        return;
                   1496:    }
                   1497:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1498:    {
                   1499:        (*s_etat_processus).nombre_arguments = -1;
                   1500:        return;
                   1501:    }
                   1502:    
                   1503:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1504:    {
                   1505:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1506:        {
                   1507:            return;
                   1508:        }
                   1509:    }
                   1510: 
                   1511:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1512:            &s_objet_argument) == d_erreur)
                   1513:    {
                   1514:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1515:        return;
                   1516:    }
                   1517: 
                   1518:    if ((*s_objet_argument).type == SPH)
                   1519:    {
                   1520:        if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
                   1521:        {
                   1522:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1523: 
                   1524:            liberation(s_etat_processus, s_objet_argument);
                   1525:            return;
                   1526:        }
                   1527: 
                   1528:        if (sem_getvalue((*((struct_semaphore *) (*s_objet_argument).objet))
                   1529:                .semaphore, &valeur) != 0)
                   1530:        {
                   1531:            (*s_etat_processus).erreur_execution = d_ex_semaphore;
                   1532: 
                   1533:            liberation(s_etat_processus, s_objet_argument);
                   1534:            return;
                   1535:        }
                   1536: 
                   1537:        (*((integer8 *) (*s_objet_resultat).objet)) = valeur;
                   1538: 
                   1539:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1540:                s_objet_resultat) == d_erreur)
                   1541:        {
                   1542:            return;
                   1543:        }
                   1544: 
                   1545:        liberation(s_etat_processus, s_objet_argument);
                   1546:    }
                   1547:    else
                   1548:    {
                   1549:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1550: 
                   1551:        liberation(s_etat_processus, s_objet_argument);
                   1552:        return;
                   1553:    }
                   1554: 
                   1555:    return;
                   1556: }
                   1557: 
                   1558: 
                   1559: /*
                   1560: ================================================================================
                   1561:   Fonction 'svl'
                   1562: ================================================================================
                   1563:   Entrées :
                   1564: --------------------------------------------------------------------------------
                   1565:   Sorties :
                   1566: --------------------------------------------------------------------------------
                   1567:   Effets de bord : néant
                   1568: ================================================================================
                   1569: */
                   1570: 
                   1571: void
                   1572: instruction_svl(struct_processus *s_etat_processus)
                   1573: {
                   1574:    struct_objet                *s_objet_argument;
                   1575:    struct_objet                *s_objet_resultat;
                   1576: 
                   1577:    (*s_etat_processus).erreur_execution = d_ex;
                   1578: 
                   1579:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1580:    {
                   1581:        printf("\n  SVL ");
                   1582: 
                   1583:        if ((*s_etat_processus).langue == 'F')
                   1584:        {
                   1585:            printf("(valeurs singulières)\n\n");
                   1586:        }
                   1587:        else
                   1588:        {
                   1589:            printf("(singular values)\n\n");
                   1590:        }
                   1591: 
                   1592:        printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
                   1593:        printf("->  1: %s\n", d_VRL);
                   1594:        return;
                   1595:    }
                   1596:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1597:    {
                   1598:        (*s_etat_processus).nombre_arguments = -1;
                   1599:        return;
                   1600:    }
                   1601:    
                   1602:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1603:    {
                   1604:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1605:        {
                   1606:            return;
                   1607:        }
                   1608:    }
                   1609: 
                   1610:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1611:            &s_objet_argument) == d_erreur)
                   1612:    {
                   1613:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1614:        return;
                   1615:    }
                   1616: 
                   1617:    if (((*s_objet_argument).type == MIN) ||
                   1618:            ((*s_objet_argument).type == MRL) ||
                   1619:            ((*s_objet_argument).type == MCX))
                   1620:    {
                   1621:        if ((s_objet_resultat = allocation(s_etat_processus, VRL)) == NULL)
                   1622:        {
                   1623:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1624:            return;
                   1625:        }
                   1626: 
                   1627:        valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
                   1628:                NULL, (*s_objet_resultat).objet, NULL);
                   1629: 
                   1630:        if ((*s_etat_processus).erreur_systeme != d_es)
                   1631:        {
                   1632:            return;
                   1633:        }
                   1634: 
                   1635:        if (((*s_etat_processus).erreur_execution != d_ex) ||
                   1636:                ((*s_etat_processus).exception != d_ep))
                   1637:        {
                   1638:            liberation(s_etat_processus, s_objet_resultat);
                   1639:            liberation(s_etat_processus, s_objet_argument);
                   1640:            return;
                   1641:        }
                   1642: 
                   1643:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1644:                s_objet_resultat) == d_erreur)
                   1645:        {
                   1646:            return;
                   1647:        }
                   1648:    }
                   1649:    else
                   1650:    {
                   1651:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1652: 
                   1653:        liberation(s_etat_processus, s_objet_argument);
                   1654:        return;
                   1655:    }
                   1656: 
                   1657:    liberation(s_etat_processus, s_objet_argument);
                   1658: 
                   1659:    return;
                   1660: }
                   1661: 
                   1662: 
                   1663: /*
                   1664: ================================================================================
                   1665:   Fonction 'svd'
                   1666: ================================================================================
                   1667:   Entrées :
                   1668: --------------------------------------------------------------------------------
                   1669:   Sorties :
                   1670: --------------------------------------------------------------------------------
                   1671:   Effets de bord : néant
                   1672: ================================================================================
                   1673: */
                   1674: 
                   1675: void
                   1676: instruction_svd(struct_processus *s_etat_processus)
                   1677: {
                   1678:    struct_objet                *s_objet_argument;
                   1679:    struct_objet                *s_objet_resultat_1;
                   1680:    struct_objet                *s_objet_resultat_2;
                   1681:    struct_objet                *s_objet_resultat_3;
                   1682: 
                   1683:    struct_vecteur              s_vecteur;
                   1684: 
1.70      bertrand 1685:    integer8                    i;
                   1686:    integer8                    j;
1.1       bertrand 1687: 
                   1688:    (*s_etat_processus).erreur_execution = d_ex;
                   1689: 
                   1690:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1691:    {
                   1692:        printf("\n  SVD ");
                   1693: 
                   1694:        if ((*s_etat_processus).langue == 'F')
                   1695:        {
                   1696:            printf("(décomposition en valeurs singulières)\n\n");
                   1697:        }
                   1698:        else
                   1699:        {
                   1700:            printf("(singular value decomposition)\n\n");
                   1701:        }
                   1702: 
                   1703:        printf("    1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX);
                   1704:        printf("->  3: %s, %s\n", d_MRL, d_MCX);
                   1705:        printf("    2: %s, %s\n", d_MRL, d_MCX);
                   1706:        printf("    1: %s\n", d_VRL);
                   1707:        return;
                   1708:    }
                   1709:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1710:    {
                   1711:        (*s_etat_processus).nombre_arguments = -1;
                   1712:        return;
                   1713:    }
                   1714:    
                   1715:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1716:    {
                   1717:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1718:        {
                   1719:            return;
                   1720:        }
                   1721:    }
                   1722: 
                   1723:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1724:            &s_objet_argument) == d_erreur)
                   1725:    {
                   1726:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   1727:        return;
                   1728:    }
                   1729: 
                   1730:    if (((*s_objet_argument).type == MIN) ||
                   1731:            ((*s_objet_argument).type == MRL))
                   1732:    {
                   1733:        if ((s_objet_resultat_1 = allocation(s_etat_processus, MRL)) == NULL)
                   1734:        {
                   1735:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1736:            return;
                   1737:        }
                   1738: 
                   1739:        if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
                   1740:        {
                   1741:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1742:            return;
                   1743:        }
                   1744: 
                   1745:        if ((s_objet_resultat_3 = allocation(s_etat_processus, MRL)) == NULL)
                   1746:        {
                   1747:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1748:            return;
                   1749:        }
                   1750: 
                   1751:        valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
                   1752:                (*s_objet_resultat_3).objet, &s_vecteur,
                   1753:                (*s_objet_resultat_1).objet);
                   1754: 
                   1755:        if ((*s_etat_processus).erreur_systeme != d_es)
                   1756:        {
                   1757:            return;
                   1758:        }
                   1759: 
                   1760:        if (((*s_etat_processus).erreur_execution != d_ex) ||
                   1761:                ((*s_etat_processus).exception != d_ep))
                   1762:        {
                   1763:            liberation(s_etat_processus, s_objet_resultat_1);
                   1764:            liberation(s_etat_processus, s_objet_resultat_2);
                   1765:            liberation(s_etat_processus, s_objet_resultat_3);
                   1766:            liberation(s_etat_processus, s_objet_argument);
                   1767:            return;
                   1768:        }
                   1769: 
                   1770:        (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
                   1771:                (*((struct_matrice *) (*s_objet_argument).objet))
                   1772:                .nombre_colonnes;
                   1773:        (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
                   1774:                (*((struct_matrice *) (*s_objet_argument).objet))
                   1775:                .nombre_lignes;
                   1776: 
                   1777:        if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
1.70      bertrand 1778:                malloc(((size_t) (*((struct_matrice *) (*s_objet_resultat_2)
                   1779:                .objet)).nombre_lignes) * sizeof(real8 *))) == NULL)
1.1       bertrand 1780:        {
                   1781:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1782:            return;
                   1783:        }
                   1784: 
                   1785:        for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1786:                .nombre_lignes; i++)
                   1787:        {
                   1788:            if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1.70      bertrand 1789:                    .objet)).tableau)[i] = malloc(((size_t)
                   1790:                    (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1791:                    .nombre_colonnes) * sizeof(real8 *))) == NULL)
1.1       bertrand 1792:            {
                   1793:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1794:                return;
                   1795:            }
                   1796: 
                   1797:            for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1798:                    .nombre_colonnes; j++)
                   1799:            {
                   1800:                ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
                   1801:                        .objet)).tableau)[i][j] = 0;
                   1802:            }
                   1803:        }
                   1804: 
                   1805:        for(i = 0; i < s_vecteur.taille; i++)
                   1806:        {
                   1807:            ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1808:                    .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
                   1809:        }
                   1810: 
                   1811:        free(s_vecteur.tableau);
                   1812: 
                   1813:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1814:                s_objet_resultat_3) == d_erreur)
                   1815:        {
                   1816:            return;
                   1817:        }
                   1818: 
                   1819:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1820:                s_objet_resultat_2) == d_erreur)
                   1821:        {
                   1822:            return;
                   1823:        }
                   1824: 
                   1825:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1826:                s_objet_resultat_1) == d_erreur)
                   1827:        {
                   1828:            return;
                   1829:        }
                   1830:    }
                   1831:    else if ((*s_objet_argument).type == MCX)
                   1832:    {
                   1833:        if ((s_objet_resultat_1 = allocation(s_etat_processus, MCX)) == NULL)
                   1834:        {
                   1835:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1836:            return;
                   1837:        }
                   1838: 
                   1839:        if ((s_objet_resultat_2 = allocation(s_etat_processus, MRL)) == NULL)
                   1840:        {
                   1841:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1842:            return;
                   1843:        }
                   1844: 
                   1845:        if ((s_objet_resultat_3 = allocation(s_etat_processus, MCX)) == NULL)
                   1846:        {
                   1847:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1848:            return;
                   1849:        }
                   1850: 
                   1851:        valeurs_singulieres(s_etat_processus, (*s_objet_argument).objet,
                   1852:                (*s_objet_resultat_3).objet, &s_vecteur,
                   1853:                (*s_objet_resultat_1).objet);
                   1854: 
                   1855:        if ((*s_etat_processus).erreur_systeme != d_es)
                   1856:        {
                   1857:            return;
                   1858:        }
                   1859: 
                   1860:        if (((*s_etat_processus).erreur_execution != d_ex) ||
                   1861:                ((*s_etat_processus).exception != d_ep))
                   1862:        {
                   1863:            liberation(s_etat_processus, s_objet_resultat_1);
                   1864:            liberation(s_etat_processus, s_objet_resultat_2);
                   1865:            liberation(s_etat_processus, s_objet_resultat_3);
                   1866:            liberation(s_etat_processus, s_objet_argument);
                   1867:            return;
                   1868:        }
                   1869: 
                   1870:        (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_colonnes =
                   1871:                (*((struct_matrice *) (*s_objet_argument).objet))
                   1872:                .nombre_colonnes;
                   1873:        (*((struct_matrice *) (*s_objet_resultat_2).objet)).nombre_lignes =
                   1874:                (*((struct_matrice *) (*s_objet_argument).objet))
                   1875:                .nombre_lignes;
                   1876: 
                   1877:        if (((*((struct_matrice *) (*s_objet_resultat_2).objet)).tableau =
1.70      bertrand 1878:                malloc(((size_t) (*((struct_matrice *) (*s_objet_resultat_2)
                   1879:                .objet)).nombre_lignes) * sizeof(real8 *))) == NULL)
1.1       bertrand 1880:        {
                   1881:            (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1882:            return;
                   1883:        }
                   1884: 
                   1885:        for(i = 0; i < (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1886:                .nombre_lignes; i++)
                   1887:        {
                   1888:            if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
1.70      bertrand 1889:                    .objet)).tableau)[i] = malloc(((size_t)
                   1890:                    (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1891:                    .nombre_colonnes) * sizeof(real8 *))) == NULL)
1.1       bertrand 1892:            {
                   1893:                (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
                   1894:                return;
                   1895:            }
                   1896: 
                   1897:            for(j = 0; j < (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1898:                    .nombre_colonnes; j++)
                   1899:            {
                   1900:                ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2)
                   1901:                        .objet)).tableau)[i][j] = 0;
                   1902:            }
                   1903:        }
                   1904: 
                   1905:        for(i = 0; i < s_vecteur.taille; i++)
                   1906:        {
                   1907:            ((real8 **) (*((struct_matrice *) (*s_objet_resultat_2).objet))
                   1908:                    .tableau)[i][i] = ((real8 *) (s_vecteur.tableau))[i];
                   1909:        }
                   1910: 
                   1911:        free(s_vecteur.tableau);
                   1912: 
                   1913:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1914:                s_objet_resultat_3) == d_erreur)
                   1915:        {
                   1916:            return;
                   1917:        }
                   1918: 
                   1919:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1920:                s_objet_resultat_2) == d_erreur)
                   1921:        {
                   1922:            return;
                   1923:        }
                   1924: 
                   1925:        if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   1926:                s_objet_resultat_1) == d_erreur)
                   1927:        {
                   1928:            return;
                   1929:        }
                   1930:    }
                   1931:    else
                   1932:    {
                   1933:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   1934: 
                   1935:        liberation(s_etat_processus, s_objet_argument);
                   1936:        return;
                   1937:    }
                   1938: 
                   1939:    liberation(s_etat_processus, s_objet_argument);
                   1940:    return;
                   1941: }
                   1942: 
                   1943: 
                   1944: /*
                   1945: ================================================================================
                   1946:   Fonction 'swapcntxt'
                   1947: ================================================================================
                   1948:   Entrées :
                   1949: --------------------------------------------------------------------------------
                   1950:   Sorties :
                   1951: --------------------------------------------------------------------------------
                   1952:   Effets de bord : néant
                   1953: ================================================================================
                   1954: */
                   1955: 
                   1956: void
                   1957: instruction_swapcntxt(struct_processus *s_etat_processus)
                   1958: {
                   1959:    integer8                    i;
                   1960:    integer8                    registre_taille;
                   1961: 
                   1962:    struct_liste_chainee        *l_element_courant;
                   1963:    struct_liste_chainee        *l_element_courant_taille;
                   1964:    struct_liste_chainee        *registre;
                   1965: 
                   1966:    struct_objet                *s_objet_argument;
                   1967: 
                   1968:    (*s_etat_processus).erreur_execution = d_ex;
                   1969: 
                   1970:    if ((*s_etat_processus).affichage_arguments == 'Y')
                   1971:    {
                   1972:        printf("\n  SWAPCNTXT ");
                   1973: 
                   1974:        if ((*s_etat_processus).langue == 'F')
                   1975:        {
                   1976:            printf("(échange de contextes)\n\n");
                   1977:        }
                   1978:        else
                   1979:        {
                   1980:            printf("(swap contexts)\n\n");
                   1981:        }
                   1982: 
                   1983:        printf("    1: %s\n", d_INT);
                   1984:        return;
                   1985:    }
                   1986:    else if ((*s_etat_processus).test_instruction == 'Y')
                   1987:    {
                   1988:        (*s_etat_processus).nombre_arguments = -1;
                   1989:        return;
                   1990:    }
                   1991:    
                   1992:    if (test_cfsf(s_etat_processus, 31) == d_vrai)
                   1993:    {
                   1994:        if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
                   1995:        {
                   1996:            return;
                   1997:        }
                   1998:    }
                   1999: 
                   2000:    if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
                   2001:            &s_objet_argument) == d_erreur)
                   2002:    {
                   2003:        (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                   2004:        return;
                   2005:    }
                   2006: 
                   2007:    if ((*s_objet_argument).type == INT)
                   2008:    {
                   2009:        l_element_courant = (*s_etat_processus).l_base_pile_contextes;
                   2010:        l_element_courant_taille = (*s_etat_processus)
                   2011:                .l_base_pile_taille_contextes;
                   2012: 
                   2013:        i = (*((integer8 *) (*s_objet_argument).objet));
                   2014: 
                   2015:        while((l_element_courant != NULL) && (l_element_courant_taille != NULL))
                   2016:        {
                   2017:            i--;
                   2018: 
                   2019:            if (i == 0)
                   2020:            {
                   2021:                break;
                   2022:            }
                   2023: 
                   2024:            l_element_courant = (*l_element_courant).suivant;
                   2025:            l_element_courant_taille = (*l_element_courant_taille).suivant;
                   2026:        }
                   2027: 
                   2028:        if ((l_element_courant == NULL) || (l_element_courant_taille == NULL))
                   2029:        {
                   2030:            liberation(s_etat_processus, s_objet_argument);
                   2031: 
                   2032:            (*s_etat_processus).erreur_execution = d_ex_contexte;
                   2033:            return;
                   2034:        }
                   2035: 
                   2036:        if ((*(*l_element_courant).donnee).type != LST)
                   2037:        {
                   2038:            (*s_etat_processus).erreur_systeme = d_es_contexte;
                   2039:            return;
                   2040:        }
                   2041: 
                   2042:        if ((*(*l_element_courant_taille).donnee).type != INT)
                   2043:        {
                   2044:            (*s_etat_processus).erreur_systeme = d_es_contexte;
                   2045:            return;
                   2046:        }
                   2047: 
                   2048:        registre = (*s_etat_processus).l_base_pile;
                   2049:        registre_taille = (*s_etat_processus).hauteur_pile_operationnelle;
                   2050: 
                   2051:        (*s_etat_processus).l_base_pile = (*(*l_element_courant).donnee).objet;
                   2052:        (*s_etat_processus).hauteur_pile_operationnelle =
                   2053:                (*((integer8 *) (*(*l_element_courant_taille).donnee).objet));
                   2054: 
                   2055:        (*(*l_element_courant).donnee).objet = registre;
                   2056:        (*((integer8 *) (*(*l_element_courant_taille).donnee).objet)) =
                   2057:                registre_taille;
                   2058:    }
                   2059:    else
                   2060:    {
                   2061:        liberation(s_etat_processus, s_objet_argument);
                   2062: 
                   2063:        (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
                   2064:        return;
                   2065:    }
                   2066: 
                   2067:    liberation(s_etat_processus, s_objet_argument);
                   2068: }
                   2069: 
                   2070: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>