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

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

CVSweb interface <joel.bertrand@systella.fr>