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

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

CVSweb interface <joel.bertrand@systella.fr>